<?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"
	>

<channel>
	<title>Derek J Entringer Interactive Media/Web Application Developer</title>
	<atom:link href="http://derekentringer.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://derekentringer.com/blog</link>
	<description>PHP/MySQL, Flash, Flash Media Server, Flex</description>
	<pubDate>Sat, 01 Nov 2008 22:16:13 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Flex 3 &#124; Simple FLV Player &#124; Scrubbing, Pause, and Play</title>
		<link>http://derekentringer.com/blog/2008/11/01/flex-3-simple-flv-player-scrubbing-pause-play/</link>
		<comments>http://derekentringer.com/blog/2008/11/01/flex-3-simple-flv-player-scrubbing-pause-play/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 22:11:36 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[flv]]></category>

		<category><![CDATA[pause]]></category>

		<category><![CDATA[play]]></category>

		<category><![CDATA[player]]></category>

		<category><![CDATA[scrub]]></category>

		<category><![CDATA[scrubbing]]></category>

		<category><![CDATA[simple]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=139</guid>
		<description><![CDATA[
Using Flex, it&#8217;s extremely easy to create a simple FLV player. This simple flv player has a scrub bar, pause/play buttons, and can load a flv from any url.




    
        
    
    
       [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
Using Flex, it&#8217;s extremely easy to create a simple FLV player. This simple flv player has a scrub bar, pause/play buttons, and can load a flv from any url.<br />
<br />
<code name="code" class="xml">
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="top" backgroundColor="white" viewSourceURL="srcview/index.html">
    <mx:Script>
        <![CDATA[
            private function formatTime(item:Date):String {
                return dateFormatter.format(item);
            }
            private function videoDisplay_playheadUpdate():void {
                var pT:Number = videoDisplay.playheadTime || 0.1;
                var tT:Number = videoDisplay.totalTime;
                var pTimeMS:Date = new Date(pT * 1000);
                var tTimeMS:Date = new Date(tT * 1000);
                timeLabel.text = formatTime(pTimeMS) + " / " + formatTime(tTimeMS);
            }
            private function slider_thumbPress():void {
                videoDisplay.pause();
            }
            private function slider_thumbRelease():void {
                videoDisplay.playheadTime = slider.value;
                videoDisplay.play();
            }
            private function videoDisplay_ready():void {
                videoDisplay.visible = true;
                controlBar.visible = true;
            }
        ]]&gt;
    </mx:Script>
    <mx:DateFormatter id="dateFormatter" formatString="NN:SS" />
    <mx:Panel title="{videoDisplay.source.split('/').pop()} ({videoDisplay.state})">
        <mx:VideoDisplay id="videoDisplay" visible="false" width="100%" height="100%"
            playheadUpdate="videoDisplay_playheadUpdate()"
            ready="videoDisplay_ready()"
            rewind="videoDisplay.play()"
            source="http://www.derekentringer.com/flv/purple_plasma.flv" />
        <mx:ControlBar id="controlBar" visible="false">
        	<mx:Button id="play" name="play" label="Play" click="videoDisplay.play()"></mx:Button>
        	<mx:Button id="pause" name="pause" label="Pause" click="videoDisplay.pause()"></mx:Button>
            <mx:HSlider id="slider" width="100%"
                allowTrackClick="false"
                invertThumbDirection="true"
                liveDragging="false"
                maximum="{videoDisplay.totalTime}"
                minimum="0"
                thumbPress="slider_thumbPress()"
                thumbRelease="slider_thumbRelease()"
                tickInterval="1"
                value="{videoDisplay.playheadTime}" />
            <mx:Label id="timeLabel" textAlign="right" />
        </mx:ControlBar>
    </mx:Panel>
</mx:Application>
</code>
<a href="http://www.derekentringer.com/flex_simple_flv_player/"  target="_blank">See the example</a><br />
<br />
<a href="http://www.derekentringer.com/downloads/SimpleFLVPlayer.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/SimpleFLVPlayer.zip');">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=139" width="1" height="1" style="display: none;" title="Flex 3 | Simple FLV Player | Scrubbing, Pause, and Play" alt=" Flex 3 | Simple FLV Player | Scrubbing, Pause, and Play" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/11/01/flex-3-simple-flv-player-scrubbing-pause-play/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flash Bandwidth &#038; Port Detection</title>
		<link>http://derekentringer.com/blog/2008/10/29/flash-bandwidth-port-detection/</link>
		<comments>http://derekentringer.com/blog/2008/10/29/flash-bandwidth-port-detection/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 18:42:16 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[bandwidth]]></category>

		<category><![CDATA[calculate]]></category>

		<category><![CDATA[check]]></category>

		<category><![CDATA[detection]]></category>

		<category><![CDATA[port]]></category>

		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=118</guid>
		<description><![CDATA[
Being able to detect a users bandwidth can be an important part of serving them streaming video. Using their bandwidth you can stream a video that will play well using their connection speeds.

The first step is to create our NetConnection.as file. This is used by our bandwidth checking script to connect to our Flash Media [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
Being able to detect a users bandwidth can be an important part of serving them streaming video. Using their bandwidth you can stream a video that will play well using their connection speeds.<br />
<br />
The first step is to create our NetConnection.as file. This is used by our bandwidth checking script to connect to our Flash Media Server via RTMP, select an available port, and talk with our bw_check.asc to report the users available bandwidth.
<code name="code" class="xml">
import mx.events.EventDispatcher;
class NCManager extends Object 
{
	var addEventListener : Function;
	var removeEventListener : Function;
	var dispatchEvent : Function;
	var dispatchQueue : Function;
	private var k_DEFAULTCONNLIST = [
	{
		protocol : "rtmp", port : 1935
	}, 
	{
		protocol : "rtmp", port : 443
	}, 
	{
		protocol : "rtmpt", port : 80
	}, 
	{
		protocol : "rtmps", port : 443
	}];
	private var k_TIMEOUT : Number = 60000;
	private var m_connList : Array;
	private var m_serverName : String;
	private var m_appName : String;
	private var m_streamName : String;
	private var m_connListCounter : Number;
	private var m_flashComConnectTimeOut : Number;
	private var m_validNetConnection : NetConnection;
	function NCManager ()
	{
		trace (&#8221;NCManager initialized&#8221;);
		EventDispatcher.initialize (this);
	}
	function connect (p_serverName : String, p_appName : String, p_connList : Array)
	{
		m_serverName = p_serverName;
		m_appName = p_appName;
		m_connList = (p_connList != undefined) ? p_connList : k_DEFAULTCONNLIST;
		clearInterval (m_flashComConnectTimeOut);
		m_flashComConnectTimeOut = setInterval (this, &#8220;onFlashComConnectTimeOut&#8221;, k_TIMEOUT, k_TIMEOUT);
		for (var i = 0;
		i < m_connList.length;
		i ++)
		{
			this ["nc" + i] = new NetConnection ();
			this ["nc" + i].owner = this;
			this ["nc" + i].connIndex = i;
			this ["nc" + i].onBWDone = function (p_bw)
			{
				this.owner.dispatchEvent (
				{
					type : "ncBandWidth", kbps : p_bw
				});
			};
			this ["nc" + i].onBWCheck = function (counter)
			{
				return ++ counter;
			};
			this ["nc" + i].onStatus = function (info)
			{
				this.pending = false;
				this.owner.m_validNetConnection = this.owner ["nc" + this.connIndex];
				if (info.code == "NetConnection.Connect.Success")
				{
					clearInterval (this.owner.m_flashComConnectTimeOut);
					this.owner.dispatchEvent (
					{
						type : "ncConnected", nc : this.owner.m_validNetConnection, protocol : this.owner.m_connList [this.connIndex].protocol, port : this.owner.m_connList [this.connIndex].port
					});
					for (var i = 0;
					i < this.owner.m_connList.length;
					i ++)
					{
						if (i == this.connIndex)
						{
							continue;
						}
						if (this.owner ["nc" + i].pending)
						{
							clearInterval (this.owner ["ncInt" + i]);
							this.owner ["nc" + i].onStatus = null;
							this.owner ["nc" + i].close ();
							this.owner ["nc" + i] = null;
							delete this.owner ["nc" + i];
						}
					}
				} else 
				{
					trace (this.owner.m_connList [this.connIndex].protocol + ": " + this.owner.m_connList [this.connIndex].port + ", onStatus: " + info.code + " : " + info.description);
				}
			};
			this ["nc" + i].pending = true;
		}
		m_connListCounter = 0;
		nextConnect ();
	}
	function getStreamLength (streamName : String)
	{
		var res = new Object ();
		res.owner = this;
		res.name = streamName;
		res.onResult = function (p_length)
		{
			this.owner.dispatchEvent (
			{
				type : "ncStreamLength", length : p_length, name : res.name
			});
		};
		m_validNetConnection.call ("getStreamLength", res, streamName);
	}
	function getBandWidth (Void) : Void 
	{
		m_validNetConnection.call ("checkBandwidth", null);
	}
	function getActiveConnection (Void) : NetConnection 
	{
		trace(m_validNetConnection == undefined ? null : m_validNetConnection);
		return m_validNetConnection == undefined ? null : m_validNetConnection;
	}
	function closeConnections ()
	{
		trace("CLOSING= "+m_validNetConnection);
		m_validNetConnection.close();
	}
	private function nextConnect (Void) : Void 
	{
		clearInterval (this ["ncInt" + m_connListCounter]);
		this ["nc" + m_connListCounter].connect (m_connList [m_connListCounter].protocol + "://" + m_serverName + ":" + m_connList [m_connListCounter].port + "/" + m_appName);
		if (m_connListCounter < (m_connList.length - 1))
		{
			m_connListCounter ++;
			this ["ncInt" + m_connListCounter] = setInterval (this, "nextConnect", 1500);
		}
	}
	private function onFlashComConnectTimeOut (timeout : Number) : Void 
	{
		clearInterval (m_flashComConnectTimeOut);
		this.dispatchEvent (
		{
			type : "ncFailedToConnect", timeout : timeout
		});
		for (var i = 0;
		i < m_connList.length;
		i ++)
		{
			if (this ["nc" + i].pending)
			{
				clearInterval (this ["ncInt" + i]);
				this ["nc" + i].onStatus = null;
				this ["nc" + i].close ();
				this ["nc" + i] = null;
				delete this ["nc" + i];
			}
		}
	}
}
</code>
The second step is to create our FMS server side code. The bwcheck.asc file sends packets at a size of about 16Kb from the FMS and calculates the response latency over the users network.
<code name="code" class="xml">
application.onConnect = function(p_client, p_autoSenseBW) {
	this.acceptConnection(p_client);
	if (p_autoSenseBW)
		this.calculateClientBw(p_client);
	else
		p_client.call("onBWDone");
}
Client.prototype.getStreamLength = function(p_streamName) {
	return Stream.length(p_streamName);
}
Client.prototype.checkBandwidth = function() {
	application.calculateClientBw(this);
}
application.calculateClientBw = function(p_client) {
	p_client.payload = new Array();
	for (var i=0; i<1200; i++){
		p_client.payload[i] = Math.random();
	}
	var res = new Object();
	res.latency = 0;
	res.cumLatency = 1;
	res.bwTime = 0;
	res.count = 0;
	res.sent = 0;
	res.client = p_client;
	var stats = p_client.getStats();
	var now = (new Date()).getTime()/1;
	res.pakSent = new Array();
	res.pakRecv = new Array();
	res.beginningValues = {b_down:stats.bytes_out, b_up:stats.bytes_in, time:now};
	res.onResult = function(p_val) {
		var now = (new Date()).getTime()/1;
		this.pakRecv[this.count] = now;
		this.count++;
		var timePassed = (now - this.beginningValues.time);
		if (this.count == 1) {
			this.latency = Math.min(timePassed, 800);
			this.latency = Math.max(this.latency, 10);
		}
		if ( this.count == 2 &#038;&#038; (timePassed<2000)) {
			this.pakSent[res.sent++] = now;
			this.cumLatency++;
			this.client.call("onBWCheck", res, this.client.payload);
		} else if ( this.sent == this.count ) {	
			if ( this.latency >= 100 ) { 
				if (  this.pakRecv[1] - this.pakRecv[0] > 1000 ) {
					this.latency = 100;
				}
			}
			delete this.client.payload;
			//got back responses for all the packets compute the bandwidth
			var stats = this.client.getStats();
			var deltaDown = (stats.bytes_out - this.beginningValues.b_down)*8/1000;
			var deltaTime = ((now - this.beginningValues.time) - (this.latency * this.cumLatency) )/1000;
			if ( deltaTime <= 0 )
				deltaTime = (now - this.beginningValues.time)/1000;
			var kbitDown = Math.round(deltaDown/deltaTime);
			trace("onBWDone: kbitDown = " + kbitDown + ", deltaDown= " + deltaDown + ", deltaTime = " + deltaTime + ", latency = " + this.latency + "KBytes " + (stats.bytes_out - this.beginningValues.b_down)/1024) ;
			this.client.call("onBWDone", null, kbitDown,  deltaDown, deltaTime, this.latency );
		}
	}
	res.pakSent[res.sent++] = now;
	p_client.call("onBWCheck", res, "");
	res.pakSent[res.sent++] = now;
	p_client.call("onBWCheck", res, p_client.payload);
}
</code>
Third step. Bring everything together within our flash file, and print our results to text fields on the stage.
<code name="code" class="xml">
stop();
import NCManager;
var ns:NetStream;
var fileName:String;
var k_STARTTIME:Number = getTimer();
var k_SERVERNAME:String = "server_ip_here";
var k_APPNAME:String = "your_app_name_here";
var k_FILENAME_HIGH:String = "you_lowest_compression_flv_name_here";
var k_FILENAME_MED:String = "you_midrange_compression_flv_name_here";
var k_FILENAME_LOW:String = "you_highest_compression_flv_name_here";
var k_ASC_PATH:String = "rtmp://path/to/bwcheck";
globalsound = new Sound(); 
globalsound.setVolume(100);
nc = new NetConnection();
nc.connect(k_ASC_PATH,true);
nc.onStatus = function(info) {
	trace("Level: "+info.level+" Code: "+info.code);
	if (info.code == "NetConnection.Connect.Success") {
		trace("loaded: "+this.uri);
	}
};
NetConnection.prototype.onBWDone = function(p_bw) {
	trace("BANDWIDTH= "+p_bw);
	bandwidth.text = "Bandwidth= "+p_bw
	this.close();
};
NetConnection.prototype.onBWCheck = function() {
	return ++counter;
};
var ncm:NCManager = new NCManager();
var ncmListener:Object = new Object();
ncmListener.ncConnected = function(evt:Object) {
	trace("["+Math.round(getTimer()-k_STARTTIME)+"ms] Successfully connected using &#8220;+evt.protocol+&#8221;:&#8221;+evt.port);
	port.text = &#8220;connected using &#8220;+evt.protocol+&#8221;:&#8221;+evt.port
};
ncmListener.ncFailedToConnect = function(evt:Object) {
	trace(&#8221;Failed to connect after &#8220;+evt.timeout+&#8221; milliseconds.&#8221;);
};
ncmListener.ncStreamLength = function(evt:Object) {
	trace(&#8221;["+Math.round(getTimer()-k_STARTTIME)+"ms] Streamlength of &#8220;+evt.name+&#8221; is &#8220;+evt.length+&#8221; seconds.&#8221;);
};
ncm.addEventListener(&#8221;ncConnected&#8221;,ncmListener);
ncm.addEventListener(&#8221;ncFailedToConnect&#8221;,ncmListener);
ncm.addEventListener(&#8221;ncBandWidth&#8221;,ncmListener);
ncm.addEventListener(&#8221;ncStreamLength&#8221;,ncmListener);
ncm.connect(k_SERVERNAME,k_APPNAME);
</code>
<a href="http://www.derekentringer.com/flash_bandwidth_and_port_detection/"  target="_blank">Click here to see your bandwidth results.</a><br />
<br />
<a href="http://www.derekentringer.com/downloads/flash_bandwidth_and_port_detection.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/flash_bandwidth_and_port_detection.zip');">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=118" width="1" height="1" style="display: none;" title="Flash Bandwidth & Port Detection" alt=" Flash Bandwidth & Port Detection" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/10/29/flash-bandwidth-port-detection/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Use Actionscript to Detect Flash Version</title>
		<link>http://derekentringer.com/blog/2008/10/24/actionscript-detect-flash-version/</link>
		<comments>http://derekentringer.com/blog/2008/10/24/actionscript-detect-flash-version/#comments</comments>
		<pubDate>Fri, 24 Oct 2008 17:37:18 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[actionscript]]></category>

		<category><![CDATA[is]]></category>

		<category><![CDATA[my]]></category>

		<category><![CDATA[version]]></category>

		<category><![CDATA[what]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=111</guid>
		<description><![CDATA[
A friend my mine just asked me how he could find out how to detect his version of flash, so I wrote a quick bit of AS2 to help him out. Here&#8217;s a quick and easy way to detect a users flash version from within your Flash project.

//trace(eval("$version"));
version = eval("$version");
//The operating system: WIN, MAC, LNX
var [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
A friend my mine just asked me how he could find out how to detect his version of flash, so I wrote a quick bit of AS2 to help him out. Here&#8217;s a quick and easy way to detect a users flash version from within your Flash project.<br />
<code name="code" class="xml">
//trace(eval("$version"));
version = eval("$version");
//The operating system: WIN, MAC, LNX
var osType;
//The player versions. 9,0,115,0
var majorVersion; 9
var majorRevision; 0
var minorVersion; 115
var minorRevision; 0
vers.text = version;
osArray = version.split(' ');
osType = osArray[0];
versionArray = osArray[1].split(&#8217;,');
majorVersion = versionArray[0];
majorRevision = versionArray[1];
minorVersion = versionArray[2];
minorRevision = versionArray[3];
feedback.text = &#8220;Operating System: &#8220;+osType + &#8220;\n&#8221; +
	&#8220;Major Version: &#8220;+majorVersion + &#8220;\n&#8221; +
	&#8220;Major Revision: &#8220;+majorRevision + &#8220;\n&#8221; +
	&#8220;Minor Version: &#8220;+minorVersion + &#8220;\n&#8221; +
	&#8220;Minor Revision: &#8220;+minorRevision;
trace(&#8221;Operating System: &#8220;+osType);
trace(&#8221;Major Version: &#8220;+majorVersion);
trace(&#8221;Major Revision: &#8220;+majorRevision);
trace(&#8221;Minor Version: &#8220;+minorVersion);
trace(&#8221;Minor Revision: &#8220;+minorRevision);
</code>
<a href="http://www.derekentringer.com/flash_version_detection/"  target="_blank">Click here to see your version of flash.</a><br />
<br />
<a href="http://www.derekentringer.com/downloads/flash_version_detection.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/flash_version_detection.zip');">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=111" width="1" height="1" style="display: none;" title="Use Actionscript to Detect Flash Version" alt=" Use Actionscript to Detect Flash Version" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/10/24/actionscript-detect-flash-version/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flex Builder: Remove css type selector warnings</title>
		<link>http://derekentringer.com/blog/2008/10/08/flex-builder-remove-css-type-selector-warnings/</link>
		<comments>http://derekentringer.com/blog/2008/10/08/flex-builder-remove-css-type-selector-warnings/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 21:23:39 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[Flex Builder]]></category>

		<category><![CDATA[selector]]></category>

		<category><![CDATA[type]]></category>

		<category><![CDATA[warnings]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=78</guid>
		<description><![CDATA[A small but very irritating problem started coming up during some development I&#8217;ve been working on in Flex. I kept getting errors when compiling in Flex Builder regarding some CSS.
&#8220;The type selector &#8216;classNameHere&#8217; was not processed, because the type was not used in the application.&#8221;
It&#8217;s quite easy to turn this off by going into your [...]]]></description>
			<content:encoded><![CDATA[<p>A small but very irritating problem started coming up during some development I&#8217;ve been working on in Flex. I kept getting errors when compiling in Flex Builder regarding some CSS.</p>
<p>&#8220;The type selector &#8216;classNameHere&#8217; was not processed, because the type was not used in the application.&#8221;</p>
<p>It&#8217;s quite easy to turn this off by going into your project properties panel and select the Flex Compiler option and add the following into Additional compiler options:</p>
<p>-show-unused-type-selector-warnings=false</p>
<p><a href="http://life.neophi.com/danielr/2006/08/" onclick="javascript:pageTracker._trackPageview('/outbound/article/life.neophi.com');" target="_blank">More on this subject here</a></p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=78" width="1" height="1" style="display: none;" title="Flex Builder: Remove css type selector warnings" alt=" Flex Builder: Remove css type selector warnings" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/10/08/flex-builder-remove-css-type-selector-warnings/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHP Developer Best Practices</title>
		<link>http://derekentringer.com/blog/2008/10/08/php-developer-best-practices/</link>
		<comments>http://derekentringer.com/blog/2008/10/08/php-developer-best-practices/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 17:52:04 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[best]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[practices]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=76</guid>
		<description><![CDATA[
Start using version control

Version control is like a big UNDO button for your coding. You can go back to your previous code revisions and can compare/rollback to specific code areas anytime you see necessary. It will keep track of all your changes and will empower you to track your development changes across your work/team. Also, [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
<h3>Start using version control</h3>
<br />
Version control is like a big UNDO button for your coding. You can go back to your previous code revisions and can compare/rollback to specific code areas anytime you see necessary. It will keep track of all your changes and will empower you to track your development changes across your work/team. Also, in a distributed development team, version control helps prevent overwriting of code by team members and keeps all the members code up to date.<br />
<br />
<a href="http://subversion.tigris.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/subversion.tigris.org');" target="_blank">Subversion (SVN)</a> is one of the most popular open source version control system. If you’re on windows platform, you can try <a href="http://tortoisesvn.tigris.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/tortoisesvn.tigris.org');" target="_blank">TortoiseSVN</a>, a client for SVN.<br />

<h3>Use Object Oriented Programming when useful</h3>
<br />
Not surprisingly, object oriented programming is focused around objects. While the idea of objects may be foreign to you in coding terms, understanding what objects are and why we use them shouldn&#8217;t take long. In short, our non-programming world is comprised of objects. Computers, fish, clouds, people, and cars are all objects. Objects have properties like color, size, name, and speed. Objects can also be comprised of other objects: cars have doors; doors have handles; handles have plastic levers; so on and so forth. Objects are everywhere around us. For this reason, many programmers find object oriented programming relatively easy to understand.<br />
<br />
In my opinion any OOP language should have:<br />
<br />
<ul>
    <li>Abstract data types and information hiding</li><br />
    <li>Inheritance</li><br />
    <li>Polymorphism</li><br />
</ul>
This can all be done using PHP classes:<br />
<code name="code" class="xml">
&lt;?php
class Something {
    //classes are usually named starting with a cap letter
    var $x;
    function setX($v) {
        // methods start in lowercase then use lowercase to separate
        // words in the method name example getValueOfArea()
        $this-&gt;x=$v;
    }
    function getX() {
    	return $this-&gt;x;
    }
}
?&gt;
</code>
Of course you can use your own nomenclature but having a standardized one is useful.<br />
<br />
<h3>Use coding standards</h3>
<br />
To develop anything programatically is difficult enough, this is why all programmers must work in an organised and systematic way. It is not obvious but the coding style you employ plays an important role in achieving this goal.<br />
<br />
The idea is very simple: consistent code is much easier to maintain.<br />
<br />
So, here are several reasons why to use coding specifications:<br />
<br />
<ul><br />
    <li>Multi-developer projects require coding standards. Your peer programmers have to understand the code you produce. A coding standard acts as the blueprint for all the team to decipher the code.</li>
    <li>Even if you develop alone it’s advised to adhere to standards, because it really pays off when you revise your code after a time.</li>
    <li>Simplicity and clarity achieved by consistent coding saves you from common mistakes.</li>
    <li>Code becomes extensible and reusable. You don’t have to worry if people working on your current application would understand some reusable feature recycled from the previous project.</li>
     <li>It just looks professional! </li>
</ul>
<h3>Document your code</h3>
<br />
So, why do we really need to document our code? Answer to this question may differ from programmer to programmer, but I strongly feel it helps in debugging, reverse engineering, re-engineering, testing and giving the code a neat look. Moreover, it&#8217;s a step towards standardization of coding methodology. When you document your code using coding standards, you can then use tools such as <a href="http://www.phpdoc.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.phpdoc.org');" target="_blank">phpDocumentor</a> to create professional documentation from your existing php source code.<br />
<br />
<h3>Use php frameworks</h3>
<br />
Frameworks provide structure, and speed development. Some popular PHP frameworks such as Zend Framework, CodeIgniter, CakePHP, Symfony, and Kohana follow the Model-View-Controller (MVC) pattern, which itself is a strong advocate of good coding practice.  They also usually come with a number of helpful libraries to make your life easier as a web developer.<br />
<br />
<h3>Re-use code and libraries</h3>
<br />
Don’t re-invent the wheel. This is the basic concept that should be followed, even though it may seem slightly lazy at times. It actually means that you should not spend much time on solving a problem that has already been solved, in an efficient way, by other programmers. Using already available resources will save you time in your development process.<br />
<br />
If you do end up having to create your  solution from scratch, give back to the community and share what you&#8217;ve accomplished. This is the best part about an open source development community.<br />
<br />
<h3>Professionally test your code</h3>
<br />
PHPUnit and SimpleTest are the two most widely used Unit testing suites for PHP. To make code testing viable, good tool support is needed. This is where PHPUnit comes into play. It is a member of the xUnit family of testing frameworks and provides both a framework that makes the writing of tests easy as well as the functionality to easily run the tests and analyse their results. SimpleTest is an open source unit test framework for the PHP programming language and was created by Marcus Baker. The test structure is similar to JUnit/PHPUnit. SimpleTest supports mock objects and can be used to automate the regression testing of web applications with a scriptable HTTP Client that can parse HTML pages and simulate things like clicking on links and submittings forms.<br />
<br />
<h3>Use an IDE</h3>
<br />
An IDE provides a one-stop shop for your coding work. An IDE contains an editor in which you can edit the code, debug the code, view your code in a browser (often embedded), and check in and out of source code control. To support that functionality, an IDE has a set of features you don&#8217;t find in a basic editor, such as Notepad or Vim. Again, you can extend editors to do a lot of these things, but IDEs have all this functionality in one tidy package and they&#8217;re typically pre-configured.<br />
<br />
Here are a few well put together and widely used IDE&#8217;s.<br />
<ul>
	<li><a href="http://www.eclipse.org/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.eclipse.org');" target="_blank">Eclipse</a></li>
	<li><a href="http://www.activestate.com/Products/komodo_ide/index.mhtml" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.activestate.com');" target="_blank">Komodo</a></li>
	<li><a href="http://www.mpsoftware.dk/phpdesigner.php" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.mpsoftware.dk');" target="_blank">PHP Designer</a></li>
	<li><a href="http://www.nusphere.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.nusphere.com');" target="_blank">PhpED</a></li>
	<li><a href="http://www.phpedit.com/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.phpedit.com');" target="_blank">PHPEdit</a></li>
	<li><a href="http://www.zend.com/en/products/studio/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.zend.com');" target="_blank">Zend Studio</a></li>
</ul>
With so many excellent IDE options out there, some of which are even free, there&#8217;s really no reason not to give one a try, particularly if you&#8217;re a professional.<br /> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=76" width="1" height="1" style="display: none;" title="PHP Developer Best Practices" alt=" PHP Developer Best Practices" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/10/08/php-developer-best-practices/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Zend To Collaborate With Adobe</title>
		<link>http://derekentringer.com/blog/2008/09/25/zend-to-collaborate-with-adobe/</link>
		<comments>http://derekentringer.com/blog/2008/09/25/zend-to-collaborate-with-adobe/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 17:23:40 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[Application]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=72</guid>
		<description><![CDATA[“Since bringing Flex to market, we’ve seen strong uptake among PHP developers, and we’re pleased to be collaborating with Zend and the PHP community to deliver deeper integration and increased productivity,” said David Wadhwani, General Manager, Platform Business Unit at Adobe. “The collaboration with Zend furthers Adobe’s commitment to open technology initiatives. Together, we will [...]]]></description>
			<content:encoded><![CDATA[<p>“Since bringing Flex to market, we’ve seen strong uptake among PHP developers, and we’re pleased to be collaborating with Zend and the PHP community to deliver deeper integration and increased productivity,” said David Wadhwani, General Manager, Platform Business Unit at Adobe. “The collaboration with Zend furthers Adobe’s commitment to open technology initiatives. Together, we will enable developers using Flex and Zend Framework to rapidly deliver highly engaging applications to both the browser and the desktop.” - David Wadhwani, General Manager, Platform Business Unit at Adobe.</p>
<p>This is really exciting, as a PHP/Flex developer, and it&#8217;s going to open even more opportunities for developing and integrating with the two code bases.</p>
<p><a href="http://www.zend.com/en/company/news/Press/zend-to-collaborate-with-adobe" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.zend.com');" target="_blank">Read more here.</a></p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=72" width="1" height="1" style="display: none;" title="Zend To Collaborate With Adobe" alt=" Zend To Collaborate With Adobe" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/09/25/zend-to-collaborate-with-adobe/feed/</wfw:commentRss>
		</item>
		<item>
		<title>AS3 MP3 Player</title>
		<link>http://derekentringer.com/blog/2008/09/05/as3-mp3-player/</link>
		<comments>http://derekentringer.com/blog/2008/09/05/as3-mp3-player/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 16:22:33 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[as3]]></category>

		<category><![CDATA[download]]></category>

		<category><![CDATA[mp3]]></category>

		<category><![CDATA[player]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=70</guid>
		<description><![CDATA[
I have an upcoming project that will require an mp3 player that can load multiple songs, and let users choose which track they would like to listen to. I created this as a test, and will be developing it further for use on the site itself.

The player loads in mp3&#8217;s from an external file based [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
I have an upcoming project that will require an mp3 player that can load multiple songs, and let users choose which track they would like to listen to. I created this as a test, and will be developing it further for use on the site itself.<br />
<br />
The player loads in mp3&#8217;s from an external file based on xml settings.<br />
<br />
Here&#8217;s the actionscript 3 that is involved:<br />
<br />

<code name="code" class="xml">
var getMusic:URLRequest;
var music:Sound = new Sound();
var soundChannel:SoundChannel;
var currentSound:Sound = music;
var pos:Number;
var currentIndex:Number = 0;
var songPlaying:Boolean = false;
var xml:XML;
var songlist:XMLList;
//preloader
function loadProgress(event:ProgressEvent):void {
    var percentLoaded:Number = event.bytesLoaded/event.bytesTotal;
    percentLoaded = Math.round(percentLoaded * 100);
	if(percentLoaded &lt; 20){
		trace("loading");
	} else{
	}
}
function completeHandler(event):void {
    trace("DONE");
}
//load the xml
var loader:URLLoader = new URLLoader(); //create a new URLLoader Object
loader.addEventListener(Event.COMPLETE, whenLoaded); //add an event listener to that object
loader.load(new URLRequest("songs.xml")); //Requests our xml file that contains our song data
function whenLoaded(e:Event):void //WhenLoaded function(see line 50) runs when line 50 is complete
{
	xml = new XML(e.target.data);
	songlist = xml.song; //accesses our song tag in our xml file
	getMusic = new URLRequest(songlist[0].url);//get music from songlist
	music.load(getMusic);//load music
	soundChannel = music.play();//plays the music
	songTXT.text = songlist[0].title; //gets song name from xml
	artistTXT.text = songlist[0].artist; //gets artist name
	albumTXT.text = songlist[0].album;  //gets album name
	soundChannel.addEventListener(Event.SOUND_COMPLETE, nextSong);//runs the next song function when a song completes
}
//add mouse events
next_btn.addEventListener(MouseEvent.CLICK, nextSong);
prev_btn.addEventListener(MouseEvent.CLICK, prevSong);
pause_btn.addEventListener(MouseEvent.CLICK,pauseSong);
/*&#8212;&#8212;&#8211;Skips Songs&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-*/
function nextSong(e:Event):void
{
	if (currentIndex &gt; (songlist.length() - 1))
	{
		currentIndex++;
	}
	else
	{
		currentIndex = 0;
	}
	var nextReq:URLRequest = new URLRequest(songlist[currentIndex].url);
	var nextTitle:Sound = new Sound(nextReq);
	soundChannel.stop();
	songTXT.text = songlist[currentIndex].title;
	artistTXT.text = songlist[currentIndex].artist;
	albumTXT.text = songlist[currentIndex].album;
	soundChannel = nextTitle.play();
	songPlaying = true;
	currentSound = nextTitle;
	soundChannel.addEventListener(Event.SOUND_COMPLETE, nextSong);
}
//manage songs, and load their info
function prevSong(e:Event):void
{
	if (currentIndex &lt; 0)
	{
		currentIndex&#8211;;
	}
	else
	{
		currentIndex = songlist.length() - 1;
	}
	var nextReq:URLRequest = new URLRequest(songlist[currentIndex].url);
	var prevTitle:Sound = new Sound(nextReq);
	soundChannel.stop();
	songTXT.text = songlist[currentIndex].title;
	artistTXT.text = songlist[currentIndex].artist;
	albumTXT.text = songlist[currentIndex].album;
	soundChannel = prevTitle.play();
	songPlaying = true;
	currentSound = prevTitle;
	soundChannel.addEventListener(Event.SOUND_COMPLETE, nextSong);
}
function pauseSong(e:Event):void
{
	pos = soundChannel.position; //pause song at current position
	soundChannel.stop(); //stop sound
	songPlaying = false; // songPlaying is now equal to false
	play_btn.addEventListener(MouseEvent.CLICK,playSong);
}
function playSong(e:Event):void
{
	if(songPlaying == false) //if songplaying is equal to false run function below
	{
		soundChannel = currentSound.play(pos); //play from current position(used if it was paused)
		soundChannel.addEventListener(Event.SOUND_COMPLETE, nextSong);//run nextSong function if current song is complete
		songPlaying = true; //songPlaying is now true
		play_btn.removeEventListener(MouseEvent.CLICK,playSong);
	}
}
</code>
<br />
Here is the xml:<br />
<br />
<code name="code" class="xml">
&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
&lt;ipod&gt;
	&lt;song&gt;
		&lt;title&gt;My Hero&lt;/title&gt;
		&lt;artist&gt;Foo Fighters&lt;/artist&gt;
		&lt;album&gt;The Colour And The Shape&lt;/album&gt;
		&lt;url&gt;songs/Hero.mp3&lt;/url&gt;
	&lt;/song&gt;
	&lt;song&gt;
		&lt;title&gt;Learn To Fly&lt;/title&gt;
		&lt;artist&gt;Foo Fighters&lt;/artist&gt;
		&lt;album&gt;Theres Nothing Left To Lose&lt;/album&gt;
		&lt;url&gt;songs/Fly.mp3&lt;/url&gt;
	&lt;/song&gt;
&lt;/ipod&gt;
</code>
<br />
<a href="http://www.derekentringer.com/downloads/mp3_player.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/mp3_player.zip');">Download the source</a> (Note: The mp3&#8217;s used are not included in the download) <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=70" width="1" height="1" style="display: none;" title="AS3 MP3 Player" alt=" AS3 MP3 Player" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/09/05/as3-mp3-player/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Myspace Flash AS2 RSS Feed Reader</title>
		<link>http://derekentringer.com/blog/2008/08/22/myspace-flash-as2-rss-feed-reader/</link>
		<comments>http://derekentringer.com/blog/2008/08/22/myspace-flash-as2-rss-feed-reader/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 18:14:53 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Myspace]]></category>

		<category><![CDATA[SEO]]></category>

		<category><![CDATA[as2]]></category>

		<category><![CDATA[feed]]></category>

		<category><![CDATA[reader]]></category>

		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=68</guid>
		<description><![CDATA[
A very simple RSS feed reader that displays links off to your blog created using Actionscript 2.

stop();
//create the xml object
xmlLoad = new XML();
xmlLoad.load(_root.feed);
xmlLoad.ignoreWhite = true;
xmlLoad.onLoad = function(success){
	//if successful
	if(success &#038;&#038; xmlLoad.status == 0){
		//reset the text
		xml_text="";
		//list of items
		var xmlItems:XML = xmlLoad.firstChild.firstChild;
		for (var m = 0; m&#60;xmlItems.childNodes.length; m++) {
			//grab each item
			if (xmlItems.childNodes[m].nodeName == &#8220;item&#8221;) {
				for (var n = [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
A very simple RSS feed reader that displays links off to your blog created using Actionscript 2.<br />
<code name="code" class="xml">
stop();
//create the xml object
xmlLoad = new XML();
xmlLoad.load(_root.feed);
xmlLoad.ignoreWhite = true;
xmlLoad.onLoad = function(success){
	//if successful
	if(success &#038;&#038; xmlLoad.status == 0){
		//reset the text
		xml_text="";
		//list of items
		var xmlItems:XML = xmlLoad.firstChild.firstChild;
		for (var m = 0; m&lt;xmlItems.childNodes.length; m++) {
			//grab each item
			if (xmlItems.childNodes[m].nodeName == &#8220;item&#8221;) {
				for (var n = 0; n&lt;xmlItems.childNodes[m].childNodes.length; n++) {
					if (xmlItems.childNodes[m].childNodes[n].nodeName == &#8220;link&#8221;) {
						//grab the link of the item
						itemlink=xmlItems.childNodes[m].childNodes[n].firstChild.toString();
					}
					if (xmlItems.childNodes[m].childNodes[n].nodeName == &#8220;title&#8221;) {
						//grab the title of the item
						itemtitle=xmlItems.childNodes[m].childNodes[n].firstChild.toString();
					}
				}
				//add the current item
				xml_text+= &#8220;&lt;a href=\&#8221;"+itemlink+&#8221;\&#8221;&gt;&#8221;+itemtitle+&#8221;&lt;/a&gt;&lt;br&gt;&lt;br&gt;&#8221;;
			}
		}
	}
	//set the text
	xml_holder.text = xml_text;
}
</code>
The only library item needed is a TextArea component, placed on the stage with an instance name of &#8220;xml_holder&#8221;.<br />
<br />
In order to embed and display this on your Myspace page (or anywhere really) you only need the following code:<br />
<code name="code" class="xml">
&lt;object data="http://www.derekentringer.com/downloads/xml_reader/xml_reader.swf?feed=http://www.derekentringer.com/blog/feed/" type="application/x-shockwave-flash" width="300" height="450"&gt;&lt;param name="movie" value="http://www.derekentringer.com/downloads/xml_reader/xml_reader.swf?feed=http://www.derekentringer.com/blog/feed/"/&gt;&lt;/object&gt;<br />
</code>
Be sure to change the &#8220;?feed&#8221; variable to the url of your own RSS feed.<br />
<br />
<a href="http://www.derekentringer.com/downloads/xml_reader/xml_reader.html"  target="_blank">Click here for a preview</a><br />
<br />
<a href="http://www.derekentringer.com/downloads/xml_reader.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/xml_reader.zip');" target="_blank">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=68" width="1" height="1" style="display: none;" title="Myspace Flash AS2 RSS Feed Reader" alt=" Myspace Flash AS2 RSS Feed Reader" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/22/myspace-flash-as2-rss-feed-reader/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BorrisPowell.com Fashion Couture</title>
		<link>http://derekentringer.com/blog/2008/08/22/borrispowellcom-fashion-couture/</link>
		<comments>http://derekentringer.com/blog/2008/08/22/borrispowellcom-fashion-couture/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 04:52:58 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[New Developments]]></category>

		<category><![CDATA[actionscript 3]]></category>

		<category><![CDATA[borris]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[papervision3d]]></category>

		<category><![CDATA[powell]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=63</guid>
		<description><![CDATA[With the inspirations of Borris Powell, I would like to announce the launch of BorrisPowell.com.
From the site:
&#8220;Luxury in women&#8217;s fashion has a new name—Borris Powell. Born in Alabama, the passionate designer developed his dreams of a career in women&#8217;s fashion early on in life. Throughout his childhood, while observing his mother preparing for a night [...]]]></description>
			<content:encoded><![CDATA[<p>With the inspirations of Borris Powell, I would like to announce the launch of <a href="http://www.borrispowell.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.borrispowell.com');" target="_blank">BorrisPowell.com</a>.</p>
<p>From the site:</p>
<p>&#8220;<em>Luxury in women&#8217;s fashion has a new name—Borris Powell. Born in Alabama, the passionate designer developed his dreams of a career in women&#8217;s fashion early on in life. Throughout his childhood, while observing his mother preparing for a night out on the town or even a Sunday visit to church, he trained his young eyes on color and silhouette. This is how his lifelong dream began. He would often advise her on style choices and then, while everyone one was away, he would sneak into the living room to the play with the sewing machine and develop his craft.</p>
<p>Inspired by the masterful shapes of Christian Dior, Powell followed his dreams and moved to Chicago to start his design career in 1997. Over the following decade, at the consistent urge of his friends, he pursued his vision with an infectious entrepreneurial talent and creativity that has built him a devoted following of fans. His trademark silhouettes have the comforting familiarity of his early authentic family memories mixed with a chic nod to high-end city life.</em>&#8220;</p>
<p>BorrisPowell.com combines high end fashion with high end web design and development.</p>
<p>The site was created using AS3 and all that Papervision3d has to offer in terms of custom image galleries, created by <a href="htp://www.derekentringer.com"  target="_blank">DerekEntringer.com</a></p>
<p>Visit the site at <a href="http://www.borrispowell.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.borrispowell.com');" target="_blank">BorrisPowell.com</a></p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=63" width="1" height="1" style="display: none;" title="BorrisPowell.com Fashion Couture" alt=" BorrisPowell.com Fashion Couture" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/22/borrispowellcom-fashion-couture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>.htaccess and SEO</title>
		<link>http://derekentringer.com/blog/2008/08/21/htaccess-and-seo/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/htaccess-and-seo/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 21:52:53 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[301]]></category>

		<category><![CDATA[htaccess]]></category>

		<category><![CDATA[links]]></category>

		<category><![CDATA[redirect]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=59</guid>
		<description><![CDATA[Inbound Links
A .htaccess file can be an SEO&#8217;s vital friend. When visitors hit your site with either www.yourdomain.com or yourdomain.com, it splits your inbound links into two separate pages. This can have effects on your Google Page Rank. By correctly creating and implementing a .htaccess file at your server root, you can improve your website [...]]]></description>
			<content:encoded><![CDATA[<p><b>Inbound Links</b></p>
<p>A .htaccess file can be an SEO&#8217;s vital friend. When visitors hit your site with either www.yourdomain.com or yourdomain.com, it splits your inbound links into two separate pages. This can have effects on your Google Page Rank. By correctly creating and implementing a .htaccess file at your server root, you can improve your website ranking.</p>
<p>To change the url in the browser before the page loads you can use two different methods.</p>
<p>Here, the url will always contain the www. before the domain name:</p>
<p>RewriteCond %{HTTP_HOST} .<br />
RewriteCond %{HTTP_HOST} !^www\.derekentringer\.com [NC]<br />
RewriteRule (.*) http://www.derekentringer.com/$1 [R=301,L]</p>
<p>Here, you can take the www. away:</p>
<p>RewriteCond %{HTTP_HOST} .<br />
RewriteCond %{HTTP_HOST} !^www\.derekentringer\.com [NC]<br />
RewriteRule (.*) http://derekentringer.com/$1 [R=301,L]</p>
<p>By deciding which of these ways of keeping your inbound links will work best, you can improve your search engine results.</p>
<p>
<b>301 Redirects</b></p>
<p>Redirect 301 / http://www.yournewdomain.com/</p>
<p>The above code is to be used when pointing multiple domain names to one domain (the main site) . This is often done by businesses wishing to protect their trademark by purchasing similar names and various top level domain names (TLD) for their company. This is also good for companies wishing to capture type in traffic of users who type keywords straight into the toolbars or their url area of the browser.</p>
<p>By using both of these methods, you can keep a tight seal around all of your inbound links, improve your SEO and Google Page Rank, and keep the files on your server more organized.</p>
<p>
<b>Keep Directory Index File Name Out of Your URL</b></p>
<p>Sometimes it just looks nicer to not have a url such as http://www.derekentringer.com/index.php. All we want is http://www.derekentringer.com.<br />
Using your .htaccess you can eliminate it easily. You can also specify any directories that you might not want it to parse out the index file.</p>
<p># Main Index exclude<br />
DirectoryIndex index.php<br />
RewriteCond $1 !^(index\.php|robots\.txt)<br />
RewriteCond %{REQUEST_URI} !^/DirectoryYouDoNotWantChangedHere<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteRule ^(.*)$ index.php/$1 [L,QSA]</p>
<p>Now, there will never be an index file listed in the url, except for the directory &#8220;DirectoryYouDoNotWantChangedHere&#8221;.</p>
<p>
<b>Error Document Redirects</b></p>
<p>Instead of using a Control Panel to process redirects, you can use your .htaccess file. These links can either be redirected to your home page, or you can setup an error document.</p>
<p># Handle Errors<br />
ErrorDocument 100 http://www.derekentringer.com<br />
ErrorDocument 101 http://www.derekentringer.com<br />
ErrorDocument 102 http://www.derekentringer.com<br />
# 2xx<br />
ErrorDocument 200 http://www.derekentringer.com<br />
ErrorDocument 201 http://www.derekentringer.com<br />
ErrorDocument 202 http://www.derekentringer.com<br />
ErrorDocument 203 http://www.derekentringer.com<br />
ErrorDocument 204 http://www.derekentringer.com<br />
ErrorDocument 205 http://www.derekentringer.com<br />
ErrorDocument 206 http://www.derekentringer.com<br />
ErrorDocument 207 http://www.derekentringer.com<br />
# 4xx<br />
ErrorDocument 400 http://www.derekentringer.com<br />
ErrorDocument 401 http://www.derekentringer.com<br />
ErrorDocument 402 http://www.derekentringer.com<br />
ErrorDocument 403 http://www.derekentringer.com<br />
ErrorDocument 404 http://www.derekentringer.com<br />
ErrorDocument 405 http://www.derekentringer.com<br />
ErrorDocument 406 http://www.derekentringer.com<br />
ErrorDocument 407 http://www.derekentringer.com<br />
ErrorDocument 408 http://www.derekentringer.com<br />
ErrorDocument 409 http://www.derekentringer.com<br />
ErrorDocument 410 http://www.derekentringer.com<br />
ErrorDocument 411 http://www.derekentringer.com<br />
ErrorDocument 412 http://www.derekentringer.com<br />
ErrorDocument 413 http://www.derekentringer.com<br />
ErrorDocument 414 http://www.derekentringer.com<br />
ErrorDocument 415 http://www.derekentringer.com<br />
ErrorDocument 416 http://www.derekentringer.com<br />
ErrorDocument 417 http://www.derekentringer.com<br />
ErrorDocument 418 http://www.derekentringer.com<br />
ErrorDocument 419 http://www.derekentringer.com<br />
ErrorDocument 420 http://www.derekentringer.com<br />
ErrorDocument 421 http://www.derekentringer.com<br />
ErrorDocument 422 http://www.derekentringer.com<br />
ErrorDocument 423 http://www.derekentringer.com<br />
ErrorDocument 424 http://www.derekentringer.com<br />
ErrorDocument 425 http://www.derekentringer.com<br />
ErrorDocument 426 http://www.derekentringer.com<br />
# 5xx<br />
ErrorDocument 500 http://www.derekentringer.com<br />
ErrorDocument 501 http://www.derekentringer.com<br />
ErrorDocument 502 http://www.derekentringer.com<br />
ErrorDocument 503 http://www.derekentringer.com<br />
ErrorDocument 504 http://www.derekentringer.com<br />
ErrorDocument 505 http://www.derekentringer.com<br />
ErrorDocument 506 http://www.derekentringer.com<br />
ErrorDocument 507 http://www.derekentringer.com<br />
ErrorDocument 508 http://www.derekentringer.com<br />
ErrorDocument 509 http://www.derekentringer.com<br />
ErrorDocument 510 http://www.derekentringer.com</p>
<p>
<b>Alternate to ErrorDocument</b></p>
<p>Instead of listing out all of the error types, you can also use the much shorter version:</p>
<p>### ALTERNATIVE TO USING ERRORDOCUMENT ###<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteRule ^.*$ /error.php [L]</p>
<p>This will push all of your errors to a single page.</p>
<p>
That&#8217;s really just the beginning of what the .htaccess file is capable of, as it has an extensive set of capabilities.</p>
<p><a href="http://httpd.apache.org/docs/1.3/howto/htaccess.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/httpd.apache.org');" target="_blank">Read more about them here.</a></p>
<p><a href="http://www.derekentringer.com/downloads/htaccess.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/htaccess.zip');">Download a sample .htaccess file</a></p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=59" width="1" height="1" style="display: none;" title=".htaccess and SEO" alt=" .htaccess and SEO" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/htaccess-and-seo/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flex File Browser - PDF, Images, and Video Player</title>
		<link>http://derekentringer.com/blog/2008/08/21/flex-file-browser/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/flex-file-browser/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 18:09:07 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flex]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[browser]]></category>

		<category><![CDATA[file]]></category>

		<category><![CDATA[mxml]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=53</guid>
		<description><![CDATA[
Flex has a lot to offer when it comes to file manipulation and viewing/interaction. The AIR environment is perfect for an &#8220;explorer&#8221; type application.

Here&#8217;s a quick file browser in Flex:

&#60;?xml version="1.0" encoding="utf-8"?&#62;
&#60;mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="1044" height="800" currentState="videoState" creationComplete="init()"&#62;
	&#60;mx:Style source="assets/css/styles.css" /&#62;
	&#60;mx:Script&#62;
		&#60;![CDATA[
			import mx.core.UIComponent;
			import mx.controls.Alert;
			import flash.html.HTMLLoader;
			import flash.net.URLRequest;
			import mx.events.MenuEvent;
           [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
Flex has a lot to offer when it comes to file manipulation and viewing/interaction. The AIR environment is perfect for an &#8220;explorer&#8221; type application.<br />
<br />
Here&#8217;s a quick file browser in Flex:<br />
<code name="code" class="xml">
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="1044" height="800" currentState="videoState" creationComplete="init()"&gt;
	&lt;mx:Style source="assets/css/styles.css" /&gt;
	&lt;mx:Script&gt;
		&lt;![CDATA[
			import mx.core.UIComponent;
			import mx.controls.Alert;
			import flash.html.HTMLLoader;
			import flash.net.URLRequest;
			import mx.events.MenuEvent;
            import mx.collections.*;
			[Bindable]
            public var menuBarCollection:XMLListCollection;
            private var menubarXML:XMLList =
                &lt;&gt;
                    &lt;menuitem label=&#8221;File&#8221; data=&#8221;top&#8221;&gt;
                        &lt;menuitem label=&#8221;Browse&#8221; data=&#8221;browse_files&#8221;/&gt;
                    &lt;/menuitem&gt;
                &lt;/&gt;;
            private function menuHandler(event:MenuEvent):void  {
                if (event.item.@data != &#8220;top&#8221;) {
                    if(event.item.@data == &#8220;browse_files&#8221;){
                    	browseDir(event);
                    }
                }        
            }
			if(HTMLLoader.pdfCapability == HTMLPDFCapability.STATUS_OK) {
				trace(&#8221;PDF content can be displayed&#8221;);
			}else {
				trace(&#8221;PDF cannot be displayed. Error code:&#8221;, HTMLLoader.pdfCapability);
			}
			private function init():void{
				fileSystemTree.directory = File.desktopDirectory;
            	menuBarCollection = new XMLListCollection(menubarXML);
			}
			private function browseDir(e:Event):void{
				var dir:File = new File();
				dir.browseForDirectory(&#8221;Select directory&#8221;);
				dir.addEventListener(Event.SELECT, onDirSelect);
			}
			private function onDirSelect(event:Event):void{
				fileSystemTree.directory = event.currentTarget as File;
			}
			private function onChange(e:Event):void{
				var file:File = e.currentTarget.selectedItem as File;
				if(!file.isDirectory){
					var viewer:Object;
					switch(file.extension.toLowerCase()){
						case &#8220;flv&#8221;:
							currentState = &#8220;videoState&#8221;;
							viewer = videoDisplay;
							viewer.source = file.url;
						break;
						case &#8220;png&#8221;:						
						case &#8220;jpg&#8221;:
							currentState = &#8220;imageState&#8221;;
							viewer = image;
							viewer.source = file.url;
						break;
						case &#8220;pdf&#8221;:
							currentState = &#8220;pdfState&#8221;;
							var htmlLoader:HTMLLoader = new HTMLLoader();  
							var urlReq:URLRequest = new URLRequest(file.url);  
							htmlLoader.width = 814;  
							htmlLoader.height = 705;  
							htmlLoader.load(urlReq);  
							var myComponent:UIComponent  = new UIComponent();  
							myComponent.addChild(htmlLoader);
							pdf_content.addChild(myComponent);
						break;
						default:
							Alert.show(&#8221;Unsupported file &#8221; + file.nativePath, &#8220;Error&#8221;);
						return;
					}
				}
			}
		]]&gt;
	&lt;/mx:Script&gt;
	&lt;mx:HDividedBox width=&#8221;100%&#8221; height=&#8221;725&#8243; paddingLeft=&#8221;10&#8243; paddingRight=&#8221;10&#8243; paddingBottom=&#8221;10&#8243; paddingTop=&#8221;10&#8243; y=&#8221;41&#8243;&gt;
		&lt;mx:VBox width=&#8221;200&#8243; height=&#8221;100%&#8221;&gt;
			&lt;mx:FileSystemTree id=&#8221;fileSystemTree&#8221; width=&#8221;100%&#8221; height=&#8221;100%&#8221; change=&#8221;onChange(event)&#8221; /&gt;
		&lt;/mx:VBox&gt;
		&lt;mx:Canvas width=&#8221;100%&#8221; height=&#8221;100%&#8221; id=&#8221;content&#8221; &gt;&lt;/mx:Canvas&gt;
	&lt;/mx:HDividedBox&gt;
	&lt;mx:ApplicationControlBar x=&#8221;0&#8243; y=&#8221;0&#8243; width=&#8221;100%&#8221;&gt;
		&lt;mx:MenuBar labelField=&#8221;@label&#8221; itemClick=&#8221;menuHandler(event);&#8221; dataProvider=&#8221;{menuBarCollection}&#8221; /&gt;
	&lt;/mx:ApplicationControlBar&gt;
	&lt;mx:states&gt;
		&lt;mx:State name=&#8221;videoState&#8221;&gt;
			&lt;mx:AddChild relativeTo=&#8221;{content}&#8221;&gt;
				&lt;mx:VideoDisplay id=&#8221;videoDisplay&#8221; width=&#8221;100%&#8221; height=&#8221;100%&#8221; /&gt;
			&lt;/mx:AddChild&gt;
		&lt;/mx:State&gt;
		&lt;mx:State name=&#8221;imageState&#8221;&gt;
			&lt;mx:AddChild relativeTo=&#8221;{content}&#8221;&gt;
				&lt;mx:Image id=&#8221;image&#8221; width=&#8221;100%&#8221; height=&#8221;100%&#8221; /&gt;
			&lt;/mx:AddChild&gt;
		&lt;/mx:State&gt;
		&lt;mx:State name=&#8221;pdfState&#8221;&gt;
			&lt;mx:AddChild relativeTo=&#8221;{content}&#8221;&gt;
				&lt;mx:Canvas width=&#8221;100%&#8221; height=&#8221;100%&#8221; id=&#8221;pdf_content&#8221; &gt;&lt;/mx:Canvas&gt;
			&lt;/mx:AddChild&gt;
		&lt;/mx:State&gt;
	&lt;/mx:states&gt;
&lt;/mx:WindowedApplication&gt;
</code>
The result:<br />
<br />
<img src="http://www.derekentringer.com/images/flex_file_browser.jpg" title="Flex File Browser   PDF, Images, and Video Player" alt="flex_file_browser Flex File Browser - PDF, Images, and Video Player" /><br />
<br />
<a href="http://www.derekentringer.com/downloads/flex_file_explorer.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/flex_file_explorer.zip');" target="_blank">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=53" width="1" height="1" style="display: none;" title="Flex File Browser   PDF, Images, and Video Player" alt=" Flex File Browser - PDF, Images, and Video Player" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/flex-file-browser/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Blog Updated</title>
		<link>http://derekentringer.com/blog/2008/08/21/blog-updated/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/blog-updated/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 17:45:55 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[New Developments]]></category>

		<category><![CDATA[blog]]></category>

		<category><![CDATA[updated]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=51</guid>
		<description><![CDATA[I had been using AjaxPress for the longest time, and have finally changed-over to WordPress. Should have made the switch a while ago, but there was always something else on my plate.
For anyone new to my site, all of the articles have been ported over to this new setup, but the dates are now all [...]]]></description>
			<content:encoded><![CDATA[<p>I had been using AjaxPress for the longest time, and have finally changed-over to WordPress. Should have made the switch a while ago, but there was always something else on my plate.</p>
<p>For anyone new to my site, all of the articles have been ported over to this new setup, but the dates are now all not exactly relevant to when the articles were originally posted.</p>
<p>To those who are not new&#8230;be sure to grab the new <a href="http://derekentringer.com/blog/feed/"  target="_blank">rss feed</a>.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=51" width="1" height="1" style="display: none;" title="Blog Updated" alt=" Blog Updated" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/blog-updated/feed/</wfw:commentRss>
		</item>
		<item>
		<title>FLV Player (Streaming) using Dynamic Buffering, Port Detection, and Bandwidth Checks</title>
		<link>http://derekentringer.com/blog/2008/08/21/flv-player-streaming-using-dynamic-buffering-port-detection-and-bandwidth-checks/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/flv-player-streaming-using-dynamic-buffering-port-detection-and-bandwidth-checks/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:41:56 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[FMS]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[bandwidth]]></category>

		<category><![CDATA[checking]]></category>

		<category><![CDATA[detection]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[flv]]></category>

		<category><![CDATA[media]]></category>

		<category><![CDATA[port]]></category>

		<category><![CDATA[server]]></category>

		<category><![CDATA[streaming]]></category>

		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=49</guid>
		<description><![CDATA[
This FLV player has quite a few advanced options included. The video is streamed from a Flash Media server, dynamically buffered, and playable. The server side scripts allow for dynamic port detection, and you can setup the player to serve differently encoded flv files based on the users bandwidth.

stop();
/*--------------------------------------------------------------------------------*/
//external classes
/*--------------------------------------------------------------------------------*/    
import NCManager;
import [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT--><br />
This FLV player has quite a few advanced options included. The video is streamed from a Flash Media server, dynamically buffered, and playable. The server side scripts allow for dynamic port detection, and you can setup the player to serve differently encoded flv files based on the users bandwidth.
<code name="code" class="xml">
stop();
/*--------------------------------------------------------------------------------*/
//external classes
/*--------------------------------------------------------------------------------*/    
import NCManager;
import mx.transitions.Tween;
/*--------------------------------------------------------------------------------*/
//sound settings/controls
/*--------------------------------------------------------------------------------*/
globalsound = new Sound();
globalsound.setVolume(100);
volume_slide.volume_slider._x = volume_slide.volume_bar._width-volume_slide.volume_slider._width;
b_volume.onRelease = function() {
	if (globalsound.getVolume() == 100) {
		b_volume.gotoAndStop(2);
		globalsound.setVolume(0);
	} else if (globalsound.getVolume() == 0) {
		b_volume.gotoAndStop(1);
		globalsound.setVolume(100);
	}
};
b_volume.onRollOver = function() {
	b_volume.b_sound_a.gotoAndStop(2);
	b_volume.b_sound_b.gotoAndStop(2);
}
b_volume.onRollOut = function() {
	b_volume.b_sound_a.gotoAndStop(1);
	b_volume.b_sound_b.gotoAndStop(1);
}
/*--------------------------------------------------------------------------------*/
//dynamic buffering
/*--------------------------------------------------------------------------------*/
function startBufferAnimation() {
	if (ns.time>"0") {
		//hide animation
		clearInterval(startBufferAnimation_interval);
		buffer_graphic._alpha = 0;
		buffer_graphic._x = 5000;
	} else {
		//show animation
		buffer_graphic._alpha = 100;
		//display the buffer progress
		totalBuffer = ns.bufferTime;
		currentBuffer = ns.bufferLength;
		loadingText = Math.round((currentBuffer/totalBuffer)*100);
		if (loadingText<=100) {
			buffer_graphic.loading_txt.text = loadingText+"%";
		} else {
			buffer_graphic.loading_txt.text = "100%";
			clearInterval(startBufferAnimation_interval);
		}
	}
}
/*--------------------------------------------------------------------------------*/
//video loading/controls
/*--------------------------------------------------------------------------------*/
//variables
var firstFramePending:Boolean = true;
var firstPlayPending:Boolean = true;
var ns:NetStream;
var fileName:String;
//constants
var k_STARTTIME:Number = getTimer();
//server info
var k_SERVERNAME:String = "your.server.ip";
var k_APPNAME:String = "FMS_Application_Name";
var k_FILENAME:String = "flv_file_name";
var k_ASC_PATH:String = "rtmp://path/to/bwcheck";
//connect to the bwcheck.asc
nc = new NetConnection();
//connect to the bwcheck.asc
nc.connect(k_ASC_PATH,true);
//let us know that the connection was successful
nc.onStatus = function(info) {
	trace("Level: "+info.level+" Code: "+info.code);
	if (info.code == "NetConnection.Connect.Success") {
		trace("loaded: "+this.uri);
	}
};
//the variable p_bw returned by bwcheck.asc holds a value equal to the detected download speed in kilobits per second
//for best results we should serve video that is encoded at a rate less than or equal to kbitsDown
NetConnection.prototype.onBWDone = function(p_bw) {
	trace("BANDWIDTH= "+p_bw);
	//save the detected bandwidth
	detected_bw = p_bw;
	//close the Netconnection to bwcheck
	this.close();
};
//calling the serverside script
NetConnection.prototype.onBWCheck = function() {
	return ++counter;
};
//define an instance of our NCManager class
var ncm:NCManager = new NCManager();
//create the listener object
var ncmListener:Object = new Object();
//fires when it has found a successfull connection
ncmListener.ncConnected = function(evt:Object) {
	trace("["+Math.round(getTimer()-k_STARTTIME)+"ms] Successfully connected using "+evt.protocol+":"+evt.port);
	//as soon as we have a good connection, play the first frame
	playFirstFrame(evt.nc);
};
//fires when it has timed-out trying to find a good connection
ncmListener.ncFailedToConnect = function(evt:Object) {
	trace("Failed to connect after "+evt.timeout+" milliseconds.");
};
//fires when bandwdith has been detected
ncmListener.ncBandWidth = function(evt:Object) {
	//--not working--> //trace(&#8221;["+Math.round(getTimer()-k_STARTTIME)+"ms] Measured bandwidth at &#8220;+evt.kbps+&#8221; kbps.&#8221;);
	fileName = k_FILENAME;
	ncm.getStreamLength(fileName);
	trace(&#8221;LOADED FILE= &#8220;+fileName);
};
//fires when streamlength has been detected
ncmListener.ncStreamLength = function(evt:Object) {
	trace(&#8221;["+Math.round(getTimer()-k_STARTTIME)+"ms] Streamlength of &#8220;+evt.name+&#8221; is &#8220;+evt.length+&#8221; seconds.&#8221;);
	//save stream length info
	//vid_length = evt.length;
};
//set listeners on the NCM instance
ncm.addEventListener(&#8221;ncConnected&#8221;,ncmListener);
ncm.addEventListener(&#8221;ncFailedToConnect&#8221;,ncmListener);
ncm.addEventListener(&#8221;ncBandWidth&#8221;,ncmListener);
ncm.addEventListener(&#8221;ncStreamLength&#8221;,ncmListener);
//call the connect method on NCM instance
ncm.connect(k_SERVERNAME,k_APPNAME);
//set up the NetStream and plays the first frame of the stream
function playFirstFrame(nc:NetConnection):Void {
	ns = new NetStream(nc);
	ns.onStatus = function(info) {
		if (info.code == &#8220;NetStream.Play.Stop&#8221; &#038;&#038; firstFramePending) {
			firstFramePending = false;
			trace(&#8221;["+Math.round(getTimer()-k_STARTTIME)+"ms] First frame loaded&#8221;);
			//once the first frame has loaded, measure the bandwidth
			nc.call(&#8221;checkBandwidth&#8221;,null);
		}
	};
	//vid length
	ns.onMetaData = function(infoObject:Object) {
		my_duration = infoObject["duration"];
		//trace(my_duration);
		timing(my_duration);
	};
	//display the first frame of the best quality flv
	video.attachVideo(ns);
	//buffer the video
	//set buffer parameters
	startBufferLength = 10;
	expandedBufferLength = 20;
	//attach onStatus function
	ns.onStatus = function(infoObject:Object) {
		if (infoObject["code"] == &#8220;NetStream.Buffer.Full&#8221;) {
			ns.setBufferTime(expandedBufferLength);
			trace(&#8221;SET EXPANDED BUFFER&#8221;);
			buffer_graphic._alpha = 0;
		}
		if (infoObject["code"] == &#8220;NetStream.Buffer.Empty&#8221;) {
			ns.setBufferTime(startBufferLength);
			trace(&#8221;SET START BUFFER&#8221;);
			buffer_graphic._alpha = 100;
		}
	};
	//start the buffer
	ns.setBufferTime(startBufferLength);
	//display buffer graphic
	startBufferAnimation_interval = setInterval(startBufferAnimation, 150);
	ns.play(k_FILENAME);
}
/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/
//scrubber functions
/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/
function timing(fTime:Number) {
	//the length of the movie
	var finalTime:Number = fTime;
	var time_interval:Number = setInterval(checkTime, 10, ns);
	//function for the interval
	function checkTime(ns:NetStream) {
		//movie time
		var ns_seconds:Number = ns.time;
		//parameters for the scrubber
		var finalWidth:Number = timer_bar.slider._width-timer_bar.scrubber._width;
		var movVar:Number = finalWidth/finalTime;
		timer_bar.scrubber._x = movVar*ns_seconds;
		//values for the scrubber position
		var pTop:Number = timer_bar.scrubber._y;
		var pLeft:Number = 0;
		var pBottom:Number = timer_bar.scrubber._y;
		var pRight:Number = timer_bar.slider._width-timer_bar.scrubber._width;
		//scrubber is pressed
		timer_bar.scrubber.onPress = function() {
			clearInterval(time_interval);
			//dragging
			startDrag(&#8221;timer_bar.scrubber&#8221;, false, pLeft, pTop, pRight, pBottom);
			dragging = true;
			//seek as scrubber is moved
			this.onEnterFrame = function() {
				ns_seconds = this._x/movVar;
				ns.seek(ns_seconds);
			};
		};
		timer_bar.scrubber.onRelease = function() {
			dragging = false;
			stopDrag();
			delete this.onEnterFrame;
			time_interval = setInterval(checkTime, 10, ns);
		};
		timer_bar.scrubber.onReleaseOutside = function() {
			dragging = false;
			stopDrag();
			delete this.onEnterFrame;
			time_interval = setInterval(checkTime, 10, ns);
		};
		timer_bar.scrubber.onRollOver = function(){
			timer_bar.scrubber.gotoAndStop(2);
		};
		timer_bar.scrubber.onRollOut = function(){
			timer_bar.scrubber.gotoAndStop(1);
		};
	}
}
/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/
//play/pause controls
/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;*/
b_play.onRelease = function() {
	if (b_play._currentframe == 1) {
		ns.pause();
		b_play.gotoAndStop(2);
	} else {
		ns.pause();
		b_play.gotoAndStop(1);
	}
};
b_play.onRollOver = function(){
	b_play.b_play_a.gotoAndStop(2);
	b_play.b_play_b.gotoAndStop(2);
};
b_play.onRollOut = function(){
	b_play.b_play_a.gotoAndStop(1);
	b_play.b_play_b.gotoAndStop(1);
};
b_rewind.onRelease = function() {
	ns.seek(0);
};
b_rewind.onRollOver = function(){
	b_rewind.gotoAndStop(2);
}
b_rewind.onRollOut = function(){
	b_rewind.gotoAndStop(1);
};
download.onRelease = function() {
	getURL(&#8221;http://path/to/downloadable/movie&#8221;, &#8220;_blank&#8221;);
};
download.onRollOver = function(){
	download.gotoAndStop(2);
}
download.onRollOut = function(){
	download.gotoAndStop(1);
}
</code>
<a href="http://www.derekentringer.com/downloads/flv_player_streaming.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/flv_player_streaming.zip');">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=49" width="1" height="1" style="display: none;" title="FLV Player (Streaming) using Dynamic Buffering, Port Detection, and Bandwidth Checks" alt=" FLV Player (Streaming) using Dynamic Buffering, Port Detection, and Bandwidth Checks" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/flv-player-streaming-using-dynamic-buffering-port-detection-and-bandwidth-checks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>FLV Player (Progressive Download) with Preloader</title>
		<link>http://derekentringer.com/blog/2008/08/21/flv-player-progressive-download-with-preloader/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/flv-player-progressive-download-with-preloader/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:41:02 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[download]]></category>

		<category><![CDATA[flv]]></category>

		<category><![CDATA[player]]></category>

		<category><![CDATA[progressive]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=47</guid>
		<description><![CDATA[

bar.slider._width-timer_bar.scrubber._width;
	   //scrubber is pressed
	   timer_bar.scrubber.onPress = function() {
	       clearInterval(time_interval);
	       //dragging
	       startDrag("timer_bar.scrubber", false, pLeft, pTop, pRight, pBottom);
	       dragging = true;
	       //seek as [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
<code name="code" class="xml">
bar.slider._width-timer_bar.scrubber._width;
	   //scrubber is pressed
	   timer_bar.scrubber.onPress = function() {
	       clearInterval(time_interval);
	       //dragging
	       startDrag("timer_bar.scrubber", false, pLeft, pTop, pRight, pBottom);
	       dragging = true;
	       //seek as scrubber is moved
	       this.onEnterFrame = function() {
	           ns_seconds = this._x/movVar;
	           ns.seek(ns_seconds);
	       };
	   };
	   timer_bar.scrubber.onRelease = function() {
	       dragging = false;
	       stopDrag();
	       delete this.onEnterFrame;
	       time_interval = setInterval(checkTime, 10, ns);
	   };
	   timer_bar.scrubber.onReleaseOutside = function() {
	       dragging = false;
	       stopDrag();
	       delete this.onEnterFrame;
	       time_interval = setInterval(checkTime, 10, ns);
	   };
	}
}
/*--------------------------------------------------------------------------------*/
//preloading functions
/*--------------------------------------------------------------------------------*/
function drawLoader() {
	video.clear();
	loading._visible = true;
	progressBar_mc._visible = true;
	createEmptyMovieClip("progressBar_mc",getNextHighestDepth());
	progressBar_mc.createEmptyMovieClip("bar_mc",progressBar_mc.getNextHighestDepth());
	with (progressBar_mc.bar_mc) {
		beginFill(0xD7D7D9);
		moveTo(0,0);
		lineTo(100,0);
		lineTo(100,10);
		lineTo(0,10);
		lineTo(0,0);
		endFill();
		_xscale = 0;
		_alpha = 90;
	}
	progressBar_mc.createEmptyMovieClip("stroke_mc",progressBar_mc.getNextHighestDepth());
	with (progressBar_mc.stroke_mc) {
		lineStyle(0,0xD7D7D9);
		moveTo(0,0);
		lineTo(100,0);
		lineTo(100,10);
		lineTo(0,10);
		lineTo(0,0);
		_alpha = 90;
	}
	progressBar_mc._x = 140;
	progressBar_mc._y = 115;
	var loaded_interval:Number = setInterval(checkBytesLoaded, 150);
	function checkBytesLoaded() {
		var pctLoaded_1:Number = Math.round(ns.bytesLoaded/ns.bytesTotal*100);
		pctLoaded_total = pctLoaded_1;
		trace("total loaded= "+pctLoaded_total);
		progressBar_mc.bar_mc._xscale = pctLoaded_total*2;
		if (pctLoaded_total>=50) {
			ns.seek(0);
			ns.pause();
			clearInterval(loaded_interval);
			progressBar_mc._visible = false;
			loading._visible = false;
			unloadMovie(progressBar_mc.stroke_mc);
			unloadMovie(progressBar_mc.bar_mc);
			unloadMovie(progressBar_mc);
		}
	}
}
</code>
The result:<br />
<img src="http://www.derekentringer.com/images/flv_player.jpg" border="0" title="FLV Player (Progressive Download) with Preloader" alt="flv_player FLV Player (Progressive Download) with Preloader" /><br />
<a href="http://www.derekentringer.com/downloads/flv_player.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/flv_player.zip');">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=47" width="1" height="1" style="display: none;" title="FLV Player (Progressive Download) with Preloader" alt=" FLV Player (Progressive Download) with Preloader" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/flv-player-progressive-download-with-preloader/feed/</wfw:commentRss>
		</item>
		<item>
		<title>FMS Video Chat</title>
		<link>http://derekentringer.com/blog/2008/08/21/fms-video-chat/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/fms-video-chat/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:40:24 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[FMS]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[Application]]></category>

		<category><![CDATA[chat]]></category>

		<category><![CDATA[Flash]]></category>

		<category><![CDATA[media]]></category>

		<category><![CDATA[server]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=45</guid>
		<description><![CDATA[
Here&#8217;s a quick way to setup a Flash Media Server chat room.

stop();
//setup my camera view
mycam = Camera.get();
mycam_audio = Microphone.get();
mycam.setMode(320,240,30);
mycam.setQuality(10000,100);
cam_feed.attachVideo(mycam);
cam_feed.attachAudio(mycam_audio);
//setup my viewer
client_nc = new NetConnection();
client_nc.connect("rtmp://yourip/appfolder/", "appname");
cam_ns = new NetStream(client_nc);
cam_ns.attachVideo(mycam);
cam_ns.attachAudio(mycam_audio);
cam_ns.publish("user_2", "live");
//bring in user_2's video/audio
in_ns = new NetStream(client_nc);
in_ns.play("user_1");
live_feed.attachVideo(in_ns);
live_feed.attachAudio(in_ns);

By creating two instances of this flash file, and by creating an application folder on your FMS server, you can instantly [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
Here&#8217;s a quick way to setup a Flash Media Server chat room.
<code name="code" class="xml">
stop();
//setup my camera view
mycam = Camera.get();
mycam_audio = Microphone.get();
mycam.setMode(320,240,30);
mycam.setQuality(10000,100);
cam_feed.attachVideo(mycam);
cam_feed.attachAudio(mycam_audio);
//setup my viewer
client_nc = new NetConnection();
client_nc.connect("rtmp://yourip/appfolder/", "appname");
cam_ns = new NetStream(client_nc);
cam_ns.attachVideo(mycam);
cam_ns.attachAudio(mycam_audio);
cam_ns.publish("user_2", "live");
//bring in user_2's video/audio
in_ns = new NetStream(client_nc);
in_ns.play("user_1");
live_feed.attachVideo(in_ns);
live_feed.attachAudio(in_ns);
</code>
By creating two instances of this flash file, and by creating an application folder on your FMS server, you can instantly chat with anyone. It&#8217;s not extremely robust, but with a little more work, it could turn into a full application.<br />
<br />
<a href="http://www.derekentringer.com/downloads/chat.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/chat.zip');">Download the source</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=45" width="1" height="1" style="display: none;" title="FMS Video Chat" alt=" FMS Video Chat" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/fms-video-chat/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Papervision3d - Interactive Sphere</title>
		<link>http://derekentringer.com/blog/2008/08/21/papervision3d-interactive-sphere/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/papervision3d-interactive-sphere/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:39:26 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[create]]></category>

		<category><![CDATA[interactive]]></category>

		<category><![CDATA[papervision]]></category>

		<category><![CDATA[sphere]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=42</guid>
		<description><![CDATA[
Here&#8217;s a class that renders a wireframe sphere in Papervision3d.

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.cameras.*;
	import org.papervision3d.objects.*;
	import org.papervision3d.scenes.*;
	import org.papervision3d.materials.*;

	public class PaperVisionTest extends Sprite {
		/** setup the container */
		private var container: Sprite = new Sprite();

		/** setup the scene */
		private var scene: MovieScene3D = new MovieScene3D(container);

		/** setup the camera */
		private var camera: Camera3D = new Camera3D();

		/** setup the material [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
Here&#8217;s a class that renders a wireframe sphere in Papervision3d.
<code name="code" class="xml">
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.cameras.*;
	import org.papervision3d.objects.*;
	import org.papervision3d.scenes.*;
	import org.papervision3d.materials.*;

	public class PaperVisionTest extends Sprite {
		/** setup the container */
		private var container: Sprite = new Sprite();

		/** setup the scene */
		private var scene: MovieScene3D = new MovieScene3D(container);

		/** setup the camera */
		private var camera: Camera3D = new Camera3D();

		/** setup the material */
		private var material:WireframeMaterial = new WireframeMaterial(0xFF0000);

		/** setup the sphere */
		private var sphere:Sphere = new Sphere(material, 300, 30, 30);

		/**
		* constructor
		*/
		public function PaperVisionTest() {
			//add the container
			container.x = stage.stageWidth/2;
			container.y = stage.stageHeight/2;
			addChild(container);

			//camera parameters
			camera.z = -500;
			camera.zoom = 5;

			//give the sphere to the scene
			scene.addChild(sphere);
			
			stage.addEventListener(Event.ENTER_FRAME, update);
		}

		/**
		* Triggered by the enter frame event
		* @param pEvent Event object passed by the dispatcher
		*/
		private function update(pEvent:Event):void {

			//initialize the camera
			sphere.lookAt(camera);

			//mouse movement control
			sphere.pitch(this.mouseY);
			sphere.yaw(this.mouseX);

			//render the scene
			scene.renderCamera(camera);
		}
	}
}
</code>
The final result:<br />
<img src="http://www.derekentringer.com/images/sphere.jpg" border="0" title="Papervision3d   Interactive Sphere" alt="sphere Papervision3d - Interactive Sphere" /><br />
<a href="http://www.derekentringer.com/downloads/PapervisionTest.zip" onclick="javascript:pageTracker._trackPageview('/downloads/downloads/PapervisionTest.zip');">Click here to download the source.</a> <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=42" width="1" height="1" style="display: none;" title="Papervision3d   Interactive Sphere" alt=" Papervision3d - Interactive Sphere" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/papervision3d-interactive-sphere/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Simple Papervision3d Scene</title>
		<link>http://derekentringer.com/blog/2008/08/21/simple-papervision3d-scene/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/simple-papervision3d-scene/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:38:49 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[Tutorials]]></category>

		<category><![CDATA[3d]]></category>

		<category><![CDATA[create]]></category>

		<category><![CDATA[papervision]]></category>

		<category><![CDATA[scene]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=40</guid>
		<description><![CDATA[
Here&#8217;s a simple scene that renders a Papervision3d scene within a container. There are no 3d elements added, but this is as simple as it gets.

import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.materials.*;
import org.papervision3d.scenes.*;

var container:Sprite = new Sprite();
addChild(container);
container.x = stage.stageWidth * 0.5;
container.y = stage.stageHeight * 0.5;

var scene:Scene3D = new Scene3D(container);
var camera:Camera3D = new Camera3D();
camera.zoom = 11;

addEventListener(Event.ENTER_FRAME, loop);

function loop(e:Event):void
{
  [...]]]></description>
			<content:encoded><![CDATA[<!--PLAIN_TEXT-->
Here&#8217;s a simple scene that renders a Papervision3d scene within a container. There are no 3d elements added, but this is as simple as it gets.
<code name="code" class="xml">
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.materials.*;
import org.papervision3d.scenes.*;

var container:Sprite = new Sprite();
addChild(container);
container.x = stage.stageWidth * 0.5;
container.y = stage.stageHeight * 0.5;

var scene:Scene3D = new Scene3D(container);
var camera:Camera3D = new Camera3D();
camera.zoom = 11;

addEventListener(Event.ENTER_FRAME, loop);

function loop(e:Event):void
{
    scene.renderCamera(camera);
}
</code>
If you&#8217;re interested in how this can be improved, check out the next post with a more elaborate Papervision scene. <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=40" width="1" height="1" style="display: none;" title="Simple Papervision3d Scene" alt=" Simple Papervision3d Scene" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/simple-papervision3d-scene/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Flash CS3: Easy to use XML Feed Class</title>
		<link>http://derekentringer.com/blog/2008/08/21/flash-cs3-easy-to-use-xml-feed-class/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/flash-cs3-easy-to-use-xml-feed-class/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:38:01 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[Flash]]></category>

		<category><![CDATA[cs3]]></category>

		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=38</guid>
		<description><![CDATA[Re-usable class created by brianConnatser that will set up an external XML feed to use E4X, datagrids, and much more.
Check out some of the code
 ]]></description>
			<content:encoded><![CDATA[<p>Re-usable class created by brianConnatser that will set up an external XML feed to use E4X, datagrids, and much more.</p>
<p><a href="http://www.connatserdev.com/blog/?p=67" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.connatserdev.com');">Check out some of the code</a></p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=38" width="1" height="1" style="display: none;" title="Flash CS3: Easy to use XML Feed Class" alt=" Flash CS3: Easy to use XML Feed Class" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/flash-cs3-easy-to-use-xml-feed-class/feed/</wfw:commentRss>
		</item>
		<item>
		<title>OrbySPV v1.5 Launched</title>
		<link>http://derekentringer.com/blog/2008/08/21/orbyspv-v15-launched/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/orbyspv-v15-launched/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:37:28 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[New Developments]]></category>

		<category><![CDATA[orbyspv]]></category>

		<category><![CDATA[panoramic]]></category>

		<category><![CDATA[sequential]]></category>

		<category><![CDATA[tours]]></category>

		<category><![CDATA[viewer]]></category>

		<category><![CDATA[virtual]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=36</guid>
		<description><![CDATA[A virtual tour product that I have been working on has finally launched today. OrbySPV (Sequential Panoramic Viewer) technology gives you the power to create highly interactive virtual tours, similiar to the Google Maps Street View, using your own panaromic images. you can check it out at OrbySPV.com. The technology is derived by manipulating spherically [...]]]></description>
			<content:encoded><![CDATA[<p>A virtual tour product that I have been working on has finally launched today. OrbySPV (Sequential Panoramic Viewer) technology gives you the power to create highly interactive virtual tours, similiar to the Google Maps Street View, using your own panaromic images. you can check it out at <a href="http://www.orbyspv.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.orbyspv.com');" target="_blank">OrbySPV.com</a>. The technology is derived by manipulating spherically projected 360 degree panoramic images to create an interactive experience unlike any virtual tour technology available today. There are a bunch of license options to choose from, tutorials to help you get started, as well as sample viewers and images. If you have any questions about Orby, please use the email form <a href="http://www.orbyspv.com/email_sales.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.orbyspv.com');" target="_blank">here</a>.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=36" width="1" height="1" style="display: none;" title="OrbySPV v1.5 Launched" alt=" OrbySPV v1.5 Launched" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/orbyspv-v15-launched/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Social Media Optimization</title>
		<link>http://derekentringer.com/blog/2008/08/21/social-media-optimization/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/social-media-optimization/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:36:30 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[networking]]></category>

		<category><![CDATA[optimization]]></category>

		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=34</guid>
		<description><![CDATA[Influential Interactive Marketing has an awesome article on SMO.
From the article:
&#8220;For years now, Search Engine Optimization (SEO) for websites has been honed into a fine art with entire companies devoting considerable effort to defining best practices and touting the value of SEO for raising a site&#8217;s performance on organic search listings.  While I believe [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rohitbhargava.typepad.com/weblog/2006/08/5_rules_of_soci.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/rohitbhargava.typepad.com');" target="_blank">Influential Interactive Marketing</a> has an awesome article on SMO.<br />
From the article:</p>
<p>&#8220;For years now, Search Engine Optimization (SEO) for websites has been honed into a fine art with entire companies devoting considerable effort to defining best practices and touting the value of SEO for raising a site&#8217;s performance on organic search listings.  While I believe in the power of SEO, there is a new offering we have started providing to clients which we call Social Media Optimization (SMO).  The concept behind SMO is simple: implement changes to optimize a site so that it is more easily linked to, more highly visible in social media searches on custom search engines (such as Technorati), and more frequently included in relevant posts on blogs, podcasts and vlogs.&#8221;</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=34" width="1" height="1" style="display: none;" title="Social Media Optimization" alt=" Social Media Optimization" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/social-media-optimization/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PPC Brand Building?</title>
		<link>http://derekentringer.com/blog/2008/08/21/ppc-brand-building/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/ppc-brand-building/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:35:36 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[brand]]></category>

		<category><![CDATA[building]]></category>

		<category><![CDATA[PPc]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=32</guid>
		<description><![CDATA[SEMPO surveys consistently show that brand awareness is the top objective of many paid search programs. But, who would use PPC campaigns for branding?
So is the Internet just another direct marketing medium? I don&#8217;t think so. The transformation from one-to-one to many-to-many is occurring in the world of social media. Nothing on the internet fits [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.toprankblog.com/2005/12/sempo-survey-seo-more-popular-than-paid-search/" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.toprankblog.com');" target="_blank">SEMPO surveys</a> consistently show that brand awareness is the top objective of many paid search programs. But, who would use PPC campaigns for branding?</p>
<p>So is the Internet just another direct marketing medium? I don&#8217;t think so. The transformation from one-to-one to many-to-many is occurring in the world of social media. Nothing on the internet fits the concept of branding quite like Web 2.0. Branding is a social phenomenon. Web 2.0 is social media. The desire to fit in is a huge part of branding. Web 2.0 is the sheer momentum of the bandwagon. It is group think, which is what moves t-shirts at the mall, or the latest fashion styles at your local mall.</p>
<p>While viral marketing is all the rage, the means through which a message goes viral is social media. Social media is Internet word of mouth.</p>
<p>The poet W.H. Auden famously said:</p>
<p><em>&#8220;The image of myself which I try to create in my own mind in order that I may love myself is very different from the image I try to create in the minds of others in order that they may love me.&#8221;</em></p>
<p>If you want them to love you on the Internet, you wonâ€™t get there by shouting your name the loudest. You need to be heard, but your message also must resonate emotionally and socially with the consumer. If the message doesn&#8217;t resonate, it&#8217;s just noise and not signal. Those who make the best use of social media are the ones who will be most successful building their brands on the Internet. <a href="http://rohitbhargava.typepad.com/weblog/2006/08/5_rules_of_soci.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/rohitbhargava.typepad.com');" target="_blank">Social Media Optimization</a> (SMO), not paid search, is the path to brand building online.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=32" width="1" height="1" style="display: none;" title="PPC Brand Building?" alt=" PPC Brand Building?" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/ppc-brand-building/feed/</wfw:commentRss>
		</item>
		<item>
		<title>iSalient Featured in PHPMagazine</title>
		<link>http://derekentringer.com/blog/2008/08/21/isalient-featured-in-phpmagazine/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/isalient-featured-in-phpmagazine/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:34:22 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[isalient]]></category>

		<category><![CDATA[mysql]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[phpmagazine]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=30</guid>
		<description><![CDATA[iSalient has been recently featured within PHPMagazine.net with a short review of some the features available.
The article is available here.
More information on how I was involved in the creation of iSalient is available in the portfolio section of this site.
From the article:
&#8220;iSalient has an AJAX interface to create and customize your survey on the fly, [...]]]></description>
			<content:encoded><![CDATA[<p>iSalient has been recently featured within PHPMagazine.net with a short review of some the features available.</p>
<p>The article is available <a href="http://ajax.phpmagazine.net/2007/03/isalient_ajaxbased_hosted_surv.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/ajax.phpmagazine.net');" target="_blank">here</a>.</p>
<p>More information on how I was involved in the creation of iSalient is available in the portfolio section of this site.</p>
<p>From the article:</p>
<p>&#8220;iSalient has an AJAX interface to create and customize your survey on the fly, intuitive and very easy to use powered by prototype and scriptaculous. There is many options available to create survey general, look and feel, number of response, start and end date, language, status &#8230; and more advanced options such for restricted surveys, navigation &#8230; etc. Questions are easy to create, simply by choosing from the different options available in the drop down menu (18 options available), you can create from simple true false questions to advanced option with sliders, then you can add conditions and your survey is ready to go.&#8221;</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=30" width="1" height="1" style="display: none;" title="iSalient Featured in PHPMagazine" alt=" iSalient Featured in PHPMagazine" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/isalient-featured-in-phpmagazine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>BegForPost.com</title>
		<link>http://derekentringer.com/blog/2008/08/21/begforpostcom/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/begforpostcom/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:33:22 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[General Discussion]]></category>

		<category><![CDATA[begforpost]]></category>

		<category><![CDATA[blogging]]></category>

		<category><![CDATA[internet]]></category>

		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=28</guid>
		<description><![CDATA[Looking for reviews on your new startup? Using BegForPost.com you can try to lure other bloggers or news websites into looking into your website, and maybe get some good feedback.
From their website:
&#8220;You&#8217;ve worked for months building a startup on a boostrap budget and the launch is near. How will you get an initial influx of [...]]]></description>
			<content:encoded><![CDATA[<p>Looking for reviews on your new startup? Using BegForPost.com you can try to lure other bloggers or news websites into looking into your website, and maybe get some good feedback.</p>
<p>From their website:<br />
&#8220;You&#8217;ve worked for months building a startup on a boostrap budget and the launch is near. How will you get an initial influx of traffic to propel your product/service into viral bliss? Don&#8217;t pay off bloggers to promote your startup, beg! Getting started is quick and easy. Fill out the form below, sit back, and wait for Internet stardom. Youâ€™re almost there!&#8221;</p>
<p><a href="http://www.begforpost.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.begforpost.com');" target="_blank">BegForPost.com</a></p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=28" width="1" height="1" style="display: none;" title="BegForPost.com" alt=" BegForPost.com" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/begforpostcom/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SEO and mod_rewrite</title>
		<link>http://derekentringer.com/blog/2008/08/21/seo-and-mod_rewrite/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/seo-and-mod_rewrite/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:32:35 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[mod_rewrite]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=26</guid>
		<description><![CDATA[There are two types of URLs dynamic and static. A dynamic URL is a page address that results from the search of a database-driven web site or the URL of a web site that runs a script. In contrast to static URLs, in which the contents of the web page stay the same unless the [...]]]></description>
			<content:encoded><![CDATA[<p>There are two types of URLs dynamic and static. A dynamic URL is a page address that results from the search of a database-driven web site or the URL of a web site that runs a script. In contrast to static URLs, in which the contents of the web page stay the same unless the changes are hard-coded into the HTML, dynamic URLs are generated from specific queries to a site&#8217;s database. The dynamic page is basically only a template in which to display the results of the database query. Instead of changing information in the HTML code, the data is changed in the database.</p>
<p>Static URLs are typically ranked better in search engine results pages, and they are indexed more quickly than dynamic URLs, if dynamic URLs get indexed at all. Static URLs are also easier for the end-user to view and understand what the page is about. If a user sees a URL in a search engine query that matches the title and description, they are more likely to click on that URL than one that doesn&#8217;t make sense to them.</p>
<p>If you are hosted on a Linux server, then you will want to make the most of the Apache Mod Rewrite Rule, which is gives you the ability to inconspicuously redirect one URL to another, without the user&#8217;s (or a search engine&#8217;s) knowledge. You will need to have this module installed in Apache; for more information, you can view the documentation for this module <a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html" onclick="javascript:pageTracker._trackPageview('/outbound/article/httpd.apache.org');" target="_blank">here</a>. This module saves you from having to rewrite your static URLs manually.</p>
<p>How does this module work? When a request comes in to a server for the new static URL, the Apache module redirects the URL internally to the old, dynamic URL, while still looking like the new static URL. The web server compares the URL requested by the client with the search pattern in the individual rules.</p>
<p>For example, when someone requests this URL:</p>
<p>http://www.yoursite.com/forums/seo-and-dynamic-urls.html</p>
<p>The server looks for and compares this static-looking URL to what information is listed in the .htaccess file, such as:</p>
<p>RewriteEngine on<br />RewriteRule<br />thread-threadid-(.*)\.htm$ thread.php?threadid=$1</p>
<p>It then converts the static URL to the old dynamic URL that looks like this:<br />
http://www.somesites.com/forums/thread.php?threadid=12345</p>
<p>You now have a URL that only will rank better in the search engines, but your end-users can definitely understand by glancing at the URL what the page will be about, while allowing Apache&#8217;s Mod Rewrite Rule to handle to conversion for you, and still keeping the dynamic URL.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=26" width="1" height="1" style="display: none;" title="SEO and mod rewrite" alt=" SEO and mod_rewrite" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/seo-and-mod_rewrite/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Crazy Egg Optimization</title>
		<link>http://derekentringer.com/blog/2008/08/21/crazy-egg-optimization/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/crazy-egg-optimization/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:31:52 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[crazyegg]]></category>

		<category><![CDATA[statistics]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=24</guid>
		<description><![CDATA[Standard web statistic packages compete based on who can offer the most statistics, the most colorful graphs and trying to wrap usability around all that information. The guys at Crazy Egg have taken a different approach where you can measure and actually see what your users are doing when they visit your site, and from [...]]]></description>
			<content:encoded><![CDATA[<p>Standard web statistic packages compete based on who can offer the most statistics, the most colorful graphs and trying to wrap usability around all that information. The guys at <a href="http://www.crazyegg.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.crazyegg.com');" target="blank">Crazy Egg</a> have taken a different approach where you can measure and actually see what your users are doing when they visit your site, and from these results you can immediately optimize your site based on your visitors usage patterns. The result is that you can learn a lot more about your visitors from a lot less information that is found in analytics packages.</p>
<p>The aim of <a href="http://www.crazyegg.com" onclick="javascript:pageTracker._trackPageview('/outbound/article/www.crazyegg.com');" target="blank">Crazy Egg</a> is for webmasters and site owners to learn from visitor usage patterns and improve their site based on what they learn from the application, as opposed to having page after page of statistics. Some features currently in development will allow users to track ad performance so that ad campaigns can be refined, RSS integration and demographic information of your visitors (filtering the map based on which visitors you wish to see).</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=24" width="1" height="1" style="display: none;" title="Crazy Egg Optimization" alt=" Crazy Egg Optimization" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/crazy-egg-optimization/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Good Internet Citizenship</title>
		<link>http://derekentringer.com/blog/2008/08/21/good-internet-citizenship/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/good-internet-citizenship/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:30:59 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[General Discussion]]></category>

		<category><![CDATA[citizenship]]></category>

		<category><![CDATA[internet]]></category>

		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=22</guid>
		<description><![CDATA[What is a Good Internet Citizen?
Becoming a good Internet citizen is pretty simple, but by no means easy.  Provide a useful service, and do it in a way that makes it easy for your visitors, and you&#8217;ll thrive online.
&#8220;Please don&#8217;t add to my frustration!
Can you hear your customers begging?
&#8220;Please don&#8217;t make me wait for [...]]]></description>
			<content:encoded><![CDATA[<p>What is a Good Internet Citizen?</p>
<p>Becoming a good Internet citizen is pretty simple, but by no means easy.  Provide a useful service, and do it in a way that makes it easy for your visitors, and you&#8217;ll thrive online.</p>
<p>&#8220;Please don&#8217;t add to my frustration!</p>
<p>Can you hear your customers begging?</p>
<p>&#8220;Please don&#8217;t make me wait for a movie to run before I can check my order.&#8221;<br />
&#8220;Please don&#8217;t make me search for your contact information.&#8221;<br />
&#8220;Please try to make this easier for me!&#8221;</p>
<p>Listen to your customers and you&#8217;ll hear them asking for simplicity when they interact with you through the Internet.</p>
<p>Keep your visitors in mind during the design and planning phase of your website, and you&#8217;ll build a better site.</p>
<p>The rewards for good citizenship are greater interest, participation, and loyalty from your visitors.  That leads to brand recognition and ultimately business success.</p>
<p>Your website should be intuitive and easy-to-use.<br />
Remember, a website is an extension of your computer.  It must serve a logical purpose and perform its responsibility - not just look flashy or expensive.<br />
Your website should perform a useful service.<br />
One of the best reasons to build a website is to give your customers more customer service.  Find out what they need and give them access to it on the Internet.  You can save time and money.</p>
<p>Your website should be accessible and cross-platform compatible.<br />
This part is simple but one of the most common errors on websites.  Test your website on all versions of all browsers on Mac&#8217;s and PC&#8217;s.  Test it with a 14.4 modem!  Make sure visitors with physical impairments can access your information.</p>
<p>Your website must be secure.<br />
If you are asking your customers to provide personal information or if you are processing credit card transactions online, your site must be secure.</p>
<p>Your website must be up-to-date.<br />
Why should your visitors return?  Because you&#8217;re constantly providing new information!</p>
<p>Following the above will lead to great returns on business, as well as provide your website with a constantly growing SEO bottom line.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=22" width="1" height="1" style="display: none;" title="Good Internet Citizenship" alt=" Good Internet Citizenship" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/good-internet-citizenship/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Considering AJAX</title>
		<link>http://derekentringer.com/blog/2008/08/21/considering-ajax/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/considering-ajax/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:29:39 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[General Discussion]]></category>

		<category><![CDATA[accessibility]]></category>

		<category><![CDATA[ajax]]></category>

		<category><![CDATA[importance]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=20</guid>
		<description><![CDATA[&#8220;When we were young, we were told that &#8216;Everybody else is doing it&#8217; was a really stupid reason to do something. Now it&#8217;s the standard reason for picking a particular software package.&#8221; &#8212; Barry Gehm
When you make decisions, one strong bias is the bandwagon effect. The idea is that humans often do or think things [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;When we were young, we were told that &#8216;Everybody else is doing it&#8217; was a really stupid reason to do something. Now it&#8217;s the standard reason for picking a particular software package.&#8221; &#8212; Barry Gehm</p>
<p>When you make decisions, one strong bias is the bandwagon effect. The idea is that humans often do or think things just because many others do the same. Now, after convincing yourself that Ajax is something you have to use, be careful not to find artificial excuses to use it. To some people, Ajax is the latest proverbial hammer, and they will use any excuse to find themselves some suitable nails. Remember that Ajax is a tool, not a toy or purpose in itself.</p>
<p>With each new technology that is introduced, people like to experiment and test the tipping point. For instance, when color monitors first came out, a deluge of applications changed their fonts and colors as much as possible, just because they could. No user really wants a mouse trailer, yet a large number of Web designers seem to think that they have to add them to their sites. I feel that, if we&#8217;re not careful, the same phenomenon will happen with Ajax.</p>
<p>Ajax is also fueling a venture capital frenzy. The investment climate for technology startups seems to have become friendly again, and one of the magic keywords these days is Ajax. Collaboration-based startup Zimbraâ„¢, a heavy Ajax user, has already secured $16 million. Other startups are scrambling to claim that they are Ajax-based as a result, to sell more products or receive more attention from investors.</p>
<p>If you find yourself wanting to use Ajax, make a balanced decision about where exactly you think it makes sense, and where it does not.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=20" width="1" height="1" style="display: none;" title="Considering AJAX" alt=" Considering AJAX" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/considering-ajax/feed/</wfw:commentRss>
		</item>
		<item>
		<title>META-Tag Design</title>
		<link>http://derekentringer.com/blog/2008/08/21/meta-tag-design/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/meta-tag-design/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:28:48 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<category><![CDATA[design]]></category>

		<category><![CDATA[meta]]></category>

		<category><![CDATA[tag]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=18</guid>
		<description><![CDATA[A lazy web developer is a good web developer - that is, a clever programmer will save themselves lots of mundane work by automating simple processes. An obvious idea is to write an excellent META Description and use it automatically on every page of your site - better than nothing right?
The problem is, it&#8217;s possible [...]]]></description>
			<content:encoded><![CDATA[<p>A lazy web developer is a good web developer - that is, a clever programmer will save themselves lots of mundane work by automating simple processes. An obvious idea is to write an excellent META Description and use it automatically on every page of your site - better than nothing right?</p>
<p>The problem is, it&#8217;s possible the search result for every page on your site will come out looking the same. This is not what you want - you want your site to cover a range of topics and search phrases, and having 1000 pages that look the same is just asking for Google to treat them as duplicate content.</p>
<p>If you aren&#8217;t able to create a unique META description for every page, it&#8217;s best to leave it blank and let Google create a snippet out of page content. In all fairness, the search engines do a pretty good job of creating relevant snippets. So you should only replace a snippet if you are going to be improving it.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=18" width="1" height="1" style="display: none;" title="META Tag Design" alt=" META-Tag Design" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/meta-tag-design/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Importance of Backlinks</title>
		<link>http://derekentringer.com/blog/2008/08/21/importance-of-backlinks/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/importance-of-backlinks/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:27:55 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[SEO]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=16</guid>
		<description><![CDATA[What are &#8220;backlinks&#8221;? Backlinks are links that are directed towards your website. Also knows as Inbound links (IBL&#8217;s). The number of backlinks is an indication of the popularity or importance of that website. Backlinks are important for SEO because some search engines, especially Google, will give more credit to websites that have a good number [...]]]></description>
			<content:encoded><![CDATA[<p>What are &#8220;backlinks&#8221;? Backlinks are links that are directed towards your website. Also knows as Inbound links (IBL&#8217;s). The number of backlinks is an indication of the popularity or importance of that website. Backlinks are important for SEO because some search engines, especially Google, will give more credit to websites that have a good number of quality backlinks, and consider those websites more relevant than others in their results pages for a search query.</p>
<p>When search engines calculate the relevance of a site to a keyword, they consider the number of quality inbound links to that site. So we should not be satisfied with merely getting inbound links, it is the quality of the inbound link that matters.</p>
<p>A search engine considers the content of the sites to determine the quality of a link. When inbound links to your site come from other sites, and those sites have content related to your site, these inbound links are considered more relevant to your site. If inbound links are found on sites with unrelated content, they are considered less relevant. The higher the relevance of inbound links, the greater their quality.</p>
<p>For example, if a webmaster has a website about how to rescue orphaned kittens, and received a backlink from another website about kittens, then that would be more relevant in a search engine&#8217;s assessment than say a link from a site about car racing. The more relevant the site is that is linking back to your website, the better the quality of the backlink.</p>
<p>In other words, good backlinks equals good SEO.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=16" width="1" height="1" style="display: none;" title="Importance of Backlinks" alt=" Importance of Backlinks" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/importance-of-backlinks/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Benefits of XHTML</title>
		<link>http://derekentringer.com/blog/2008/08/21/benefits-of-xhtml/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/benefits-of-xhtml/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:27:07 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[General Discussion]]></category>

		<category><![CDATA[benefits]]></category>

		<category><![CDATA[html]]></category>

		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=14</guid>
		<description><![CDATA[XHTML is the standard markup language for web documents and the successor to HTML 4. A mixture of classic (HTML) and cutting edge (XML), this hybrid language looks and works much like HTML but is based on XML, the webs markup language, and brings web pages many of XML&#8217;s benefits.
Converting from HTML to XHTML is [...]]]></description>
			<content:encoded><![CDATA[<p>XHTML is the standard markup language for web documents and the successor to HTML 4. A mixture of classic (HTML) and cutting edge (XML), this hybrid language looks and works much like HTML but is based on XML, the webs markup language, and brings web pages many of XML&#8217;s benefits.</p>
<p>Converting from HTML to XHTML is easy, and provides your code with several immediate and long term benefits:</p>
<p>A painless transition to more advanced technology: The web is moving to XML, a powerfully enabling technology. Writing well formed, valid XHTML pages is the easiest way to begin this transition. All it takes is learning a few simple rules of XHTML markup.</p>
<p>Cleaner, more logical markup: XHTML brings uniformity to document structure. The rules of XHTML help restore the structural integrity of documents that was lost during the webs rapid commercial expansion between 1994 and 2001. This is critical for large organizations, whose web pages must interface with logically marked up documents in legacy systems and databases.</p>
<p>Increased interoperability: Unlike old style HTML pages, valid, well formed XHTML documents can easily be transported to wireless devices, Braille readers and other specialized web environments. Moreover, XHTML&#8217;s insistence on clean, rule based markup helps us avoid the kind of errors that can make web pages fail even in traditional browsers like Microsoft Internet Explorer, Netscape Navigator, and Opera browser.</p>
<p>Greater accessibility: Because they follow strict rules and avoid non standard markup, well authored XHTML pages are more accessible than old school HTML pages.</p>
<p>If you want your site to work well in today&#8217;s browsers and non traditional devices, and to continue to work well in tomorrows, it&#8217;s a good idea to author new sites in XHTML, and to convert old pages to XHTML.</p>
 <img src="http://derekentringer.com/blog/wp-content/plugins/feed-statistics.php?view=1&post_id=14" width="1" height="1" style="display: none;" title="Benefits of XHTML" alt=" Benefits of XHTML" />]]></content:encoded>
			<wfw:commentRss>http://derekentringer.com/blog/2008/08/21/benefits-of-xhtml/feed/</wfw:commentRss>
		</item>
		<item>
		<title>What exactly is Ajax?</title>
		<link>http://derekentringer.com/blog/2008/08/21/what-exactly-is-ajax/</link>
		<comments>http://derekentringer.com/blog/2008/08/21/what-exactly-is-ajax/#comments</comments>
		<pubDate>Thu, 21 Aug 2008 16:24:48 +0000</pubDate>
		<dc:creator>Derek J Entringer</dc:creator>
		
		<category><![CDATA[General Discussion]]></category>

		<category><![CDATA[ajax]]></category>

		<category><![CDATA[development]]></category>

		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://derekentringer.com/blog/?p=12</guid>
		<description><![CDATA[Ajax lets Web developers create interactive Web sites that function more like desktop programs rather than static Web sites. Gmail and Google Maps are two of the most common examples of sites built using Ajax. A variety of techniques allow Ajax to place the interactivity directly within the browser, instead of the browser having to [...]]]></description>
			<content:encoded><![CDATA[<p>Ajax lets Web developers create interactive Web sites that function more like desktop programs rather than static Web sites. Gmail and Google Maps are two of the most common examples of sites built using Ajax. A variety of techniques allow Ajax to place the interactivity directly within the browser, instead of the browser having to constantly contact a Web server to get information.</p>
<p>When someone visits an Ajax site, the browser loads the HTML page as it would normally. After that, though, Ajax uses JavaScript for interactivity. When a site visitor makes a request for more information &#8212; for example, to fetch a map &#8212; the JavaScript makes the request. The JavaScript doesn&#8217;t make a request for information directly to a Web site, though &#8212; instead, it uses an API called XMLHttpRequest to transfer the data back and forth. (The data requested is usually in XML format, although it doesn&#8217;t have to be.) This allows the Web page and JavaScript to continue to interact with the user, while the XMLHttpRequest handles communications with the server.</p>
<p>JavaScript takes the information handed to it by the XMLHttpRequest, and then uses it or displays it. But only the porti