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

<channel>
	<title>Delivering Quality</title>
	<atom:link href="http://www.markdeepwell.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.markdeepwell.com</link>
	<description>A Software Developers View of the World</description>
	<lastBuildDate>Wed, 10 Mar 2010 00:35:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>HTTP Header to Force Browser Download</title>
		<link>http://www.markdeepwell.com/2010/03/http-header-to-force-browser-download/</link>
		<comments>http://www.markdeepwell.com/2010/03/http-header-to-force-browser-download/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 15:12:45 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[HTTP Headers]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=485</guid>
		<description><![CDATA[A content disposition header can be used to tell web browsers to ask the user where they want to save the file (and download it) instead of actually opening the file in a browser tab/window. Very handy if you want to have a download button.
Content-Disposition: attachment; filename="filename.mp3"
Tested in: Firefox, Safari, IE, Opera, and Google Chrome
]]></description>
			<content:encoded><![CDATA[<p>A content disposition header can be used to tell web browsers to ask the user where they want to save the file (and download it) instead of actually opening the file in a browser tab/window. Very handy if you want to have a <strong>download</strong> button.</p>
<p><code>Content-Disposition: attachment; filename="filename.mp3"</code></p>
<p>Tested in: Firefox, Safari, IE, Opera, and Google Chrome</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2010/03/http-header-to-force-browser-download/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Session Sharing Among Subdomains</title>
		<link>http://www.markdeepwell.com/2010/03/php-session-sharing-among-subdomains/</link>
		<comments>http://www.markdeepwell.com/2010/03/php-session-sharing-among-subdomains/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 01:14:50 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Session Sharing]]></category>
		<category><![CDATA[Subdomain]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=477</guid>
		<description><![CDATA[PHP supports sharing sessions among subdomains which can be very useful for sharing cookies and sessions among multiple web applications.
I wanted my users to remain logged in while navigating from www.example.com to site1.example.com. By default PHP will treat these domains as two separate sites and users would have to login to each subdomain. 
All you [...]]]></description>
			<content:encoded><![CDATA[<p>PHP supports sharing sessions among subdomains which can be very useful for sharing cookies and sessions among multiple web applications.</p>
<p>I wanted my users to remain logged in while navigating from <strong>www.example.com</strong> to <strong>site1.example.com</strong>. By default PHP will treat these domains as two separate sites and users would have to login to each subdomain. </p>
<p>All you have to do is to either set the following setting in your php.ini file:<br />
<code>session.cookie_domain = .example.com</code></p>
<p>Or, set it from within your code before you create your session:<br />
<code>ini_set("session.cookie_domain", ".example.com");<br />
session_start();</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2010/03/php-session-sharing-among-subdomains/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Validating a Facebook Session Within an iFrame</title>
		<link>http://www.markdeepwell.com/2010/02/validating-a-facebook-session-within-an-iframe/</link>
		<comments>http://www.markdeepwell.com/2010/02/validating-a-facebook-session-within-an-iframe/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 02:18:51 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Web Application]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[iFrame]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=470</guid>
		<description><![CDATA[Facebook takes security seriously and there are many many things a Facebook app cannot do. Sometimes it is necessary to create an iFrame and load the page in to work around Facebook's security model. This example shows how you can continue to use the $facebook->require_login() method while you are inside an iFrame.
Each Facebook request to [...]]]></description>
			<content:encoded><![CDATA[<p>Facebook takes security seriously and there are many many things a Facebook app cannot do. Sometimes it is necessary to create an iFrame and load the page in to work around Facebook's security model. This example shows how you can continue to use the $facebook->require_login() method while you are inside an iFrame.</p>
<p>Each Facebook request to your application contains a number of parameters that you can use to  authenticate if the request really came from Facebook and if the user is actually logged in. These parameters looks like this:</p>
<pre>Array
(
    [fb_sig_in_canvas] =&gt; 1
    [fb_sig_request_method] =&gt; GET
    [fb_sig_friends] =&gt; 12345678,123456789,...
    [fb_sig_locale] =&gt; en_US
    [fb_sig_in_new_facebook] =&gt; 1
    [fb_sig_time] =&gt; 1265247656.6432
    [fb_sig_added] =&gt; 1
    [fb_sig_profile_update_time] =&gt; 1261813927
    [fb_sig_expires] =&gt; 1265248900
    [fb_sig_user] =&gt; 1234567
    [fb_sig_session_key] =&gt; 2.18zPq2sNPEE6sn0wpMLc5w__.3600.1265248800-1234567
    [fb_sig_api_key] =&gt; ab6c2d2604ae9604be0efef88315c53e
    [fb_sig_app_id] =&gt; 289424642699
    [fb_sig] =&gt; 575ed0ccd0c9b3ea2d5d7c5417187de6
)
</pre>
<p>If you create an iFrame in your facebook page, the parameters will be passed to the iFrame but by will not automatically be passed from one request to the next. Once the user clicks on a link or you try to do an ajax request, you will not be able to validate the user. The simple trick to keep the authorization is to pass the fb_sig_* parameters to request. A handy PHP function like this will help:</p>
<div class="igBar"><span id="lphp-2"><a href="#" onclick="javascript:showPlainTxt('php-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-2">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#000000; font-weight:bold;">function</span> fb_vars<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000FF;">$fb_vars</span> = <a href="http://www.php.net/array"><span style="color:#000066;">array</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#616100;">foreach</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$_GET</span> <span style="color:#616100;">as</span> <span style="color:#0000FF;">$key</span> =&gt; <span style="color:#0000FF;">$value</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#006600; font-weight:bold;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#616100;">if</span> <span style="color:#006600; font-weight:bold;">&#40;</span><a href="http://www.php.net/strpos"><span style="color:#000066;">strpos</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF;">$key</span>, <span style="color:#FF0000;">"fb_sig"</span><span style="color:#006600; font-weight:bold;">&#41;</span> !== <span style="color:#000000; font-weight:bold;">false</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#123;</span>&nbsp; &nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color:#0000FF;">$fb_vars</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#0000FF;">$key</span>.<span style="color:#FF0000;">"="</span>.<span style="color:#0000FF;">$value</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span>&nbsp; &nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#616100;">return</span> <a href="http://www.php.net/implode"><span style="color:#000066;">implode</span></a><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#FF0000;">'&amp;'</span>, <span style="color:#0000FF;">$fb_vars</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>If you append the result of that function to the query string of each request, the $facebook-&gt;require_login() call and the $facebook-&gt;validate_fb_params() can then successfully validate if your user is from Facebook.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2010/02/validating-a-facebook-session-within-an-iframe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building for Mobile with Device Orientation</title>
		<link>http://www.markdeepwell.com/2010/01/building-for-mobile-with-device-orientation/</link>
		<comments>http://www.markdeepwell.com/2010/01/building-for-mobile-with-device-orientation/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 16:54:29 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Web Application]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Device Orientation]]></category>
		<category><![CDATA[Fennec]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=460</guid>
		<description><![CDATA[Mozilla Firefox 3.5 and Firefox for Mobile 1.0 (Fennec) both have support for modifying a web applications look based on screen dimensions and current orientation. These abilities give web developers the power to build better web applications for mobile devices and the ability to optimize the browsing experience when screen space is constrained.
CSS Orientation Properties
Web [...]]]></description>
			<content:encoded><![CDATA[<p>Mozilla Firefox 3.5 and Firefox for Mobile 1.0 (Fennec) both have support for modifying a web applications look based on screen dimensions and current orientation. These abilities give web developers the power to build better web applications for mobile devices and the ability to optimize the browsing experience when screen space is constrained.</p>
<h3>CSS Orientation Properties</h3>
<p>Web applications look and feel is defined by a CSS file, so therefore the Firefox developers made it super easy to tie current orientation and screen dimensions into which CSS file to load.</p>
<p>For examaple: If the browser is in portrait mode, a single CSS media parameter will specify which styles to use:</p>
<div class="igBar"><span id="ljavascript-7"><a href="#" onclick="javascript:showPlainTxt('javascript-7'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVASCRIPT:</span>
<div id="javascript-7">
<div class="javascript">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">@media all and <span style="color: #66cc66;">&#40;</span>orientation: portrait<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> ... <span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>In the same way, you can create a custom CSS stylesheet for users who are browsing with a screen size between 500 and 700 pixels:</p>
<div class="igBar"><span id="ljavascript-8"><a href="#" onclick="javascript:showPlainTxt('javascript-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVASCRIPT:</span>
<div id="javascript-8">
<div class="javascript">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">@media screen and <span style="color: #66cc66;">&#40;</span>min-width: 500px<span style="color: #66cc66;">&#41;</span> and <span style="color: #66cc66;">&#40;</span>max-width: 700px<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> ... <span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<h3>Orientation Events</h3>
<p>Firefox 3.6 adds support for orientation events in JavaScript, so you can get current updates of how the user is holding their mobile device:</p>
<div class="igBar"><span id="ljavascript-9"><a href="#" onclick="javascript:showPlainTxt('javascript-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVASCRIPT:</span>
<div id="javascript-9">
<div class="javascript">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">window.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #3366CC;">"MozOrientation"</span>, handleOrientation, <span style="color: #003366; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>; </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Once you register the event handler, the handleOrientation function will receive an object specifying the x, y, and z value of the devices current position:</p>
<div class="igBar"><span id="ljavascript-10"><a href="#" onclick="javascript:showPlainTxt('javascript-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">JAVASCRIPT:</span>
<div id="javascript-10">
<div class="javascript">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #003366; font-weight: bold;">function</span> handleOrientation<span style="color: #66cc66;">&#40;</span>orientData<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #003366; font-weight: bold;">var</span> x = orientData.<span style="color: #006600;">x</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #003366; font-weight: bold;">var</span> y = orientData.<span style="color: #006600;">y</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #003366; font-weight: bold;">var</span> z = orientData.<span style="color: #006600;">z</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>With those parameters and a game timer, you can probably build the <a href="http://www.turbosquid.com/FullPreview/Index.cfm/ID/275316">Labyrinth game</a>.</p>
<p>For those of your that are ready to start experimenting with this API right away, Mozilla Developer Center has the full <a href="https://developer.mozilla.org/en/Detecting_device_orientation">Firefox orientation documentation</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2010/01/building-for-mobile-with-device-orientation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Cost of Endorsing H.264</title>
		<link>http://www.markdeepwell.com/2010/01/the-cost-of-endorsing-h-264/</link>
		<comments>http://www.markdeepwell.com/2010/01/the-cost-of-endorsing-h-264/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 18:20:52 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[H.264]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Ogg Theora]]></category>
		<category><![CDATA[Open Web]]></category>
		<category><![CDATA[Vimeo]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=454</guid>
		<description><![CDATA[As you've probably heard, both YouTube and Vimeo have released beta support to their massively popular websites to play videos using the HTML5 video tag instead of Flash. While I am glad the video sites are finally switching to the native HTML video tag, I am perplexed why they have gone with the non-free option.
Firefox, [...]]]></description>
			<content:encoded><![CDATA[<p>As you've probably heard, both <a href="http://www.youtube.com/html5">YouTube</a> and <a href="http://www.vimeo.com/blog:268">Vimeo</a> have released beta support to their massively popular websites to play videos using the <a href="http://www.markdeepwell.com/2009/07/importance-of-the-html-video-tag/">HTML5 video tag</a> instead of Flash. While I am glad the video sites are <strong>finally</strong> switching to the native HTML video tag, I am perplexed why they have gone with the non-free option.</p>
<p>Firefox, Safari, Google Chrome, and soon Opera all support the HTML5 video tag with the ability to play Ogg Theora encoded videos (except Safari). On the other hand, H.264 is only supported by Google Chrome and Safari. Both of these formats do the same thing, they specify a compression standard that allows for efficient playback at relatively small file sizes. There are a number of technical differences, but generally, they <a href="http://people.xiph.org/~greg/video/ytcompare/comparison.html">preform relatively the same</a>. The big difference between the two is that Ogg Theora is royalty free and available for anybody to use, while H.264 is encumbered by patents held by the MPEG LA association. This same organization will charge anybody who uses it a <a href="http://www.streaminglearningcenter.com/articles/h264-royalties-what-you-need-to-know.html">hefty royalty fee</a> starting in 2011.</p>
<p>If you have a personal blog and want to put a video on your website using H.264 this means you need to have to hire a lawyer to create a deal with the MPEG LA to allow you to use their codec. This will either cost you a lot of money, or they will not allow you to do it. They do have the right to simply deny you if they don't feel like it.</p>
<p>However, if you use the open <a href="http://www.theora.org/">Ogg Theora</a> format, you are free to simply upload the video to your website to start using it, the same as uploading an image. Ogg Theora is not covered by any patents and is royalty free.</p>
<p>I don't understand why both YouTube and Vimeo are both going the non-free route. Is it simply because they have the money to pay MPEG LA? Whatever the case, endorsing H.264 encoded videos as the format for video on the web is an option for large companies with money to pay, but it's completely the wrong choice for  blog writers and any small or medium sized organization.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2010/01/the-cost-of-endorsing-h-264/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook vs You!</title>
		<link>http://www.markdeepwell.com/2009/12/facebook-vs-you/</link>
		<comments>http://www.markdeepwell.com/2009/12/facebook-vs-you/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 06:31:49 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Web Application]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Facebook App]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=445</guid>
		<description><![CDATA[Have you had the... how should I describe it... experience of writing a Facebook application? No? OK, here's an introduction to what you can expect.
When developing an application you must learn Rule #1 Facebook is the gatekeeper. Everything you do, be it HTML, CSS or JavaScript, is restricted by Facebook. Only the commands, functions, CSS [...]]]></description>
			<content:encoded><![CDATA[<p>Have you had the... how should I describe it... <strong>experience</strong> of writing a Facebook application? No? OK, here's an introduction to what you can expect.</p>
<p>When developing an application you must learn Rule #1 <strong>Facebook is the gatekeeper</strong>. Everything you do, be it HTML, CSS or JavaScript, is restricted by Facebook. Only the commands, functions, CSS properties, HTML tags etc. that Facebook allows are permissible. If you have an error in your HTML such as an unclosed tag or if you try to use a CSS property that does not exist, Facebook will render a very nice message saying you made an error.</p>
<p>Rule #2 <strong>The never ending cycle</strong>. The Facebook platform is constantly changing and APIs that you are using in your application could disappear one day without any notice. It's the life of a Facebook application, working one instant, inexplicably broken the next. Be prepared for irregular maintenance just to keep your application working.</p>
<p>A Facebook Application  lives in the world of Facebook and while it might initially seem  like you're developing a standard web application you are not. Rule #3 <strong>You're application is on the Facebook web</strong>. It's not a regular web application which is a very slight but critical distinction. Facebook has used their powers as the gatekeeper to make modifications to the web. Some HTML tags are allowed, some are not. <a href="http://wiki.developers.facebook.com/index.php/FBJS#FBJS_DOM_Objects">JavaScript has been altered</a> to remove a lot of its power and replace only some of them with Facebook specific functions and even CSS has restrictions. Don't expect existing code to function when placed in the Facebook web.</p>
<h3>Additional Caveats</h3>
<ul>
<li>You cannot include any external JavaScript or style sheet files, they must be included in-line. This is so Facebook can parse them and allow only approved commands. Yes it enhances the security of the social networking site as a whole, but it will slow down your development time.</li>
<li>Facebook will filter, compile, and drastically alter your original code. Clicking view-source on a Facebook page with your application will show your JavaScript code mushed into awkward Facebook functions.</li>
</ul>
<p>Do you see that it's a bit of a battle of you against the mighty Facebook? Don't sweat too much, other developers have persevered and with a few wounds and time you can build and maintain a successful Facebook application. Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2009/12/facebook-vs-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UpcomingHoliday.com Now with Geolocation</title>
		<link>http://www.markdeepwell.com/2009/12/upcomingholiday-com-now-with-geolocation/</link>
		<comments>http://www.markdeepwell.com/2009/12/upcomingholiday-com-now-with-geolocation/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 06:27:40 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Web Application]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Geolocation]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Safari]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=440</guid>
		<description><![CDATA[UpcomingHoliday.com has been updated and now includes geolocation support. If your browser supports it your country should automatically find and select your country. If not, it will fall back to IP based country lookup. Geolocation is a HTML 5 feature that is supported by Safari on the iPhone 3.0 OS, Firefox 3.5 and Google Chrome.
UpcomingHoliday.com [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://upcomingholiday.com">UpcomingHoliday.com</a> has been updated and now includes <a href="http://dev.w3.org/geo/api/spec-source.html">geolocation</a> support. If your browser supports it your country should automatically find and select your country. If not, it will fall back to IP based country lookup. Geolocation is a HTML 5 feature that is supported by Safari on the iPhone 3.0 OS, Firefox 3.5 and Google Chrome.</p>
<p>UpcomingHoliday.com is an application that tells you what and when your <a href="http://upcomingholiday.com">next federal holiday</a> is. Currently it's available for people in: Australia, Canada, France, Germany, India,  Nigeria, United Kingdom and United States.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2009/12/upcomingholiday-com-now-with-geolocation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quality Software @ Thirdi</title>
		<link>http://www.markdeepwell.com/2009/12/quality-software-thirdi/</link>
		<comments>http://www.markdeepwell.com/2009/12/quality-software-thirdi/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 04:55:09 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Software Quality]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=434</guid>
		<description><![CDATA[I work at Thirdi  Software, and one of the initiatives I started was a Quality  Software @ Thirdi email newsletter and series of blog posts  highlighting quality solutions to software problems. It’s mostly  targeted at developers but there’s also some insights to be had for the  quality assurance team and [...]]]></description>
			<content:encoded><![CDATA[<p>I work at <a onclick="javascript:pageTracker._trackPageview('/outbound/article/http://www.thirdi.com');" href="http://www.thirdi.com/">Thirdi  Software</a>, and one of the initiatives I started was a <strong>Quality  Software @ Thirdi</strong> email newsletter and series of blog posts  highlighting quality solutions to software problems. It’s mostly  targeted at developers but there’s also some insights to be had for the  quality assurance team and for project managers.</p>
<p>The posts were originally posted on <a onclick="javascript:pageTracker._trackPageview('/outbound/article/http://senses.thirdi.com');" href="http://senses.thirdi.com/">Senses</a> and reproduced here for archival purposes. They touch on a lot of basic information for software developers including software design, upcoming technologies and useful tips to make your life easier.</p>
<p>Check the <a href="/quality-software/">Quality Software</a> page for links to each article.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2009/12/quality-software-thirdi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Wave Giveaway</title>
		<link>http://www.markdeepwell.com/2009/11/google-wave-giveaway/</link>
		<comments>http://www.markdeepwell.com/2009/11/google-wave-giveaway/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 02:12:35 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=401</guid>
		<description><![CDATA[Does anybody want a google wave invite? Leave a comment and the first people to respond will get one.
]]></description>
			<content:encoded><![CDATA[<p>Does anybody want a google wave invite? Leave a comment and the first people to respond will get one.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2009/11/google-wave-giveaway/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>What is Quality Software</title>
		<link>http://www.markdeepwell.com/2009/11/what-is-quality-software/</link>
		<comments>http://www.markdeepwell.com/2009/11/what-is-quality-software/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 06:49:31 +0000</pubDate>
		<dc:creator>Mark</dc:creator>
				<category><![CDATA[Software Quality]]></category>
		<category><![CDATA[quality]]></category>

		<guid isPermaLink="false">http://www.markdeepwell.com/?p=392</guid>
		<description><![CDATA[The applications we use that are true quality are the ones that we hardly notice. Quality software has an intrinsic property of not getting in the way and allowing the user to focus on their action, instead of focusing on the application.]]></description>
			<content:encoded><![CDATA[<p>I'm a software developer and one of my major focuses and motivations is to develop quality software. I refuse to build software that is hacky, <a href="http://thedailywtf.com/">down right crummy</a> or falls over under a bit of stress. Yes I live in the real world and sometimes deadlines demand shortcuts, but most of the time I'm very proud of the software I create.</p>
<p>So what are the visible user centred differences between high and low quality software?</p>
<p>It's quite easy to see when <strong>software is shoddy</strong>. This could be <a href="http://www.neowin.net/news/main/08/04/22/vista-doesn39t-suck-oem39s-crapware-sucks33">OEM  bundled software</a>, <a href="http://www.codinghorror.com/blog/archives/000734.html">custom intranet applications</a>, or even a well known <a href="http://www.oracle.com/">enterprise product</a> that has taken over the market. I'm sure you have memories where software blue screened or stopped working before you could save the document. Applications that were not throughly tested by QA and were not written with a clear understanding of the business requirements are loaded with bugs. When these software applications are used in the real world the bugs appear and cause intense frustration to the poor users.</p>
<p>The applications we use that are <strong>true quality</strong> are the ones that we hardly notice. Quality software has an intrinsic property of not getting in the way and allowing the user to focus on their action, instead of focusing on the application. It's as simple as that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.markdeepwell.com/2009/11/what-is-quality-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
