<?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>Andrew Odri &#187; miscellaneous</title>
	<atom:link href="http://blog.affirmix.com/category/miscellaneous/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.affirmix.com</link>
	<description>Flash Platform and Dreamweaver Stuff</description>
	<lastBuildDate>Sat, 21 Jan 2012 03:13:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Change the Font Size of Messages in Gmail with Google Chrome</title>
		<link>http://blog.affirmix.com/2012/01/20/change-the-font-size-of-messages-in-gmail-with-google-chrome/</link>
		<comments>http://blog.affirmix.com/2012/01/20/change-the-font-size-of-messages-in-gmail-with-google-chrome/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 03:11:21 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[font family]]></category>
		<category><![CDATA[font size]]></category>
		<category><![CDATA[gmail]]></category>
		<category><![CDATA[google apps]]></category>
		<category><![CDATA[google chrome]]></category>
		<category><![CDATA[google mail]]></category>
		<category><![CDATA[message]]></category>
		<category><![CDATA[stylesheet]]></category>
		<category><![CDATA[text size]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[user stylesheet]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=410</guid>
		<description><![CDATA[This is a very easy way to force all messages to be rendered with the same font family and size in Gmail without having to install a browser extension. Perhaps you are like me and are now sick of receiving emails with text so massive you cannot read them; this should help you out. In [...]]]></description>
			<content:encoded><![CDATA[<p>This is a very easy way to force all messages to be rendered with the same font family and size in Gmail without having to install a browser extension. Perhaps you are like me and are now sick of receiving emails with text so massive you cannot read them; this should help you out.</p>
<p><span id="more-410"></span></p>
<p>In Google Chrome (and almost every other browser) you have the ability to define a user stylesheet that will be applied to every page by default. By adding a style that forces every element in the email to conform to the same font family and size, you will consistent looking emails in your browser without a massive overhead.</p>
<ol>
<li>First, locate your user stylesheet file.
<ul>
<li>On Mac OS X, this can be found at <code>~/Library/Application Support/Google/Chrome/Default/User StyleSheets/Custom.css</code>.</li>
<li>On Windows 7, it can be found at <code>C:\Users\Username\AppData\Local\Google\Chrome\User Data\Default\User StyleSheets\Custom.css</code>.</li>
</ul>
</li>
<li>Open this file, and paste the following text into it:
<pre><code>.aao .nH .ii, .aao .nH .ii * {
     font-size: 12px ! important;
     font-family: monospace ! important;
}</code></pre>
</li>
<li>Save the file, open Google Chrome, log in to your Gmail account, and open any message.</li>
</ol>
<p>Of course, the font family and size can be replaced with whatever values you prefer. I hope this helps save you some time and frustration!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2012/01/20/change-the-font-size-of-messages-in-gmail-with-google-chrome/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Saint Lucian Government Leaks Personal Data Of Every Voting Resident</title>
		<link>http://blog.affirmix.com/2011/04/27/saint-lucian-government-leaks-personal-data-of-every-voting-resident/</link>
		<comments>http://blog.affirmix.com/2011/04/27/saint-lucian-government-leaks-personal-data-of-every-voting-resident/#comments</comments>
		<pubDate>Wed, 27 Apr 2011 18:49:52 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[caricom]]></category>
		<category><![CDATA[commonwealth]]></category>
		<category><![CDATA[data leak]]></category>
		<category><![CDATA[govenment]]></category>
		<category><![CDATA[information security]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[personal information]]></category>
		<category><![CDATA[risk]]></category>
		<category><![CDATA[saint lucia]]></category>
		<category><![CDATA[security breach]]></category>
		<category><![CDATA[st lucia]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=388</guid>
		<description><![CDATA[UPDATE: A small snapshot of the leaked data has been attached. There has been no action from the government or the media. I hope this article can build awareness that results in better protection of citizens data. A couple of months ago I discovered an issue on a website operated by the government of Saint [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://api.photoshop.com/v1.0/accounts/ef38c0dde81745679f534f6507a6abff/assets/b58062b906594b53933a5c3f0554e914/renditions/1024.jpg?md=1309977836000" alt="Anonymous logo and Saint Lucian flag" /></p>
<p>UPDATE: A small snapshot of the leaked data has been attached. There has been no action from the government or the media. I hope this article can build awareness that results in better protection of citizens data.</p>
<p>A couple of months ago I discovered an issue on a website operated by the government of Saint Lucia. I have contact the authorities, but to date, there has been no response. For the security of the current and former residents of Saint Lucia, I think that it is necessary to draw some attention to this issue, without revealing the actual leak and exploits. <span id="more-388"></span></p>
<p>The issue exposes personally identifiable information, such as the individual&#8217;s <em>full name</em>, <em>where they live</em>, their <em>occupation</em> and their registration number. What is the most alarming is that registration number is also a portion of their <em>national id card number</em>.</p>
<p>Please see below for a sampling of one of the emails directed to the Saint Lucian government:</p>
<blockquote>
<p>It appears that extremely minimal security exists on the electoral.gov.lc domain &#8230;By far the most obvious and gaping security hole is the exposure of what should be sensitive PDF files containing personally identifiable information. This is in violation of your own privacy policy (www.electoral.gov.lc/privacy.htm), and for commonwealth citizens living in your country, most likely CariCom and Commonwealth information security policies. While this information is posted for a time publicly around the island (which in itself is questionable), having it freely available to world at large on the internet presents a whole new series of dangers. A small sample of these PDF files are listed below:</p>
<ul>
<li>http://www.electoral.gov.lc/voterslists%5C2009_supp%5CSecondHalf%5CA1-Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5Crevised_2010%5CA1_Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5C2009_supp%5CSecondHalf%5CA2-Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5Crevised_2010%5CA2_Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5C2009_supp%5CSecondHalf%5CA3-Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5Crevised_2010%5CA3_Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5C2009_supp%5CSecondHalf%5CB1-Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5Crevised_2010%5CB1_Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5C2009_supp%5CSecondHalf%5CB2-Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5Crevised_2010%5CB2_Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5C2009_supp%5CSecondHalf%5CB3-Voters%20List.pdf</li>
<li>http://www.electoral.gov.lc/voterslists%5Crevised_2010%5CAB3_Voters%20List.pdf</li>
</ul>
<p>&#8230;Additionally, I have used publicly exposed information to perform a basic security audit of the electoral.gov.lc domain. It appears that you are running a Windows 2000 server with IIS 5.0 web server. It has Frontpage Extensions are turned on and in use. Also, it appears that MySQL is being used as database software on this server as well, and default ports are open. I have not attempted any connections beyond using default username and password combinations, which at the very least seem to have been changed, but this configuration alone is extremely vulnerable to attack using widely publicized exploits, simply because it is out of date (IIS 5.0), using an unsupported database in Microsoft&#8217;s eyes (MySQL; they do not release patches for this configuration), and is an insecure (Frontpage Extensions) configuration. Generally this would be an issue in itself, but there does not appear to be an adequate firewall protecting sensitive ports.</p>
</blockquote>
<p>Finding this information is surprisingly easy: <a href="http://www.google.com/search?q=site%3Aelectoral.gov.lc+%22voters+list%22" target="_blank" title="Google Search results for site:electoral.gov.lc \"voters list\"">Simply conduct this Google search</a>.</p>
<p>Why would this be an issue? Well, suppose a thief wanted to steal a large sum of money. A list with every single resident of the country and their occupation would certainly help narrow down wealthy potential targets. Through the use of public phonebooks and social networks much more information could be gathered, because the individuals location and full name make them personally identifiable. Additionally, calling a bank and asking for a money transfer will generally result in security confirmation questions being asked. Many times, what do these involve? Relatives (available on the list), location (made possible by the list and the public phonebook), telephone number (made possible by the list and the public phonebook), and identification numbers (available on the list).</p>
<p>The servers hosting this information are also running severely outdated software. Using publicly available exploits to gain access to the server would allow free access these databases. This also presents a national security risk.</p>
<p>This is clearly an issue for individual Saint Lucians and the Saint Lucian government. Regarding foreign nationals who at one time lived in Saint Lucia, the Saint Lucian government could also be liable, and could possibly risk it&#8217;s compliance with CARICOM and Commonwealth information security policies.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2011/04/27/saint-lucian-government-leaks-personal-data-of-every-voting-resident/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Translate Widget Now Available</title>
		<link>http://blog.affirmix.com/2011/02/09/google-translate-widget-now-available/</link>
		<comments>http://blog.affirmix.com/2011/02/09/google-translate-widget-now-available/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 19:02:44 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[chinese traditional]]></category>
		<category><![CDATA[french]]></category>
		<category><![CDATA[german]]></category>
		<category><![CDATA[google translate]]></category>
		<category><![CDATA[italian]]></category>
		<category><![CDATA[language]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=376</guid>
		<description><![CDATA[I have noticed that more than 20% of visitors to this site do not have browser language set to English. Many of you manually cut and paste the page you are looking for into Google Translate. In order to make translation easier, I have added the Google Translator tool to the top-right of every page [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://api.photoshop.com/v1.0/accounts/ef38c0dde81745679f534f6507a6abff/assets/b4e48203e2f946a69bd88515374e2f63/renditions/1024.jpg?md=1309973337000" alt="Google Translate iOS icon and Google Translate logo" /></p>
<p xml:lang="en">I have noticed that more than 20% of visitors to this site do not have browser language set to English. Many of you manually cut and paste the page you are looking for into <a href="http://translate.google.com/" target="_blank" title="Google Translate product page">Google Translate</a>. In order to make translation easier, I have added the Google Translator tool to the top-right of every page in this site :) I would love to know if this has been of benefit to you! <span id="more-376"></span></p>
<p xml:lang="de">Ich habe bemerkt, dass mehr als 20% der Besucher dieser Website nicht über Browser-Sprache auf Englisch eingestellt. Viele von Ihnen manuell Ausschneiden und Einfügen der Seite Sie suchen in <a href="http://translate.google.com/" target="_blank" title="Google Übersetzen Produkt page">Google Translate</a>. Um Übersetzung einfacher, ich habe die Google Translator Tool, um die rechts oben auf jeder Seite hat in dieser Site :) Ich würde gerne wissen, ob dies von Vorteil für Sie wurde!</p>
<p xml:lang="fr">J&#8217;ai remarqué que plus de 20% des visiteurs de ce site n&#8217;ont pas la langue du navigateur mis à l&#8217;anglais. Beaucoup d&#8217;entre vous manuellement copier et coller la page que vous recherchez dans <a href="http://translate.google.com/" target="_blank" title="Google Traduire produit page">Google Translate</a>. Afin de faciliter la traduction, j&#8217;ai ajouté l&#8217;outil Google Translator à la partie supérieure droite de chaque page de ce site :) J&#8217;aimerais savoir si cela a été bénéfique pour vous!</p>
<p xml:lang="zh-tw">我注意到，20％以上的遊客到這個網站沒有瀏覽器的語言設置為英語。許多您手動剪切和粘貼網頁您正在尋找到<a href="http://translate.google.com/" target="_blank" title="Google翻譯產品 page">谷歌翻譯</a>。為了使譯文更容易，我已經加入了谷歌翻譯工具右上角的每一頁在這個網站：）我很想知道這一直是你的好處！</p>
<p xml:lang="it">Ho notato che oltre il 20% dei visitatori di questo sito non hanno la lingua del browser impostata su inglese. Molti di voi manualmente tagliare e incollare la pagina che stai cercando in <a href="http://translate.google.com/" target="_blank" title="Google Traduci prodotto page">Google Translate</a>. Al fine di rendere la traduzione più semplice, ho aggiunto lo strumento di Google Translator in alto a destra di ogni pagina di questo sito :) Mi piacerebbe sapere se questo è stato di beneficio per voi!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2011/02/09/google-translate-widget-now-available/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How To Enable Outlook Public Folders In Google Apps</title>
		<link>http://blog.affirmix.com/2011/02/08/how-to-enable-outlook-public-folders-in-google-apps/</link>
		<comments>http://blog.affirmix.com/2011/02/08/how-to-enable-outlook-public-folders-in-google-apps/#comments</comments>
		<pubDate>Tue, 08 Feb 2011 22:28:04 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[calendars]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[codetwo]]></category>
		<category><![CDATA[contacts]]></category>
		<category><![CDATA[exchange]]></category>
		<category><![CDATA[file sharing]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google apps]]></category>
		<category><![CDATA[google docs]]></category>
		<category><![CDATA[harmon.ie]]></category>
		<category><![CDATA[insync]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[outlook]]></category>
		<category><![CDATA[public folders]]></category>
		<category><![CDATA[tasks]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=350</guid>
		<description><![CDATA[One the most requested features in Google Apps for companies switching from Microsoft Exchange is the ability to provide access to public folders in Outlook. Fortunately, just about all of the features available in public folders can be made available online and in Outlook with a bit of ingenuity. If you truly need public folders [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://api.photoshop.com/v1.0/accounts/ef38c0dde81745679f534f6507a6abff/assets/b7ef12f211af4057b9307963a1432e11" alt="Google logo and Google Apps for Business product icons" /></p>
<p>One the most requested features in Google Apps for companies switching from Microsoft Exchange is the ability to provide access to <a href="http://office.microsoft.com/en-us/outlook-help/explore-public-folders-HA001034777.aspx" target="_blank" title="Features of public folders in Outlook">public folders in Outlook</a>. Fortunately, just about all of the features available in public folders can be made available online and in Outlook with a bit of ingenuity. <span id="more-350"></span></p>
<p>If you truly need public folders exactly the same as Microsoft Exchange, an excellent solution has been provided by CodeTwo, with their <a href="http://www.codetwo.com/public-folders/" target="_blank" title="CodeTwo Public Folders product page">Public Folders</a> product. Rather than requiring the purchase, configuration, and maintenance of a Microsoft Exchange server, all you need is an instance of Outlook with the CodeTwo Public Folders server installed on the local network. Everything else you need is provided by Google Apps. There are two main drawbacks to this approach: public folders are not available on the Google web interface, and <a href="http://www.codetwo.com/public-folders/pricing/" target="_blank" title="CodeTwo Public Folders pricing">CodeTwo Public Folders costs $160, plus ~$40 per user</a>.</p>
<p>However, it is possible to replicate almost all of public folder&#8217;s features quiet nicely with Google Apps and a few productivity tools. Lets start by examining each feature of public folders according to Microsoft, and how it can be provided in Google Apps.</p>
<h3>Share files</h3>
<p>You may be aware that you can <a href="http://googleblog.blogspot.com/2010/01/upload-your-files-and-access-them.html" target="_blank" title="Google blog post announcing support for all file types">upload any type of file to Google Docs</a>, not just documents. However, the problem with Google Docs is the rather irritating process of uploading and sharing files, especially if your clients are used to accessing these files in public folders.</p>
<p>There are 2 tools that make this process far easier: <a href="https://www.insynchq.com/" target="_blank" title="InSync homepage">InSync</a> for OS integration, and <a href="http://harmon.ie/GoogleDocs/Product" target="_blank" title="Harmon.ie for GDocs product page">Harmon.ie</a> for Outlook integration. If you have ever used Dropbox, InSync will be extremely familiar. It sets up a folder/drive (depending on your operating system) which give you direct access to all the files stored in Google Docs. It allows you to drag and drop files in and out of you Google Docs, and access these files in all your native applications. Harmon.ie allows a user to access all of their Google Docs from within Outlook itself and <a href="http://www.pcworld.com/article/191064/google_docs_now_syncing_with_outlook.html" target="_blank" title="">has a ton of great features</a> that, in my opinion, add a lot more functionality that native public folders anway.</p>
<h3>Share calendars, contacts, and tasks</h3>
<p>This process is extremely easy, as Google has provided the <a href="http://mail.google.com/support/bin/answer.py?hl=en&#038;answer=156588" target="_blank" title="The Google Apps Sync for Microsoft Outlook plug-in download page">Google Apps Sync for Microsoft Outlook plug-in</a>, which configures calendar, contact, and task sharing automatically. However, there is one minor caveat when it comes to syncing notes, tasks, and journals: the data will be stored on Google&#8217;s servers, but <a href="http://mail.google.com/support/bin/answer.py?hl=en&#038;answer=156588" target="_blank" title="Outlook notes, tasks, and journal sync">will not appear on the web interface</a>. Please read the <a href="http://mail.google.com/support/bin/topic.py?topic=23333" target="_blank" title="The Google Apps Sync for Microsoft Outlook support page">Google Apps Sync for Microsoft Outlook support page</a> for more information.</p>
<h3>Centralize shared information</h3>
<p>The methods we have discussed describe how to <em>access</em> the information, but it doesn&#8217;t tell us how to <em>share</em and <em>store</em> it. There is one easy way to centralize all the information that you want to share: <a href="http://www.google.com/support/a/bin/answer.py?hl=en&#038;answer=33310" target="_blank" title="How to add a new user in Google Apps">add a new user</a> called public. When you configure Outlook for the first time, use Google Apps Sync to configure the user&#8217;s account first, and then configure the public account second. When configuring InSync/Harmon.ie for file sharing and access within Outlook, simply configure public account here as well. If there is an email that a user feels should be shared with the organization, they can drag a copy of it from their own mailbox into the public folder, and everyone will have access to it.</p>
<h3>Track and archive information </h3>
<p>The <a href="http://office.microsoft.com/en-us/outlook-help/explore-public-folders-HA001034777.aspx" target="_blank" title="The Microsoft Outlook 2002 public folders page">Outlook public folders page</a> describes this functionality:</p>
<p><quote>Using the By Conversation Topic view of public folders, you can track responses to posts and the frequency of those responses. When a post becomes dated, you can archive the information using the AutoArchive feature in Microsoft Outlook.</quote></p>
<p>The exact same functionality will be available both within Outlook and the Google Apps web interface. In my opinion, the Google Apps web interface is actually superior when it comes to grouping conversations. Of course, the archive feature in Google Apps web interface is also just as slick.</p>
<h3>Help protect information</h3>
<p>This approach lacks any real support for access right and permissions within the organization. If you need internal access control, one possible approach you could take is creating separate folders for each group of users: for example, you might add a user called managers, another called accounts, and another called staff, and only configure these for the relevant Outlook users.</p>
<h3>Conduct online discussions</h3>
<p>This is another area this approach lacks any real support. That said, online discussions are poorly implemented Microsoft Exchange as well. For real online discussions, perhaps consider <a href="http://www.google.com/apps/intl/en/business/groups.html" target="_blank" title="Google Groups for Business">Google Groups</a>, and some of Google Apps <a href="http://www.google.com/apps/intl/en/business/messaging.html" target="_blank" title="Messaging applications">other messaging applications</a>. Google Wave was an excellent collaboration tool, but unfortunately it is <a href="http://googleblog.blogspot.com/2010/08/update-on-google-wave.html" target="_blank" title="Google announcement that they will discontinue development of Google Wave">no longer available</a> in Google apps.</p>
<h3>Final thoughts</h3>
<p>For small to medium sized organizations, Google apps has the potential to save a lot of money, and removes all the headaches involved with maintaining an email server like Microsoft Exchange. In the case of this second approach, tools like Harmony can actually improve the way users work. If you need public folders, and you want to save money, then this is an excellent approach. If you have been through this process before and found your own solutions, then please let everyone know in the comments <img src='http://blog.affirmix.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2011/02/08/how-to-enable-outlook-public-folders-in-google-apps/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>XULRunner &#8211; Adobe AIR&#8217;s Grandad</title>
		<link>http://blog.affirmix.com/2009/02/11/xulrunner-adobe-airs-grandad/</link>
		<comments>http://blog.affirmix.com/2009/02/11/xulrunner-adobe-airs-grandad/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 19:50:16 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[fennec]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[xul]]></category>
		<category><![CDATA[xulrunner]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=144</guid>
		<description><![CDATA[XULRunner is a project that has been around since the inception of Firefox, and predates Adobe AIR by quiet a margin. For those who have not really looked into it too much, XULRunner has a lot of similarities to Adobe AIR &#8211; it is a cross platform runtime that allows you to run code written [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://api.photoshop.com/home_ef38c0dde81745679f534f6507a6abff/adobe-px-assets/219a0510d50b4a4b8b9ab8f0765c3dde" alt="Mozilla" /></p>
<p>XULRunner is a project that has been around since the inception of Firefox, and predates Adobe AIR by quiet a margin. For those who have not really looked into it too much, XULRunner has a lot of similarities to Adobe AIR &#8211; it is a cross platform runtime that allows you to run code written in XUL &#8211; an XML derivative very similar to HTML.</p>
<p>A little more information: XUL elements add certain features that are required to add things like menus, menu items, toolbars, toolbar buttons and the like into your application, and can be mixed and matched with HTML. XULRunner also exposes extra functions to JavaScript, allowing you to access files on the host computer, read and write from SQLite databases, and do a lot of things that AIR does in this regard.</p>
<p>I haven&#8217;t played with XUL a whole lot since AIR came out, as documentation has always fallen behind AIR&#8217;s. And performing some advanced functions, like populating a tree component with SQLite results, or manipulating an image, are a little more involved than with AIR.</p>
<p>However, XULRunner has been really branching out to a lot of platform &#8211; Windows, Mac OS and Linux support was all there before AIR even came on the scene. There is also SkyOS support, and today the first &#8220;pre-alpha&#8221; of XULRunner is available for Windows Mobile (codenamed &#8220;Fennec&#8221;). There are also lightweight ports available for mobile Linux distros, and for Symbian S60.</p>
<p>This really opens a lot of doors for developers &#8211; your desktop applications and mobile applications can all share the same codebase. XUL itself is actually quiet nice to write in, and I was always impressed by how it always took advantage of native OS components libraries.</p>
<p>Anyway, I think the XULRunner team deserves very high praise for what they have accomplished &#8211; they have always been ahead of the game when with their platform independent runtime, and they are continuing to push support to an impressive array of platforms.</p>
<ul>
<li><a href="https://developer.mozilla.org/en/XULRunner" target="_blank">XULRunner Documentation</a></li>
<li><a href="https://developer.mozilla.org/En/XUL" target="_blank">XUL Documentation</a></li>
<li><a href="http://dougt.wordpress.com/2009/02/10/milestone-1-fennec-for-windows-mobile/" target="_blank">Doug&#8217;s announcement of Fennec for Windows Mobile</a></li>
<li><a href="http://starkravingfinkle.org/blog/2009/02/xulrunner-1906/" target="_blank">Mark&#8217;s announcement of XULRunner 1.9.0.6</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2009/02/11/xulrunner-adobe-airs-grandad/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Started With Adobe AIR And SQLite (And Getting Around The Bugs)</title>
		<link>http://blog.affirmix.com/2009/01/28/getting-started-with-adobe-air-and-sqlite-and-avoiding-the-problems/</link>
		<comments>http://blog.affirmix.com/2009/01/28/getting-started-with-adobe-air-and-sqlite-and-avoiding-the-problems/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 02:29:11 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[air]]></category>
		<category><![CDATA[bitmap]]></category>
		<category><![CDATA[blob]]></category>
		<category><![CDATA[boolean]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[displayobject]]></category>
		<category><![CDATA[responder]]></category>
		<category><![CDATA[sqlite]]></category>
		<category><![CDATA[sqlstatement]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=101</guid>
		<description><![CDATA[I have been writing some applications in AIR that for the first time make extensive use of SQLite. I hit a few roadblocks along the way, so here are a few things that may come in handy if you are using SQLite in AIR for the first time...]]></description>
			<content:encoded><![CDATA[<p><img src="http://api.photoshop.com/home_ef38c0dde81745679f534f6507a6abff/adobe-px-assets/e8e28e55d2f149f8b09d8d487d020e8b" alt="Adobe AIR" /></p>
<p>I have been writing some applications in AIR that for the first time make extensive use of SQLite. I hit a few roadblocks along the way, so here are a few things that may come in handy if you are using SQLite in AIR for the first time. <span id="more-101"></span></p>
<h3>Reuse SQLStatement Instances</h3>
<p>Rather than creating a new SQLStatement object for each query you want to run, it is recommended that you reuse an existing instance, and just alter the parameters associated with the object. You will reap three benefits from doing this:</p>
<ul>
<li>The query will be cached, so the SQLite connection will not have to compile a new statement every time you want to run the query</li>
<li>You will get automatic type conversion when assigning values like strings, integers, dates and so on</li>
<li>You will improve data integrity within the database because as the automatic type conversion also acts as a kind of filter</li>
</ul>
<p>For queries that get used across an entire application, I have found that putting the SQLConnection object and wrapper functions for the SQLStatement objects inside a singleton class seems to work very well.</p>
<p>NOTE: Every time you change the text property, the query will get recompiled. The trick is in using the parameters.</p>
<p>The following example demonstrates this:</p>
<pre><code>package
{
	import flash.data.SQLConnection;
	import flash.data.SQLStatement;

	public class SQLConnectionWrapper
	{
		private static const SINGLETON_INSTANCE:SQLConnectionWrapper = new SQLConnectionWrapper(SingletonLock);

		public var connection:SQLConnection;

		private var selectRecord:SQLStatement;

		public static function get instance():SQLConnectionWrapper
		{
			return SINGLETON_INSTANCE;
		}

		public function SQLConnectionWrapper(lock:Class)
		{
			// This ensures that only once instance of this class may be created and accessed
			if(lock != SingletonLock){
				throw new Error("Class Cannot Be Instantiated: Use SQLConnectionWrapper.instance");
			}

			createDatabase();
		}

		private function createDatabase():void
		{
			// This creates an SQLConnection object , which can be accessed publicly so that event listeners can be defined for it
			connection = new SQLConnection();

			var databaseFile:File = File.applicationStorageDirectory.resolvePath("database.db");
			connection.openAsync(databaseFile);
		}

		public function getRecord(recordId:int):SQLStatement
		{
			// If selectRecord has not been instantiated, then create the instance with all the data that it needs
			// If it has been instantiated, then we can skip over this part and take advantage of the fact that it has now been cached
			if(!(selectRecord is SQLStatement)){
				selectRecord= new SQLStatement();
				selectRecord.sqlConnection = connection;
				selectRecord.text =
				"SELECT record_id, description, is_active " +
				"FROM record_tbl " +
				"WHERE record_id = :recordId";
			}
			// This simply changes the one parameter that needs to be changed
			// Because recordId has already been declared as an int, this will be converted into an SQLite recognized integer
			selectRecord.parameters[":recordId"] = recordId;

			return selectRecord;
		}
	}
}

// This little class exists to stop extra instances on the singleton being created
class SingletonLock{}</code></pre>
<h3>Use Responders</h3>
<p>One major problem that caught me off guard when trying to reuse instances was event handling. If I were to use SQLConnectionWrapper.instance.getRecord() in multiple places across my application, and attach event listeners to them, I will encounter a problem where all three event listeners get triggered. Even when each event listener is removed, errors still occur due to the fact that the SQLStatement object still thinks that it is executing. Not pretty.</p>
<p>Using Responder objects allows to avoid the pain that come s from constantly adding and removing event listeners, and prevent the race condition that occurs with the SQLStatement objects. The Responder object allows you to define event handlers for both SQLEvent.RESULT and SQLErrorEvent.ERROR events. And rather than attaching itself to the SQLStatement object, it will only handle events generated for each particular call to SQLStatement.execute().</p>
<p>NOTE: After a successful query, the handler will be passed an SQLResult object as the first argument, and not an SQLEvent object.</p>
<p>NOTE: After a failed query, the handler will be passed an SQLError object as the first argument, and not an SQLErrorEvent object.</p>
<p>Here is an example:</p>
<pre><code>package
{
	import SQLConnectionWrapper;</code>

	import flash.net.Responder;
	import flash.data.SQLResult;

	public class SampleApplication
	{
		// Create the responder object once, so that it can be reused again and again
		private var responder:Responder = new Responder(handleSuccess, handleFailure);

		public function SampleApplication():void
		{
			// This opens the database - obviously
			SQLConnectionWrapper.instance.connection.addEventListener(SQLEvent.OPEN, executeQuery);
			SQLConnectionWrapper.instance.connection.open();
		}

		private function executeQuery():void
		{
			// This statement essentially creates a reference to the SQLStatement object that is created once for all time within the SQLConnectionWrapper singleton
			var statement:SQLStatement = SQLConnectionWrapper.instance.getRecord(1);
			statement.execute(-1, responder);
		}

		private function handleSuccess(result:SQLResult):void
		{
			trace("Record ID: " + result.data[0].record_id + ", Description: " + result.data[0].description + ", Is Active: " + result.data[0].is_active);
		}

		private function handleFailure(error:SQLError):void
		{
			trace("Epic Fail: " + error.message);
		}
	}
}</code></pre>
<p><del></p>
<h3>Boolean Objects</h3>
<p>When returning results from a SELECT query, any SQLite Boolean objects will be correctly converted into ActionScript Boolean objects. However, when executing an INSERT or UPDATE query, an integer is actually required. This quick and nasty workaround demonstrates what has to take place:</p>
<p><em>This would need to be part of SQLConnectionWrapper</em></p>
<pre><code>		private function setRecord(description:String, isActive:Boolean):void
		{
			if(!(insertRecord is SQLStatement)){
				insertRecord = new SQLStatement();
				insertRecord.sqlConnection = connection;
				insertRecord.text = "INSERT INTO record_tbl (description, is_active) VALUES (:description, :isActive)";
			}
			insertRecord.parameters[":description"] = description;
			// This is pretty straightforward, but it simply converts the ActionScript Boolean into an int, so that SQLite can accurately create it's own boolean in the database
			insertRecord.parameters[":isActive"] = isActive ? 1 : 0;

			return insertRecord;
		}</code></pre>
<p></del></p>
<h3>Date Objects</h3>
<p>When executing an INSERT or UPDATE query, dates will be inserted into the database as expected (well, kind of &#8211; if you really want to know more about that then just ask about it). In the case of Date objects, though, the troubles occur when trying to return Date objects from a SELECT query. I won&#8217;t try and explain this one, because there is already a <a href="http://www.verysimple.com/blog/2008/09/09/working-with-dates-in-flex-air-and-sqlite/" target="_blank">great explanation of what is happening here</a>.</p>
<p>What I will do is provide some code that demonstrates the quickest way of getting a usable Date object from an SQLite database:</p>
<p>NOTE: The String object that gets returned is formatted so that it can be passed to the <a href="http://livedocs.adobe.com/flex/3/langref/Date.html#Date()" target="_blank">constructor of a Date object</a> without having to jump through any additional hoops.</p>
<p><em>This would need to be part of SQLConnectionWrapper</em></p>
<pre><code>		public function getAllBookings():SQLStatement
		{
			if(!(selectBookings is SQLStatement)){
				selectBookings = new SQLStatement();
				selectBookings.sqlConnection = connection;
				// This statement will return the date as a MM/DD/YYYY formatted string
				selectBookings.text =
				"SELECT booking_id, record_id, STRFTIME('%m/%d/%Y', checkout_date) AS checkout_date, STRFTIME('%m/%d/%Y', checkin_date) AS checkin_date " +
				"FROM booking_tbl";
			}

			return selectBookings;
		}</code></pre>
<p>UPDATE: <a href="http://probertson.com/" target="_blank">Paul Robertson</a> has posted an <a href="http://www.verysimple.com/blog/2008/09/09/working-with-dates-in-flex-air-and-sqlite/#comment-96981" target="_blank">update about this</a>. Apparently setting the column type to DATE, rather than DATETIME, will allow you to use Flex Date objects natively. You can see this <a href="http://livedocs.adobe.com/flex/3/langref/localDatabaseSQLSupport.html#columnAffinity" target="_blank">alluded to in the LiveDocs</a>.</p>
<h3>Blobs and Bitmaps</h3>
<p>Do you want to store images in your database? Do you want to pull them out as DisplayObjects, ready to do with as you wish? Well, here is some code that demonstrates the entire process of loading an image from a file, storing it in your SQLite database, retrieving the image data, and converting it back into a DisplayObject:</p>
<p>NOTE: ByteArray objects do not need any special attention when being either SELECTed from or INSERTed into the database.</p>
<p><em>This would need to be part of the application code</em></p>
<pre><code>		import flash.display.Bitmap;
		import flash.display.Loader;
		import flash.filesystem.File;
		import flash.net.URLLoader;
		import flash.utils.ByteArray;
		import mx.graphics.codec.PNGEncoder;</code>

		private function selectPicture():void
		{
			// This little section here creates a file object, and then launches the file browser so that you can select your image
			var file:File = File.documentsDirectory;
			file.addEventListener(Event.SELECT, handleSelectPicture);
			file.browseForOpen("Select Picture");
		}

		private function handleSelectPicture(event:Event):void
		{
			// Once the image file has been selected, we now have to load it
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoadPicture);
			loader.load(new URLRequest(event.target.url));
		}

		private function handleLoadPicture(event:Event):void
		{
			// The first thing that we do is create a Loader object (which is a subclass od DisplayObject)
			var loader:Loader = Loader(event.target.loader);
			// Next, we cast the loader as a Bitmpa object, as the Bitmap object has function to return a BitmapData object based on the image
			var image:Bitmap = Bitmap(loader.content);
			var encoder:PNGEncoder = new PNGEncoder();
			// The PNGEncoder allows you to convert BitmapData object into a ByteArray, ready for storage in an SQLite blob field
			var byteArray:ByteArray = encoder.encode(image.bitmapData);

			var statement:SQLStatement = SQLConnectionWrapper.instance.setPicture(1, byteArray);
			statement.execute(-1, responder);
		}</code></pre>
<p><em>This would need to be part of SQLConnectionWrapper</em></p>
<pre><code>		private function setPicture(recordId:String, byteArray:ByteArray):void
		{
			if(!(insertRecord is SQLStatement)){
				insertRecord = new SQLStatement();
				insertRecord.sqlConnection = connection;
				insertRecord.text = "INSERT INTO picture_tbl (record_id, data) VALUES (:recordId, :byteArray)";
			}
			insertRecord.parameters[":recordId"] = recordId;
			// The ByteArray should be added as a parameter; this makes the whole process of storing the image in the blob field very easy
			insertRecord.parameters[":byteArray"] = byteArray;

			return insertRecord;
		}</code></pre>
<p><em>This would need to be part of the application code</em></p>
<pre><code>		import mx.controls.Image;

		// This function would be defined in a Responder object that handles a successful query of picture_tbl
		private function handleSuccess(result:SQLResult):void
		{
			var image:Image = new Image();
			image.addEventListener(Event.COMPLETE, handleLoadPicture);
			image.load(result.data[0].picture);
		}

		private function handleLoadPicture(event:Event):void
		{
			var picture:DisplayObject = DisplayObject(event.target.content);
		}</code></pre>
<p>Sorry, I was started to get a bit tired of writing towards the end of this article <img src='http://blog.affirmix.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  If you want me to elaborate on anything, just leave a comment. Hopefully the examples are enough to get you up and running with SQLite, whilst avoiding most of the gotchas that come along with it <img src='http://blog.affirmix.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2009/01/28/getting-started-with-adobe-air-and-sqlite-and-avoiding-the-problems/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Flex SDK 3.3.0 Stable Now Available</title>
		<link>http://blog.affirmix.com/2009/01/28/flex-sdk-330-stable-now-available/</link>
		<comments>http://blog.affirmix.com/2009/01/28/flex-sdk-330-stable-now-available/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 21:47:12 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[sdk]]></category>
		<category><![CDATA[stable]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=114</guid>
		<description><![CDATA[Now that the new stable is available for download, I would imagine that a new release build isn&#8217;t too far off&#8230; You can download the latest version of the SDK here: http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3 From what I can tell, it mostly comprises of bug fixes &#8211; no fancy new functionality seems to have been added. But I [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://api.photoshop.com/home_ef38c0dde81745679f534f6507a6abff/adobe-px-assets/ee09c70759fb4c2f83e07e492f4b5cf0" alt="Flex SDK 3.3.0" /></p>
<p>Now that the new stable is available for download, I would imagine that a new release build isn&#8217;t too far off&#8230;</p>
<p>You can download the latest version of the SDK here: <a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3" target="_blank">http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+3</a></p>
<p>From what I can tell, it mostly comprises of bug fixes &#8211; no fancy new functionality seems to have been added. But I guess you will have to find out for yourself by trawling through the nightly release notes (joy :S)&#8230; If you find anything noteworthy, let me know, I only noticed a few changes in some of the utility classes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2009/01/28/flex-sdk-330-stable-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Links For 2009-01-22</title>
		<link>http://blog.affirmix.com/2009/01/22/links-for-2009-01-22/</link>
		<comments>http://blog.affirmix.com/2009/01/22/links-for-2009-01-22/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 18:12:28 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[konductor]]></category>
		<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[insideria]]></category>
		<category><![CDATA[links]]></category>
		<category><![CDATA[marketing]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=96</guid>
		<description><![CDATA[Don&#8217;t worry, the whole links thing won&#8217;t become a regular feature of this blog &#8211; this is just a roundup of a few things I have wanted to post about recently but just didn&#8217;t have the time: There is a cool writeup about Konductor on O&#8217;Reilly&#8217;s InsideRIA blog (Even though it reads a bit like [...]]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t worry, the whole links thing won&#8217;t become a regular feature of this blog &#8211; this is just a roundup of a few things I have wanted to post about recently but just didn&#8217;t have the time:</p>
<p>
<ul>
<li>There is a cool <a href="http://www.insideria.com/2009/01/konductor-air-application.html" target="_blank">writeup about Konductor</a> on O&#8217;Reilly&#8217;s InsideRIA blog (Even though it reads a bit like a blogvertisement in parts, it is very thorough)</p>
<li>There a bunch of new videos about Konductor on our <a href="http://ca.youtube.com/konductorsoftware" target="_blank">Youtube channel</a> &#8211; if you want visual and aural updates of Konductor&#8217;s progress, then subscribe</li>
<li>This one has been blogged to death already, but I am loving <a href="http://www.prettyloaded.com/" target="_blank">Big Spaceship&#8217;s Pretty Loaded</a> &#8211; I hope they can keep adding new content</li>
</ul>
<p>It has been a little barren on the blog lately, but I have a few posts I really want to write up about some really cool stuff we are doing with Dreamweaver extension development, so subscribe to the RSS feed and keep your eye open for it if you are into that kind of thing.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2009/01/22/links-for-2009-01-22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blog Changes</title>
		<link>http://blog.affirmix.com/2008/12/02/blog-changes/</link>
		<comments>http://blog.affirmix.com/2008/12/02/blog-changes/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 23:17:30 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[adobe max]]></category>
		<category><![CDATA[feed]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=112</guid>
		<description><![CDATA[I changed the blog theme, so now my blog looks a little more legit. I will be making tweaks to it as I go, but I think now it is a bit of an improvement over the standard WordPress theme that was there initially. Also, FYI, if you are subscribed using RSS, the feed URL [...]]]></description>
			<content:encoded><![CDATA[<p>I changed the blog theme, so now my blog looks a little more legit. I will be making tweaks to it as I go, but I think now it is a bit of an improvement over the standard WordPress theme that was there initially.</p>
<p>Also, FYI, if you are subscribed using RSS, the feed URL has been changed to <a href="http://feeds.feedburner.com/andrewodri">http://feeds.feedburner.com/andrewodri</a>. All of your orignal feed links should now be redirecting, however.</p>
<p>Also, I am on an Adobe Developer Connection video. I am the guy who say profound things like &#8220;awesome&#8221; and &#8220;Flash Catalyst&#8221;:</p>
<p><object width="486" height="412"><param name="movie" value="http://services.brightcove.com/services/viewer/federated_f8/1596744118"></param><param flashVars="videoId=2572134001&#038;playerId=1596744118&#038;viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&#038;servicesURL=http://services.brightcove.com/services&#038;cdnURL=http://admin.brightcove.com&#038;domain=embed&#038;autoStart=false&#038;"></embed><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://services.brightcove.com/services/viewer/federated_f8/1596744118" flashVars="videoId=2572134001&#038;playerId=1596744118&#038;viewerSecureGatewayURL=https://console.brightcove.com/services/amfgateway&#038;servicesURL=http://services.brightcove.com/services&#038;cdnURL=http://admin.brightcove.com&#038;domain=embed&#038;autoStart=false&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="486" height="412"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2008/12/02/blog-changes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Design Coding &#8211; The SEO Rapper</title>
		<link>http://blog.affirmix.com/2008/11/07/design-coding-the-seo-rapper/</link>
		<comments>http://blog.affirmix.com/2008/11/07/design-coding-the-seo-rapper/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 20:10:54 +0000</pubDate>
		<dc:creator>Andrew Odri</dc:creator>
				<category><![CDATA[miscellaneous]]></category>
		<category><![CDATA[seo]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.affirmix.com/?p=109</guid>
		<description><![CDATA[I usually find geeky hip-hop annoying and somewhat embarrassing. This one is not only funny, It&#8217;s incredibly informative too. I think it speaks for itself: http://ca.youtube.com/watch?v=a0qMe7Z3EYg&#038;fmt=18]]></description>
			<content:encoded><![CDATA[<p>I usually find geeky hip-hop annoying and somewhat embarrassing. This one is not only funny, It&#8217;s incredibly informative too. I think it speaks for itself:</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/a0qMe7Z3EYg&#038;hl=en&#038;fs=1&#038;ap=%2526fmt%3D18"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/a0qMe7Z3EYg&#038;hl=en&#038;fs=1&#038;ap=%2526fmt%3D18" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br />
<a href="http://ca.youtube.com/watch?v=a0qMe7Z3EYg&#038;fmt=18" target="_blank">http://ca.youtube.com/watch?v=a0qMe7Z3EYg&#038;fmt=18</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.affirmix.com/2008/11/07/design-coding-the-seo-rapper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

