<?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>VinylFox</title>
	<atom:link href="http://www.vinylfox.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.vinylfox.com</link>
	<description>The Playground of VinylFox (Shea Frederick)</description>
	<lastBuildDate>Tue, 24 Jan 2012 14:26:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Accelerometer Based UI Interaction &amp; Sencha Touch</title>
		<link>http://www.vinylfox.com/accelerometer-based-ui-interaction-sencha-touch/</link>
		<comments>http://www.vinylfox.com/accelerometer-based-ui-interaction-sencha-touch/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 21:54:33 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS Plugins]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Touch]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[Sencha]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=851</guid>
		<description><![CDATA[With the iOS 4.2 update at the end of 2010 came some cool new features for mobile web developers. My favorite of the new features was access to the devices accelerometer/gyroscope data through an event called &#8216;devicemotion&#8216; which we can listen to on the window object. This new event fires every time the device moves, [...]]]></description>
			<content:encoded><![CDATA[<p>With the iOS 4.2 update at the end of 2010 came some cool new features for mobile web developers. My favorite of the new features was access to the devices accelerometer/gyroscope data through an event called &#8216;<a href="https://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/DeviceMotionEventClassRef/DeviceMotionEvent/DeviceMotionEvent.html">devicemotion</a>&#8216; which we can listen to on the window object. This new event fires every time the device moves, which is pretty much non-stop &#8211; 50 times a second &#8211; even when the device is sitting still on a desk.</p>
<p>This new access to motion data opens up developers to do so much more, besides the obvious usage in games, we can create user interactions based on motion. Thats where I decided to use it, my thought was to use it for tab navigation, but more in that in a minute.</p>
<h2>An Overwhelmed Browser</h2>
<p>Needless to say, this &#8216;devicemotion&#8217; event being fired so often can eat up resources so I needed to wrap all the logic that is executed each time the event is fired in a simple modulus check, which will reduce the overhead of logic being run to every n times. With a case like this, where the event is fired 50 times a second, a modulus of 10 will be enough to reduce the overhead &#8211; of course we can increase this number if things still seem sluggish, or decrease it if we have resources left and want a little more resolution to our readings. Honestly, handsets don&#8217;t have much in the way of CPU to begin with, so always play it safe.</p>
<p><textarea class="js" cols="100" name="code">&#8230;<br />
window.addEventListener(&#8220;devicemotion&#8221;,<br />
    Ext.createDelegate(this.deviceMotion,this), true);<br />
&#8230;<br />
deviceMotion: function(event) {<br />
  if (this.dmcnt % this.pollmod &#038;&#038; event.acceleration){<br />
    // do stuff<br />
  }<br />
}<br />
&#8230;</textarea></p>
<p>There is another way to accomplish this same thing, by writing the events arguments to a static variable somewhere, and setting up a timer to poll that variable every n milliseconds. This method works pretty much the same in this case, though I prefer the modulus method, which accounts for the event actually being fired. If for some reason the phone is set on a solid surface and no longer firing the event (ha! not gonna happen in this case) then the modulus method stops using resources, whereas the polling method is always using the same amount of resources.</p>
<p><textarea class="js" cols="100" name="code">&#8230;<br />
window.addEventListener(&#8220;devicemotion&#8221;,<br />
    Ext.createDelegate(this.deviceMotion,this), true);<br />
window.setInterval(Ext.createDelegate(this.deviceMotionFire,this), 200);<br />
&#8230;<br />
deviceMotion: function(event) {<br />
  this.devicemotion<br />
}<br />
&#8230;<br />
deviceMotionFire: function() {<br />
  //do stuff (using this.devicemotion)<br />
}</textarea></p>
<p>Eaither way works fine in this case, however I&#8217;m sticking with my old standard modulus check. Let&#8217;s move on.</p>
<p/>
<h2>The Concept</h2>
<p>As soon as found out that accelerometer data was available, I knew exactly what I wanted to do. Why not flick the device left or right to move between sections of our app &#8211; the user already thinks of the interaction of swiping between sections with their finger on the screen, so why not flick as well?</p>
<h2>The Plugin (for Sencha Touch)</h2>
<p>The culmination of all of this has been rolled into a simple Plugin for Sencha Touch TabPanels, which is available on my <a href="https://github.com/VinylFox/" target="_blank">Github</a> account. Right now there are no configuration options, just add the plugin to a TabPanel like so:</p>
<p><textarea class="js" cols="100" name="code">{<br />
     xtype: &#8216;tabpanel&#8217;,<br />
     &#8230;,<br />
     plugins: [new Ext.ux.touch.AccelerometerTabs()],<br />
     &#8230;<br />
}</textarea></p>
<p>As always, feel free to fork it and make changes or use it as you wish. Enjoy!</p>
<p><a href="https://github.com/VinylFox/Ext.ux.touch.AccelerometerTabs" target="_blank">https://github.com/VinylFox/Ext.ux.touch.AccelerometerTabs</a></p>
<p>LIVE DEMO (only works on devices w/hardware): <a href="http://www.codetick.com/demos/tabs/index.html" target="_blank">http://www.codetick.com/demos/tabs/index.html</a></p>
<p><img src="http://chart.googleapis.com/chart?chs=200x200&#038;cht=qr&#038;chl=http://www.codetick.com/demos/tabs/index.html&#038;choe=UTF-8"/></p>
<p>NOTE: I wrote this plugin on a whim almost 8 months ago, and have not written a blog post on it till now <img src='http://www.vinylfox.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Oh the joy of having too much work to do! I would love to see someone code a &#8220;swirl refresh&#8221; plugin where you move the phone in a circular motion to refresh a listview.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/accelerometer-based-ui-interaction-sencha-touch/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>List Pull Refresh Plugin for Sencha Touch</title>
		<link>http://www.vinylfox.com/list-pull-refresh-plugin-for-sencha-touch/</link>
		<comments>http://www.vinylfox.com/list-pull-refresh-plugin-for-sencha-touch/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 18:20:37 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Touch]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Sencha]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=843</guid>
		<description><![CDATA[One thing that you find out quickly when developing for mobile, is that mobile devices require us to be much more creative with our usage of UI features. It&#8217;s not all about adding another button here, or a form field there &#8211; that takes up too much space &#8211; it&#8217;s about harnessing simple and natural [...]]]></description>
			<content:encoded><![CDATA[<p>One thing that you find out quickly when developing for mobile, is that mobile devices require us to be much more creative with our usage of UI features. It&#8217;s not all about adding another button here, or a form field there &#8211; that takes up too much space &#8211; it&#8217;s about <em>harnessing simple and natural gestures</em> to perform the functionality we need.</p>
<h2>Be Gone Refresh Button!</h2>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/479652c6-d6c7-414d-9210-1da6ba3f372b/2011-01-10_1151.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/479652c6-d6c7-414d-9210-1da6ba3f372b/2011-01-10_1151.png" alt="Refresh Button" title="Refresh Button"  height="80" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>A simple thing we can do to get rid of extra button clutter is get rid of that &#8220;Refresh&#8221; button that is eating up space and ugifying the top right corner of our toolbar. Luckily someone has already come up with a UX to deal with this problem, the &#8220;Pull to Refresh&#8221; interaction pioneered by <a href="http://www.atebits.com/">Loren Brichter</a> of Tweetie fame. I just needed to implement it into Sencha Touch.</p>
<h2>Pull to Refresh</h2>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/1cda786b-3967-45a4-9077-c10d197d8e29/2011-01-10_1300.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/1cda786b-3967-45a4-9077-c10d197d8e29/2011-01-10_1300.png" alt="Pull to Refresh" title="Pull to Refresh"  height="130" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>The solution to this UX problem is quite simple, make a plugin that monitors scroll and adds the appropriate visual indicators, but I wanted to see how others implemented it first and follow that same pattern. This way whatever I developed would follow the exact same interaction as other established implementations and not confuse users.</p>
<p>What I found was the <a href="https://github.com/enormego/EGOTableViewPullRefresh">EGOTableViewPullRefresh </a>, a JAVA implementation developed by <a href="http://developers.enormego.com/">enormego </a>and used by Facebook for their Android mobile app, this provided me with the appropriate logic, styling and interaction to match the current widely accepted user interaction.</p>
</p>
<p>After careful examination (the code is actually quite small) I found that there are three stages to the &#8220;Pull to Refresh&#8221; concept:</p>
<ul>
<li>Normal</li>
<li>Pulling</li>
<li>Loading</li>
</ul>
<p>The &#8220;<strong>Normal</strong>&#8221; state is when the user is pulling down on the list, but has not yet reached the required distance pulling the list to cause a refresh if released.</p>
<p>The &#8220;<strong>Pulling</strong>&#8221; state is when the user has pulled down on the list past the required distance, and releasing it would cause a refresh. If the user were to pull the list back up past the required distance and release it would return to the <strong>Normal </strong>state and a refresh would not be triggered &#8211; this is the &#8220;escape&#8221; for users that do not want to refresh.</p>
<p>The &#8220;<strong>Loading</strong>&#8221; state is quite self explanatory, it&#8217;s when the user has released the list from the &#8220;Pulling&#8221; state and a refresh has been triggered, but data has not yet been re-populated. Also, a last updated date is updated when this happens.</p>
<p>With all of this laid out now, I can write the code needed to make it happen, and create the styles to mimic what currently exists.</p>
<h2>The plugin</h2>
<p>The first thing I had to do was add the HTML element to the top of the scrolling list that would provide feedback to the user when they pulled the list. After that, monitoring the &#8216;offsetchange&#8217; event of the scroller element of the list is where the logic of when to show the feedback HTML elements is handled.</p>
<pre>this.cmp.scroller.on('offsetchange', this.handlePull, this);</pre>
<p>The handlePull method is where the logic went for determining which of the three states we were in. Take a look at my code on Github for all the details &#8211; all said and done it&#8217;s only 125 lines.</p>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/7060ea80-1e2c-4cd6-a102-a53120d7e665/2010-11-29_1457.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/7060ea80-1e2c-4cd6-a102-a53120d7e665/2010-11-29_1457.png" alt="Pull to Refresh" title="Pull to Refresh"  height="190" style="border: 1px solid rgb(0, 0, 0); margin: 10px;" /></a></p>
<p>I hope this code proves useful to you in your mobile development projects. This code is available to the public at my Github repository.</p>
<p><a href="https://github.com/VinylFox/Ext.ux.touch.ListPullRefresh">https://github.com/VinylFox/Ext.ux.touch.ListPullRefresh</a></p>
<p>Using the plugin is quite simple, just listen for the &#8216;released&#8217; event on the plugin and reload your data.</p>
<pre>{
    xtype: 'list',
    ...,
    plugins: [new Ext.ux.touch.ListPullRefresh({
      listeners: {
         'released': function(plugin,list){
           // call the plugins processComplete method to hide the 'loading' indicator
           your_store.on('load', plugin.processComplete, plugin, {single:true});
           // do whatever needs to happen for reload
           your_store.load();
         }
      }
    })],
    ...
}</pre>
<p>DEMO (Must be viewed on phone): <a href="http://www.codetick.com/demos/refresh/index.html">http://www.codetick.com/demos/refresh/index.html</a></p>
<p><img src="http://chart.googleapis.com/chart?chs=200x200&#038;cht=qr&#038;chl=http://www.codetick.com/demos/refresh/index.html&#038;choe=UTF-8"/></p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/list-pull-refresh-plugin-for-sencha-touch/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Custom Styling a Sencha Touch App</title>
		<link>http://www.vinylfox.com/custom-styling-a-sencha-touch-app/</link>
		<comments>http://www.vinylfox.com/custom-styling-a-sencha-touch-app/#comments</comments>
		<pubDate>Thu, 16 Dec 2010 16:02:12 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[Touch]]></category>
		<category><![CDATA[compass]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[sass]]></category>
		<category><![CDATA[theme]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=865</guid>
		<description><![CDATA[We all want our mobile app to look distinct, and with Sencha Touch it&#8217;s quite easy to do. There are many additional reasons however to generate our own CSS, which is what we will take a look at here. One of the biggest reasons is actually to save file size, improving the time it takes [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/2621980d-0901-4846-969a-9e1a4405fe22/2010-12-16_0755.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/2621980d-0901-4846-969a-9e1a4405fe22/2010-12-16_0755.png" alt="Default Styling" title="Default Styling"  height="150" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>We all want our mobile app to look distinct, and with <a href="http://www.sencha.com/products/touch/">Sencha Touch</a> it&#8217;s quite easy to do. There are many additional reasons however to generate our own CSS, which is what we will take a look at here. One of the biggest reasons is actually to save file size, improving the time it takes to display our mobile app to the user. As it is, Sencha Touch comes with a very inclusive CSS file which has all of the components included &#8211; whether your using them or not &#8211; and a bunch of sample pictos. Let&#8217;s get started removing some of this bloat from the default CSS.</p>
<h2>Trimming The Fat</h2>
<p>The default CSS that ships with Sencha Touch is roughly <strong>133KB</strong>, which is honestly quite enormous. One way to trim some of the fat is to exclude styles for components, parts of components, or UI features that we&#8217;re not using. There are a ton of variables built in that we can set to exclude certain things &#8211; some of these can be found in the <em>&#8216;resources/themes/stylesheets/sencha-touch/default/_variables.scss&#8217;</em> file, and others will have to be tracked down by examining the other SCSS files in the widgets folder. Some of the standard ones include:</p>
<pre>$include-form-sliders: <strong>false</strong>;
$include-floating-panels: <strong>false</strong>;</pre>
<p>Let&#8217;s go ahead and modify the <em>&#8216;_variables.scss&#8217;</em> file to set the two above variables to false, removing the<em> &#8216;<a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variable_defaults_" target="_blank">!default</a>&#8216;</em> flag as well, since we&#8217;re going to override this default value with our own. If we poke around in the other SCSS files in the widgets folder, we will will find many more of these variables, such as:</p>
<pre>$include-top-tabs: <strong>false</strong>;
$include-bottom-tabs: true !default;</pre>
</p>
<p>Adding these variables to the <em>&#8216;_variables.scss&#8217;</em> file will let us override these settings in a central location. For my usage, im excluding the <em>&#8216;top-tabs&#8217;</em> by setting the value to false. I&#8217;m not using top tabs in my mobile app, so I wont miss them. Now that we&#8217;re done with those changes, let&#8217;s move on to generating the new CSS.</p>
<h2>Generating The CSS</h2>
<p>We have made some changes to our SCSS, now we need to generate the new CSS file that Sencha Touch needs by using <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a>, <a href="http://compass-style.org/" target="_blank">Compass</a> &#038; <a href="http://sass-lang.com/" target="_blank">SASS</a>. I&#8217;m not going to get into detail about how to install these things, but I will say that you need to first install <a href="http://www.ruby-lang.org/en/" target="_blank">Ruby</a> so that it can be used from the command line, then <a href="http://www.ruby-lang.org/en/libraries/#installing-rubygems" target="_blank">install rubygems</a> and use rubygems to install the <a href="http://rubygems.org/gems/compass" target="_blank">compass</a> and <a href="http://rubygems.org/gems/haml" target="_blank">haml</a> gems (haml is a dependency of compass, so it&#8217;s installed for you).</p>
<p>Generating the CSS from our SCSS files is a simple one line command that is executed from within the resources folder:</p>
<pre>D:\Workspace\SpeckleMobile\src\resources>compass compile sass
   exists sass/../css
  compile sass/android.scss
overwrite sass/../css/android.css
  compile sass/apple.scss
overwrite sass/../css/apple.css
  compile sass/sencha-touch.scss
overwrite sass/../css/sencha-touch.css</pre>
<p>I have included the successful output as well, which has generated the new CSS and placed it in the <em>&#8216;css&#8217;</em> folder within our current directory. This will replace the existing <em>&#8216;sencha-touch.css&#8217;</em> with our newly generated one. There will be no visible change in our app yet, however the file size will decrease. Poking around in the SCSS files in the widgets folder will reveal many more variables that can be set to reduce file size by excluding unused features. Let&#8217;s next take a look at altering the color scheme.</p>
<h2>Shiny Colors</h2>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/80e5d0d2-a986-44ea-923e-dfa5ad69812a/2010-12-16_0812.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/80e5d0d2-a986-44ea-923e-dfa5ad69812a/2010-12-16_0812.png" alt="Minty Styling" title="Minty Styling"  height="150" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>This is the point where we can really make some drastic styling changes with minimal effort. The <em>&#8216;_variables.scss&#8217;</em> file has a few options for changing color, but one main color can be used and the rest of the colors are extrapolated from it by altering the saturation and darkening or lightening the color. This main color is aptly named <em>&#8216;base-color&#8217;</em> &#8211; go figure. I&#8217;m going to change it to a nice minty green.</p>
<pre>$base-color: <strong>#8bc531</strong>;</pre>
<p>After compiling the SASS again, we end up with a very different looking application. We can change the look of the app by modifying this single color and achieve a wide variety of color schemes.</p>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/b97f86f8-397c-4a4a-aaaf-42ab393804dc/2010-12-16_1020.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/b56f3d26-5d28-4ea9-ab60-57051e218122/2010-12-16_1019.png" alt="Active Color Styling" title="Active Color Styling"  height="61" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/294b5afe-191b-4622-863e-7c1c6e49317b/2010-12-16_1014.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/2bf4b685-4da9-4038-bcd0-2f8f471229d2/2010-12-16_1017.png" alt="Lighter Styling" title="Lighter Styling"  height="61" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>If we go with a very light color then the active color will become so light that it starts to blend with the surrounding colors. To counteract this over-lightening we can adjust the <em>&#8216;active-color&#8217;</em> variable in the <em>&#8216;_variables.scss&#8217;</em> file by either setting it to a color we prefer, or adjusting the saturation and darkness.</p>
<pre>$base-color: <strong>#e2f0cc</strong>;
$active-color: darken(saturate($base-color, 55%), <strong>90%</strong>);
// $active-color: <strong>#212325</strong>;</pre>
<p>There are also variables to set the active color to an exact color, such as <em>&#8216;tabs-light-active&#8217;</em> &#8211; these can be found by looking at the <em>&#8216;_tabs.scss&#8217;</em> file located in the <em>widgets </em>folder. A little exploration can reveal a ton of variables we can use to change the styling of our app (I can&#8217;t stress this enough). Next, let&#8217;s take a look at removing some more bloat by including only the icons we need in our app.</p>
<h2>Icons, aka Pictos</h2>
<p>The default CSS comes with a couple dozen icons, many of which we will not need in our app. First we need to add a setting to the <em>&#8216;_variables.scss&#8217;</em> file that excludes this default set of icons.</p>
<pre>$include-default-icons: false;</pre>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/379186ce-b759-48d4-bb3e-902cfd8c88a7/2010-12-16_1127.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/bb271ade-fc8f-47e3-8f7c-a9dfdfb28706/2010-12-16_1129.png" alt="No Pictos" title="No Pictos"  height="61" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>This leaves us with no icons included, so if we we&#8217;re to compile the new CSS at this point, all of the icons just show up as square boxes with a gradient in them &#8211; notice the generated css file is almost half the size now. Now let&#8217;s figure out which icons we need and add them back in one at a time. Take the following steps:</p>
<ol>
<li>Add a scss file to the <em>&#8216;default&#8217;</em> folder called <em>&#8216;_my.scss&#8217;</em></li>
<li>Edit the file adding <em>&#8216;@import &#8216;my/pictos&#8217;;&#8217;</em></li>
<li>Add a folder in the <em>&#8216;default&#8217;</em> folder called <em>&#8216;my&#8217;</em></li>
<li>Add a scss file to the <em>&#8216;default/my&#8217;</em> folder called <em>&#8216;_pictos.scss&#8217;</em></li>
<li>Edit the <em>&#8216;_all.scss&#8217;</em> file in the <em>&#8216;default&#8217;</em> folder, adding <em>&#8216;@import &#8216;my&#8217;;&#8217;</em></li>
</ol>
<p>That sets up our custom SCSS includes where we can place our extra styling and icons. Edit the <em>&#8216;default/my/_pictos.scss&#8217;</em> file and add our icons using the <em>&#8216;pictos-iconmask&#8217;</em> mixin.</p>
<pre>@include pictos-iconmask('search');
@include pictos-iconmask('bookmarks');
@include pictos-iconmask('time');
@include pictos-iconmask('favorites');
@include pictos-iconmask('settings');</pre>
<p><a class="lightbox" href="http://content.screencast.com/users/VinylFox/folders/Jing/media/b97f86f8-397c-4a4a-aaaf-42ab393804dc/2010-12-16_1020.png"><img src="http://content.screencast.com/users/VinylFox/folders/Jing/media/b97f86f8-397c-4a4a-aaaf-42ab393804dc/2010-12-16_1020.png" alt="My Pictos" title="My Pictos"  height="150" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 0 0 10px 10px;" /></a>After compiling our CSS again, we will have our icons back, but only the icons we specifically imported, which brings our CSS file down to <strong>88KB </strong>- almost half of the original CSS file size.</p>
<h2>Set Forth and Conquer</h2>
<p>I hope that leaves you with enough information to get started hacking around in the SCSS files and creating some really cool color schemes and custom styling. Not to mention, trimming some of the bulk off the default CSS files included in the Sencha Touch SDK download.</p>
<p>Let me know in the comments what interesting variables you have found in the Sencha Touch SCSS files.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/custom-styling-a-sencha-touch-app/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Learning Ext JS 3.0 Released</title>
		<link>http://www.vinylfox.com/learning-ext-js-3-0-released/</link>
		<comments>http://www.vinylfox.com/learning-ext-js-3-0-released/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 16:39:00 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[ExtJS News]]></category>
		<category><![CDATA[Book]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=816</guid>
		<description><![CDATA[You might have noticed a recent lack of updates to my blog over the past few months, which is directly related to how much I&#8217;m writing elsewhere. So I&#8217;m happy to announce that I now have more time to write on my blog&#8230;I mean, my Learning Ext JS 3.x book has been completed! This book [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/gp/product/1849511209?ie=UTF8&#038;tag=viny07-20"><img src="http://www.vinylfox.com/wp-content/uploads/2010/10/1209OS_MockupCover-150x150.jpg" alt="Learning Ext JS 3.0" title="Learning Ext JS 3.0" width="150" height="150" style="border: 1px solid rgb(0, 0, 0); margin: 0pt 10px 10px 0pt;" class="alignleft size-thumbnail wp-image-822" /></a>You might have noticed a recent lack of updates to my blog over the past few months, which is directly related to how much I&#8217;m writing elsewhere. So I&#8217;m happy to announce that I now have more time to write on my blog&#8230;I mean, my <a href="http://www.amazon.com/gp/product/1849511209?ie=UTF8&#038;tag=viny07-20">Learning Ext JS 3.x</a> book has been completed!</p>
<p>This book marks the 2nd book for me, and the 2nd book in the Learning Ext JS series by Packt Publishing. With every page updated, and new pages and chapters added, this book should be an excellent companion to anyone wanting to learn the Ext JS library from scratch.</p>
<h2>Updated Content</h2>
<p>All of us involved in the first version of this book, <a href="http://link.packtpub.com/DLYGQG">Learning Ext JS</a>, returned to update our content based on user feedback, errata, changes in the library, and our own observations. What we ended up with is a very refined book that guides new users through the learning process involved in creating Ext JS web applications. Plus we added some more witty comments and catchy section headings. I just can&#8217;t get enough of those.</p>
<p>We were also lucky enough this time to have an amazing technical reviewer Nigel White (Animal) who we brought in as an author to fill in additional sections and clarify technical content. His in-depth knowledge and years of experience with Ext JS have been a great help in making this book as technically accurate as possible.</p>
<h2>New Chapters</h2>
<p>Probably the most exciting part about updating the book was being able to add in new chapters, three total, for an additional 140 pages of learning power:</p>
<ul>
<li>Charting</li>
<li>Plugins</li>
<li>Ext Direct</li>
</ul>
<p>The Charting chapter covers the introduction of charts into the 3.x line of the Ext JS library, implementing commonly used charts in a few key situations, such as Pie, Bar, Column and Line all tied to a data store.</p>
<p>With the Plugins chapter, we go over how Plugin structure works, how they interact with their host component, and create a simple search filter plugin that can be used in any Grid.</p>
<p>In the Ext Direct chapter, we cover how to setup Direct, build the API, route requests and make the API available to  client side scripts.</p>
<h2>Enjoy!</h2>
<p>If your new to Ext JS 3.x and want to get a better understanding of how to use it and how it works, I hope this book finds it&#8217;s way into your hands, as I have no doubt it will make your life easier. Drop me a line if you enjoyed it, post a review on <a href="http://www.amazon.com/gp/product/1849511209?ie=UTF8&#038;tag=viny07-20">Amazon</a>, or just hit me up on <a href="http://www.twitter.com/VinylFox">Twitter</a>.</p>
<p>There are also a couple of free chapters on the publishers web site, <a href="http://link.packtpub.com/ys4hnN">Menus, Toolbars, and Buttons in Ext JS 3.2</a> and <a href="http://link.packtpub.com/cO0z9h">Displaying Data with Grids in Ext JS</a>.</p>
<p>Enjoy! (again)</p>
<ul>
<li>Shea Frederick &#8211; <a href="http://twitter.com/vinylfox">@VinylFox</a>, <a href="http://www.vinylfox.com">VinylFox.com</a></li>
<li>Colin Ramsay &#8211; <a href="http://twitter.com/colinramsay">@ColinRamsay</a>, <a href="http://colinramsay.co.uk/diary/">ColinRamsay.co.uk</a></li>
<li>Steve &#8216;Cutter&#8217; Blades &#8211; <a href="http://twitter.com/cutterbl">@CutterBL</a>, <a href="http://blog.cutterscrossing.com/">CuttersCrossing.com</a></li>
<li>Nigel White &#8211; Anti-social, but always accessible on the <a href="http://www.sencha.com/forum/">forums</a> <img src='http://www.vinylfox.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/learning-ext-js-3-0-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Each Second Counts, or Not</title>
		<link>http://www.vinylfox.com/each-second-counts-or-not/</link>
		<comments>http://www.vinylfox.com/each-second-counts-or-not/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 16:37:06 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[ExtJS Tutorials]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=741</guid>
		<description><![CDATA[Every once and a while I glance upon a chunk of code that just screams at me to be optimized. From that point on, all I can do is think about how much faster it would be if I just did this or that. Today I had one of those moments when looking at a [...]]]></description>
			<content:encoded><![CDATA[<p>Every once and a while I glance upon a chunk of code that just screams at me to be optimized. From that point on, all I can do is think about how much faster it would be if I just did this or that. Today I had one of those moments when looking at a co-workers code &#8211; I noticed that they had scoped an <em>each</em> loop that did not use scope (context). This got me wondering if there were any optimizations within the each loop that made it run faster without scope, so I took a look.</p>
<h2>Call &#038; Scope</h2>
<p>So as it turns out, the simple answer is no. The <em>each</em> method uses the <em>call</em> method of the <em>Function</em> constructor to apply scope to the function executed on each pass of the loop. When no scope is provided to the each method, it uses the current item as the scope &#8211; which is kinda strange, but whatever.</p>
<h2>No Scope</h2>
<p>Here is my smart idea &#8211; don&#8217;t use the <em>call</em> method if there is no scope provided. Simple, and it seems like it would help speed things up, so let&#8217;s give it a shot.</p>
<p><textarea class="js" cols="100" name="code">Ext.each = function(array, fn, scope){<br />
    if(Ext.isEmpty(array, true)){<br />
        return;<br />
    }<br />
    if(!Ext.isIterable(array) || Ext.isPrimitive(array)){<br />
        array = [array];<br />
    }<br />
    for(var i = 0, len = array.length; i < len; i++){<br />
        if((scope) ? fn.call(scope, array[i], i, array) : fn(array[i], i, array) === false){<br />
            return i;<br />
        }<br />
    }<br />
};</textarea></p>
<p>The basic change here is on line 9 where I check to see if scope was passed in, and decide to either <em>call </em>the function to apply scope or just execute it directly.</p>
<p><textarea class="js" cols="100" name="code">// original<br />
fn.call(scope || array[i], array[i], i, array)<br />
// my version<br />
(scope) ? fn.call(scope, array[i], i, array) : fn(array[i], i, array)</textarea></p>
<p>Using my current web app as the guinea pig, this version ran between <strong>5-18% faster</strong> in Firefox than it&#8217;s non scope checking predecessor. Internet Explorer&#8217;s results were so far scattered across the board that I could not draw a conclusion &#8211; in some tests 50% faster, in others 350% slower. As usual, IE left me confused, so im just going to ignore that for now.</p>
<h2>Can We Do Better?</h2>
<p>The next thing that caught my eye was the fact that when a single item is passed into the <em>each </em>method, it is shoved into an array and sent through the <em>for </em>loop &#8211; this seemed like a place for improvement.</p>
<p><textarea class="js" cols="100" name="code">Ext.each = function(array, fn, scope){<br />
    if(Ext.isEmpty(array, true)){<br />
        return;<br />
    }<br />
    if (!Ext.isIterable(array) || Ext.isPrimitive(array)) {<br />
	if ((scope) ? fn.call(scope, array, 0, array) : fn(array, 0, array) === false) {<br />
		return 0;<br />
	}<br />
    } else {<br />
	for (var i = 0, len = array.length; i < len; i++) {<br />
		if ((scope) ? fn.call(scope, array[i], i, array) : fn(array[i], i, array) === false) {<br />
			return i;<br />
		}<br />
	}<br />
    }<br />
};</textarea></p>
<p>In this case I have simply taken any single non array item that is passed in and executed the function immediately, bypassing the <em>for </em>loop. Results of this change were not noticeable, and matched almost identically with my previous version. Upon closer inspection, it turns out that this case is never reached, in other words, there is always an array passed in. Go figure.</p>
<h2>Summary</h2>
<p>The moral of the story here is to think simple when trying to optimize code, otherwise we end up going to far into optimizing and actually make the code more complex and likely slower, but this does not mean that the code with the fewest characters or lines will be the quickest. Experimenting is fun, so I would encourage everyone to try things like this just to see how they work and in turn gain a better understanding of how the methods you use every day actually work. Priceless.</p>
<p>Code for these tests can be downloaded from my <a href="http://github.com/VinylFox/ExtJS.ux.Misc">Ext.ux.Misc</a> Git repo on Github.</p>
<p>My next step is to test each loop &#8220;unrolling&#8221; to see what the effect is&#8230;let me know what you have tried on your own, and how it has worked out for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/each-second-counts-or-not/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Patterns &#8211; Using Ext JS Override</title>
		<link>http://www.vinylfox.com/patterns-using-ext-js-override/</link>
		<comments>http://www.vinylfox.com/patterns-using-ext-js-override/#comments</comments>
		<pubDate>Mon, 21 Jun 2010 11:59:29 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[ExtJS Tutorials]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=732</guid>
		<description><![CDATA[If you have ever posted a bug report about an Ext JS component then you have likely heard about Override&#8216;s. These Overrides are a way for us to change the way the base library works, usually because of a defect, but sometimes just because we don&#8217;t like or agree with the way something works. Here [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.vinylfox.com/wp-content/uploads/2010/06/cubicle.jpg" class="lightbox"><img src="http://www.vinylfox.com/wp-content/uploads/2010/06/cubicle-150x150.jpg" alt="" style="border: 1px solid rgb(0, 0, 0); margin: 0pt 10px 10px 0pt;" title="Cubicle" width="150" height="150" class="alignleft size-thumbnail wp-image-760" /></a>If you have ever posted a bug report about an Ext JS component then you have likely heard about <em>Override</em>&#8216;s.</p>
<p>These <em>Overrides</em> are a way for us to change the way the base library works, usually because of a defect, but sometimes just because we don&#8217;t like or agree with the way something works. Here we are going to cover how to write a basic <em>Override </em>that &#8216;fixes&#8217; or adds a feature to something in the library.</p>
<h2>Why?</h2>
<p>The last thing we want to do is edit any of the Ext JS distribution files, such as ext-all.js or ext-core.js, we want to instead apply our changes into the library without touching the library files directly, using the library itself to overwrite specific functions where needed. Editing the library files directly would make upgrading nearly impossible. This is where the <em>Override </em>method comes in to help.</p>
<h2>Downfall</h2>
<p>Overriding a base function causes an extra maintenance responsibility &#8211; a shift of responsibility &#8211; simple as that. Though less of a problem than say, editing the ext-all.js file. Every upgrade of the base library (Ext JS) we make requires that we re-examine all of our <em>Overrides </em>to make sure they still sync up with code from the base library, and that the problem were overriding has not been fixed by the Ext JS development team.</p>
<h2>Override</h2>
<p><img width="303" height="170" style="border: 1px solid rgb(0, 0, 0); margin: 0px 0px 10px 10px;" class="alignright wp-image-752" title="Cascade Windows" src="http://www.vinylfox.com/wp-content/uploads/2010/06/cascade.png" alt="Cascade Windows">Were going to start with an <em>override </em>that adds a feature to the library that we desperately need! Or at least that&#8217;s what our boss tells us.</p>
<p>We are adding an option to cascade the placement of new windows based on the position of the previous window. The reason I am adding this as an Override instead of a Plugin or Extension is because im lobbying to get it added as a feature to the library (not really) and when it gets added to the library and I upgrade, I will be able to simply remove my override and continue with life.</p>
<p>The goal is to end up with an no Overrides in your application, by reporting bugs and enhancements to the Ext JS team, and following through so they get fixed in the library.</p>
<p>The Override method of the Ext JS library will take the function(s) we pass to it and overwrite functions of the same name within the component specified. The previously defined function that were replacing are completely removed, and the new ones put in their place.</p>
<p>Two arguments are accepted for the <em>Override </em>method, the first is the <strong>class</strong> that we are overriding, and the second is an <strong>object with the methods</strong> we are overriding.</p>
<p><textarea name="code" cols="100" class="js" style="display: none;">Ext.override(/*CLASS*/, /*METHODS OBJECT*/{<br />
    /*METHOD NAME*/:function(){<br />
        /*DO IT!*/<br />
    },<br />
    /*ANOTHER METHOD NAME*/:function(){<br />
        /*DO IT MORE!*/<br />
    }<br />
});</textarea></p>
<h2>The Code</h2>
<p>We start by copying the source of the original method from the Ext JS source files that come with the SDK download (located in the src folder), in this case it&#8217;s the beforeShow method of Ext.Window (in Window.js). Using the source as a starting point, we can modify the function to do what we need.</p>
<p><textarea name="code" cols="100" class="js" style="display: none;">Ext.override(Ext.Window, {<br />
    beforeShow : function(){<br />
	    delete this.el.lastXY;<br />
	    delete this.el.lastLT;<br />
	    if(this.x === undefined || this.y === undefined){<br />
    		var xy = this.el.getAlignToXY(this.container, &#8216;c-c&#8217;),<br />
    		    pos = this.el.translatePoints(xy[0], xy[1]);<br />
	    	if(this.position === &#8216;cascade&#8217;){<br />
	    		this.x = Ext.winPosx = (Ext.winPosx)? Ext.winPosx+20 : pos.left;<br />
	    		this.y = Ext.winPosy = (Ext.winPosy)? Ext.winPosy+20 : pos.top;<br />
	    	}else{<br />
	    		this.x = this.x === undefined? pos.left : this.x;<br />
	    		this.y = this.y === undefined? pos.top : this.y;<br />
	    	}<br />
	    }<br />
	    this.el.setLeftTop(this.x, this.y);<br />
	    if(this.expandOnShow){<br />
	        this.expand(false);<br />
	    }<br />
	    if(this.modal){<br />
	        Ext.getBody().addClass(&#8216;x-body-masked&#8217;);<br />
	        this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));<br />
	        this.mask.show();<br />
	    }<br />
	}<br />
});</textarea></p>
<p>NOTE: Find the <a href="http://github.com/VinylFox/ExtJS.Patterns/blob/master/Ext.override.js" target="_blank">source</a> on my Github <a href="http://github.com/VinylFox/ExtJS.Patterns" target="_blank">ExtJS.Patterns</a> repo.</p>
<p>Here it has been modified to add an if statement that looks at our new <em>position </em>config to see if its been set to &#8216;cascade&#8217;. From there we can add 20 pixels to both the x and y axis of the previous window position to place it cascaded. The previous window position has been stored in the winPosx/y properties of the Ext object. The else simply runs the original window position code.</p>
<p>This is all overwriting the original <em>beforeShow </em>method of the <em>Window</em>, which simply placed the window in the center of it&#8217;s container. This change applies to every single window that is created, even windows that might be extended from the base window class, it&#8217;s essentially changing the source code of the Ext JS library, without touching the source files.</p>
<h2>How About Fixes</h2>
<p>Fixes are really the same thing, if were adding new features or fixing problems it&#8217;s all the same as far as Overrides are concerned, though most of the time an Override would be used to fix a bug. Need I say more?</p>
<h2>Summary</h2>
<p>Overrides are great for adding features or fixes to the library code without disturbing the source files. Keep this in mind when you run into a bug in the library and need to &#8216;patch&#8217; it to get things working, or have required features that should be part of the base library. The goal should be having <strong>NO </strong>overrides at all, which can be achieved by reporting bugs and posting feature requests. Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/patterns-using-ext-js-override/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Patterns &#8211; Using Ext JS Sequence and Intercept</title>
		<link>http://www.vinylfox.com/patterns-using-ext-js-sequence-and-intercept/</link>
		<comments>http://www.vinylfox.com/patterns-using-ext-js-sequence-and-intercept/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 11:53:01 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[ExtJS Tutorials]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=577</guid>
		<description><![CDATA[I&#8217;m going to run through the usage of a little unknown feature of Ext JS called Sequence and Intercept. These are a pair of related methods built into Ext JS that we can use to add functionality or add fixes to the library without having to override or create a new component. Why is this [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to run through the usage of a little unknown feature of Ext JS called <a href="http://www.extjs.com/deploy/dev/docs/?class=Function&#038;member=createSequence">Sequence</a> and <a href="http://www.extjs.com/deploy/dev/docs/?class=Function&#038;member=createInterceptor">Intercept</a>. These are a pair of related methods built into Ext JS that we can use to add functionality or add fixes to the library without having to override or create a new component. Why is this important? We will take a look at our options to get an idea of the restrictions imposed by each of them, but first I want to frame this all with a scenario.</p>
<h2>Scenario (our use case)</h2>
<p><a href="http://www.vinylfox.com/wp-content/uploads/2009/11/required.gif" class="lightbox"><img src="http://www.vinylfox.com/wp-content/uploads/2009/11/required-150x150.gif" alt="" title="required" width="150" height="150" class="alignright size-thumbnail wp-image-724" align="right"/></a>Our goal here is to create a &#8216;required&#8217; indicator on all form fields by setting a required flag on the configuration object of each component &#8211; in our case, form fields. The code base (the web app) is already in place, so this is a web application that has been completed and is in use.</p>
<p>We have a few options available to make this happen:</p>
<ul>
<li>Override</li>
<li>Extend</li>
<li>Intercept/Sequence</li>
</ul>
<p>Lets take a look at the benefits and problems imposed by these methods.</p>
<h2>Override</h2>
<p>Of course one way to get what we want is to override a particular method in the component were using. If were lucky, there is a stub function in place that we can use, but more often than not, this is not the case. What were left with is having to copy code from the library source files and modify it to fit our needs &#8211; not the optimal solution. This means that each time the Ext JS codebase is updated, we need to check the changes against our overridden copy. This is a maintenance nightmare, though there are cases where this is the optimal solution.</p>
<h2>Extend (new Component)</h2>
<p>The better of our two options is the Extend method. This way creates a copy of the component that we can modify to fit our needs. Not a bad solution all and all. The two problems here are that any components that inherit from our extended component will not get our new functionality, and we now have a copy of the component with a new name, so each place we use that component needs to use our updated component name, ie: &#8216;mysupertextfield&#8217; instead of &#8216;textfield&#8217;. Again, not a big deal, but if I already have a complete web app, and im adding a bit of functionality to a common component, I don&#8217;t want to have to run a find/replace on the entirety of my code.</p>
<h2>Meet intercept/sequence</h2>
<p>My personal favorite in this situation is to add our functionality either before or after an existing method. The intercept method of Ext JS takes whatever function you provide and executes it right before whatever method in the component you specify. The function we define is also executed in the same scope as the method were intercepting.</p>
<p><textarea class="js" cols="100" name="code">Ext.intercept(Ext.form.Field.prototype, &#8216;initComponent&#8217;, function() {<br />
	var fl = this.fieldLabel, ab = this.allowBlank;<br />
	if (ab === false &#038;&#038; fl) {<br />
		this.fieldLabel = &#8216;<span style="color:red;">*</span> &#8216;+fl;<br />
	} else if (ab === true &#038;&#038; fl) {<br />
		this.fieldLabel = &#8216;&nbsp; &#8216;+fl;<br />
	}<br />
});</textarea></p>
<p>NOTE: Find the <a href="http://github.com/VinylFox/ExtJS.Patterns/blob/master/Ext.intercept.js" target="_blank">source</a> on my Github <a href="http://github.com/VinylFox/ExtJS.Patterns" target="_blank">ExtJS.Patterns</a> repo.</p>
<p>With this override, we can use the existing allowBlank flag to trigger the required indicator</p>
<p><textarea class="js" cols="100" name="code">&#8230;<br />
{<br />
        fieldLabel: &#8216;Last Name&#8217;,<br />
        allowBlank: false,<br />
        name: &#8216;last&#8217;<br />
},{<br />
        fieldLabel: &#8216;Company&#8217;,<br />
        allowBlank: true,<br />
        name: &#8216;company&#8217;<br />
}<br />
&#8230;</textarea></p>
<p>In this case, intercept seems to be the perfect fit, allowing us to add a visual required indicator to each component that is extended from the Field base class. The one downside I see here is that this code is executed every single time a field is created, so be sure to make it lean.</p>
<p>We could also use Sequence to achieve this, which uses the same syntax and concept as Intercept, but executes after the method we define has executed instead of before. The order of execution is like this:</p>
<ul>
<li>Intercept</li>
<li>Method (ie: initComponent)</li>
<li>Sequence</li>
</ul>
<h2>Summary</h2>
<p>I hope this has helped. Over the next few weeks I will be blogging about the many Ext JS patterns available, their pros and cons, and practical usage. Each one will have code paired with it on <a href="http://github.com/VinylFox/ExtJS.Patterns" target="_blank">Github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/patterns-using-ext-js-sequence-and-intercept/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>What&#8217;s the Word &#8211; Meetup Videos and More</title>
		<link>http://www.vinylfox.com/whats-the-word-meetup-videos-and-more/</link>
		<comments>http://www.vinylfox.com/whats-the-word-meetup-videos-and-more/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 17:35:54 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS News]]></category>
		<category><![CDATA[General News]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[HtmlEditor]]></category>
		<category><![CDATA[JSConf]]></category>
		<category><![CDATA[Meetup]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=676</guid>
		<description><![CDATA[Every once and a while I like to post a summary of what Ive been up to lately. The past few months have been busy, so I have a ton to talk about, but I will try to summarize. DC Meetup Videos We held the first in a series of meetups that will happen in [...]]]></description>
			<content:encoded><![CDATA[<p>Every once and a while I like to post a summary of what Ive been up to lately. The past few months have been busy, so I have a ton to talk about, but I will try to summarize.</p>
<h1>DC Meetup Videos</h1>
<p>We held the first in a series of <a href="http://www.meetup.com/NoVa-Javascript-Ext-JS-Users-Group/">meetups that will happen in the DC/NoVA</a> area last week, a sprout of our <a href="http://www.meetup.com/baltimore-dc-javascript-users/" target="_blank">Baltimore area Meetup</a> for our southern friends, and I have to say that it was a huge hit. The meetups are going to be managed by Pat Sheridan from <a href="http://threepillarsoftware.com/" target="_blank">Three Pillar Global</a>, and we are hoping it will be a way to get JavaScript developers from the DC area more involved in the community. <a href="http://tdg-i.com/" target="_blank">Jay</a> was kind enough to bring video equipment and record our presentations, along with editing the videos and posting them to the intertubes.</p>
<p><a href="http://tdg-i.com/262/ext-js-meetup-1192010-meetup-videos" title="Jonathan Julian"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/02/2010-01-19_1941-150x150.png" alt="Jonathan Julian" title="Jonathan Julian" width="150" height="150" class="alignnone size-thumbnail wp-image-658" /></a><a href="http://tdg-i.com/262/ext-js-meetup-1192010-meetup-videos" title="Shea Frederick"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/02/extjsmeetup-150x150.jpg" alt="Shea Frederick" title="Shea Frederick" width="150" height="150" class="alignnone size-thumbnail wp-image-659" /></a><a href="http://tdg-i.com/262/ext-js-meetup-1192010-meetup-videos" title="Pat Sheridan"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/02/2010-01-19_1932-150x150.png" alt="Pat Sheridan" title="Pat Sheridan" width="150" height="150" class="alignnone size-thumbnail wp-image-660" /></a></p>
<p>There are some <a href="http://www.meetup.com/baltimore-dc-javascript-users/photos/807828/" target="_blank">photos</a> and other information about the event on its <a href="http://www.meetup.com/baltimore-dc-javascript-users/calendar/12219819/" target="_blank">meetup page</a>.</p>
<p>If you are in the <a href="http://www.meetup.com/baltimore-dc-javascript-users/">Baltimore area and into JavaScript</a> with a fury, you should visit our Meetup that happens the first Wednesday of each month at 6:30PM in the <a href="http://www.beehivebaltimore.com/">Beehive Baltimore</a>. This month&#8217;s meetup has a presentation from <a href="http://paulbarry.com/">Paul Barry</a> about <a href="http://nodejs.org/">Node.js</a> &#8211; it&#8217;s gonna be bad ass.</p>
<h1>Speed Testing</h1>
<p>My little addiction I like to call speed testing has rolled into full swing. Now that I have the tools in place to create and launch tests, along with run reporting on the results with ease, I can pretty much just sit down and spend 30 minutes or so to design and launch the test. <a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/inchworm.jpg"><img src="http://www.vinylfox.com/wp-content/uploads/2010/01/inchworm-150x150.jpg" alt="" title="inchworm" width="150" height="150" class="alignright" style="border: 1px solid rgb(0, 0, 0); margin: 10px 0 0 10px;" /></a> I have two tests currently gathering data, one is testing the speed of rendering an image with and without a data URL, the other has to do with the speed of code wrapped in a try catch statement. Should be some interesting results, which I will be posting a summary on soon. My first test was for <a href="http://www.vinylfox.com/json-decoding-speed-comparison/">JSON decoding speed</a>, which I posted results for a couple of weeks ago.</p>
<h1>HtmlEditor Plugins</h1>
<p>The Ext JS team has expressed an interest in including my <a href="http://code.google.com/p/ext-ux-htmleditor-plugins/" target="_blank">HtmlEditor Plugins</a> as a UX in the SDK. This will mark the third development of mine that has become part of the Ext JS SDK download, first it was the <a href="http://code.google.com/p/ext-ux-gmappanel/" target="_blank">GMapPanel UX</a>, then the Grid Filter backend PHP code, now it seems that the Ext JS SDK will finally come with a more robust HtmlEditor example. A few updates have been committed recently that add the option to change the language in these plugins, along with some general code cleanup. Also starting to move my code over to <a href="http://github.com/VinylFox/ExtJS-HtmlEditor-Plugins">Github</a> as <a href="http://twitter.com/christocracy/status/8593793204">suggested</a> by <a href="http://twitter.com/jonathanjulian/status/8595481114">many</a>.</p>
<h1>Books</h1>
<p>Soon we will have <a href="http://tdg-i.com/" target="_blank">Jay Garcia&#8217;s</a> <a href="http://www.extjsinaction.com" target="_blank">Ext JS in Action</a> book released in print, and the 2nd edition of <a href="http://www.learningextjs.com" target="_blank">Learning Ext JS</a> should be released later this year, titled &#8220;Learning Ext JS 3.0&#8243;. <a href="http://blog.cutterscrossing.com/index.cfm/2010/1/1/Out-With-The-Old-In-With-The-New-2009--2010">Cutter</a>, <a href="http://colinramsay.co.uk/diary/">Colin</a> and I got together to update the book, fix some errors, and add new chapters to take advantage of new features in Ext JS 3.0. It&#8217;s gonna be an awesome resource for anyone just getting started with Ext JS.</p>
<h1>JSConf</h1>
<p>Again, <a href="http://jsconf.us/2010/" target="_blank">JSConf</a> is being held in the DC area, which makes it incredibly cheap for me to attend, but this year I decided to try my hand at submitting a talk proposal. I can&#8217;t wait to find out if I will be chosen. My submission was for an introduction to rapid application prototyping using the Ext JS library. Here is my submission:</p>
<p><textarea class="js" cols="100" name="code">{<br />
    &#8220;name&#8221;:&#8221;Shea Frederick&#8221;,<br />
    &#8220;email&#8221;:&#8221;________@________.com&#8221;,<br />
    &#8220;twitter&#8221;:&#8221;VinylFox&#8221;,<br />
    &#8220;location&#8221;:&#8221;Baltimore, MD&#8221;,<br />
    &#8220;topic_title&#8221;:&#8221;Rapid Web Application Development with Ext JS&#8221;,<br />
    &#8220;topic_description&#8221;:&#8221;Discuss general principles of the Ext JS library<br />
    and show how easy it can be to rapidly prototype a web application<br />
    using the library.&#8221;,<br />
    &#8220;claim_to_fame&#8221;:&#8221;One of the core contributors to the Ext JS library<br />
    along with other Open Source JavaScript projects. Author of<br />
    &#8216;Learning Ext JS&#8217; published in December 2008. Observed &#8216;Talk Like<br />
    a Pirate Day&#8217;. Maintain a Blog of JavaScript fun at<br />
    http://www.vinylfox.com&#8221;<br />
}</textarea></p>
<p>Did I mention that all submissions have to be in the form of valid JSON? Yeah, geeky, but good &#8211; very good. With any luck, I will <a href="http://jsconf.posterous.com/the-soon-to-be-awkward-moment">find out later this week</a> if ive been accepted.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/whats-the-word-meetup-videos-and-more/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JSON Decoding Speed Comparison</title>
		<link>http://www.vinylfox.com/json-decoding-speed-comparison/</link>
		<comments>http://www.vinylfox.com/json-decoding-speed-comparison/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 14:09:31 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=602</guid>
		<description><![CDATA[Meet Karl &#8211; Karl is a very cute wind up Inchworm that my wife put in my stocking for x-mas. What does Karl have to do with JSON? Probably nothing, but he is very photogenic, and I like having a picture in my blog posts. Now that our new buddy Karl has been properly introduced, [...]]]></description>
			<content:encoded><![CDATA[<p><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/inchworm.jpg"><img src="http://www.vinylfox.com/wp-content/uploads/2010/01/inchworm-150x150.jpg" alt="" title="inchworm" width="150" height="150" class="alignleft" style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" /></a>Meet Karl &#8211; Karl is a very cute wind up Inchworm that my wife put in my stocking for x-mas. What does Karl have to do with JSON? Probably nothing, but he is very photogenic, and I like having a picture in my blog posts.</p>
<p>Now that our new buddy Karl has been properly introduced, lets move on to the boring stuff. I have been trying to optimize decoding of a large chunk of JSON data by testing decoding speeds between the three main methods of decoding JSON and how that applied to the type of data that was being decoded, along with the environment, ie: the browser. My data has been gathering for over a month now, and has run on 3500 unique clients, so I feel like I can come to a decent conclusion.</p>
<h2>The Decoded Data</h2>
<p>I figured for my testing purposes that there were five main types of data that would be commonly decoded.</p>
<ul>
<li>Empty Array</li>
<li>Empty Object</li>
<li>Array Data Only</li>
<li>Object Data Only</li>
<li>Mixed Array and Object Data</li>
</ul>
<h2>The Decoding Methods</h2>
<p>Generally speaking, you will find three methods of decoding JSON used in the wild, though <em>eval </em>is by far the most common. I am not using any decoding/encoding libraries because I don&#8217;t want to taint the results with any browser targeted workarounds that might be present in them, I just want to know what the actual browser does.</p>
<p><textarea class="js" cols="100" name="code">o = eval( &#8220;(&#8221; + testData + &#8220;)&#8221; );</textarea></p>
<p><b>eval</b> &#8211; This is the old standard for decoding JSON, which is considered dangerous to use because of its ability to create functions.</p>
<p><textarea class="js" cols="100" name="code">o = JSON.parse( testData );</textarea></p>
<p><b>native</b> &#8211; The latest and greatest method of decoding JSON, recent browsers include this built in feature. The &#8216;safe&#8217; way to decode data.</p>
<p><textarea class="js" cols="100" name="code">o = new Function( &#8220;return &#8221; + testData )();</textarea></p>
<p><b>new function</b> &#8211; This method is essentially the same as eval, but uses the evaluating mechanism of the Function constructor to decode data.</p>
<h2>In The Wild</h2>
<p>I wanted my testing to represent actual usage in the wild, so I used a tool that allowed my tests to run in the browsers of unsuspecting internet surfers. So the results I have can be considered an accurate depiction of what will actually be encountered on the intertubes. If you&#8217;re creating intranet sites targeted to a particular browser, then these results should be interpreted differently. Any browser that cannot handle all three methods of decoding JSON was not included in the test, so you IE6/7 guys are out of luck. Also, any browser that has an active console (console object present) was excluded due to the overhead of debuggers (ie: FireBug).</p>
<h2>The Outcome</h2>
<p>The results are quite interesting, and confusing in some cases. Im guessing there is room for some browsers to optimize their JSON decoding routines here. This first chart shows results grouped by browser make. The X axis in all of the following results shows milliseconds per 1000 repetitions, so smaller is better. Legend colors used in the first graph will continue through all graphs.</p>
<p><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-test-results3.gif"><img src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-test-results3.gif" alt="" title="json-test-results" width="546" height="420" class="alignnone size-full wp-image-620" style="position: relative; left: -65px;"/></a></p>
<p>This is all good and fine if your a browser vendor and want to know how you&#8217;re browser stacks up against others, but in web development we don&#8217;t have the option of picking our clients browser. What we want to see is what programming techniques we can use to take advantage of browser efficiency across the board. Which leads us to the next chart, showing results grouped by decoding method</p>
<p><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-test-results21.gif"><img src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-test-results21.gif" alt="" title="json-test-results2" width="546" height="333" class="alignnone size-full wp-image-621" style="position: relative; left: -65px;"/></a></p>
<p>That&#8217;s more like it, I now have a clearer idea of how the methods themselves stack up against each other, the red line indicates the average of all the data types.</p>
<h2>The Conclusion</h2>
<p>Even though the results seem to indicate that <em>native </em>JSON decoding is only mildly faster than <em>eval</em>, its actually a bit faster if you exclude the strange handling of empty <em>objects </em>in <a href="http://www.mozilla.com/firefox/" target="_blank">Firefox</a>. For the purpose of choosing a method, I think we can draw the conclusion that <em>native </em>JSON decoding is the clear winner here, followed closely by <em>eval</em>, and the <em>function constructor</em> being a general bad idea.</p>
<p>Comparing the browsers for <em>native </em>decoding, <a href="http://www.apple.com/safari/" target="_blank">Safari</a> is a clear winner here, with our new buddy <a href="http://www.google.com/chrome" target="_blank">Chrome</a> losing the race by quite a lot.</p>
<h2>Quirks</h2>
<p>By far the biggest quirk is <a href="http://www.mozilla.com/firefox/" target="_blank">Firefox</a>&#8216;s slowness in decoding an empty <em>Object </em><em>natively</em>, which skews the results, making it appear that <em>native </em>JSON decoding is only mildly faster than <em>eval</em>.</p>
<p>Another interesting result was decoding using <em>eval </em>ran 500% slower with <a href="http://getfirebug.com/" target="_blank">FireBug</a> enabled, while <em>native </em>decoding suffered no degradation at all when <a href="http://getfirebug.com/" target="_blank">FireBug</a> was enabled.</p>
<p><a href="http://www.apple.com/safari/" target="_blank">Safari</a> apparently does not handle the <em>function constructor</em> very efficiently.</p>
<p>As a general rule of thumb the straight <em>array </em>data decoded the slowest, so when considering system design, <em>array </em>data should only be used when there is a clear benefit to it.</p>
<h2>Feedback</h2>
<p>If there are any particular ways you would like to see the data broken out, just let me know in the comments and ill see what I can do.</p>
<p><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-firefox.gif" title="Firefox 3.1 &#038; up"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-firefox-150x150.gif" alt="Firefox 3.1 &#038; up" title="Firefox 3.1 &#038; up" width="150" height="150" class="alignnone size-thumbnail wp-image-658" /></a><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-chrome.gif" title="Chrome"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-chrome-150x150.gif" alt="Chrome" title="Chrome" width="150" height="150" class="alignnone size-thumbnail wp-image-659" /></a><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-msie.gif" title="MSIE 8"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-msie-150x150.gif" alt="MSIE 8" title="MSIE 8" width="150" height="150" class="alignnone size-thumbnail wp-image-660" /></a><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-safari.gif" title="Safari"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-safari-150x150.gif" alt="Safari" title="Safari" width="150" height="150" class="alignnone size-thumbnail wp-image-661" /></a><a class="lightbox" href="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-all.gif" title="Combined"><img style="border: 1px solid rgb(0, 0, 0); margin: 0 10px 10px 0;" src="http://www.vinylfox.com/wp-content/uploads/2010/01/json-result-all-150x150.gif" alt="Combined" title="Combined" width="150" height="150" class="alignnone size-thumbnail wp-image-662" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/json-decoding-speed-comparison/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Three Pillars, Four Geeks and Ext JS</title>
		<link>http://www.vinylfox.com/three-pillars-four-geeks-and-ext-js/</link>
		<comments>http://www.vinylfox.com/three-pillars-four-geeks-and-ext-js/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 17:54:01 +0000</pubDate>
		<dc:creator>Shea Frederick</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[ExtJS News]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.vinylfox.com/?p=611</guid>
		<description><![CDATA[I will be presenting along side some other Ext JS geeks at this quarters Three Pillar Tech Meetup. The following is a summary of the event details posted on the Three Pillar News Blog and Jay Garcia&#8217;s Blog. Hope to see you there! At 6:30PM on 1/19/2010, Three Pillar Global will be hosting a gathering [...]]]></description>
			<content:encoded><![CDATA[<p>I will be presenting along side some other Ext JS geeks at this quarters Three Pillar Tech Meetup. The following is a summary of the event details posted on the <a href="http://threepillarglobal.com/three-pillar-global-tech-meetup-january-19-2010" target="_blank">Three Pillar News Blog</a> and <a href="http://tdg-i.com/219/three-pillar-global-plays-host-to-an-extjs-gathering" target="_blank">Jay Garcia&#8217;s Blog</a>. Hope to see you there!</p>
<p>At 6:30PM on 1/19/2010, Three Pillar Global will be <a href="http://www.meetup.com/baltimore-dc-javascript-users/calendar/12219819/" target="_blank">hosting a gathering</a> of industry leading minds in the metro DC area to discuss and share development practices, ideas, tips and tricks revolving around the Ext JS framework. There will be four presentations that are jam-packed with information that can aid to your success in developing applications with the Ext JS framework</p>
<h2>About the presentations:</h2>
<p>Patrick Sheridan will kick off the meeting, where he will explain how analysis-driven development can aid in the success of your application construction, reducing time from conception to production. Shea Frederick will be guiding us through advanced JavaScript debugging techniques, demonstrating some of the best tricks for the latest and greatest JavaScript development tools. Jonathan Julian is going to share and elaborate on five areas to improve your Ext JS applications, which range from defining your own components to properly overriding the framework. Lastly, Jay Garcia will discuss how to build extensible applications using a two-tiered approach with Ext JS.</p>
<p>Food and refreshments to be provided. We look forward to <a href="http://www.meetup.com/baltimore-dc-javascript-users/calendar/12219819/" target="_blank">seeing you there</a>!</p>
<h2>About the presenters:</h2>
<p><img class="borderimg" style="margin: 15px 15px 0 0;" width="75" height="75" align="left" src="http://www.extjs.com/forum/image.php?u=3054&amp;dateline=1247548690" alt="" /> Pat Sheridan is a successful Ext JS developer that leverages his user experience background to accelerate successful development with RIA JavaScript frameworks, including Ext JS.  With success stories such as the complete rewrite of the U.S. Treasury&#8217;s Pay.gov website and the production of four large RIA applications for the Financial Regulatory Authority (FINRA), he continues to dominate this space with a progressive thought process that enhances the development and user experience alike.  He demonstrated his UX leadership with the release of an <a href="http://www.extjs.com/forum/showthread.php?t=31514" target="_blank">Ext JS 2.0 OmniGraffle template</a> that has garnered over 50,000 downloads world wide.</p>
<p><img class="borderimg" style="margin: 15px 15px 0 0;" width="75" height="75" align="left" src="http://www.vinylfox.com/wp-content/uploads/2008/09/newyork-288x300.jpg" alt="" />Shea Frederick is an active community member for ExtJS.  His expertise is drawn from community forum participation, work with the core development team, and his own experience as the architect of several large ExtJS-based web applications.   Shea is also an author for <a href="http://jsmag.com" target="_blank">JavaScript</a> Magazine, his own blog (<a href="http://vinylfox.com">http://vinylfox.com</a>), and the <a href="http://www.extjs.com/blog/2008/07/21/using-yahoos-boss-api-to-search-the-web/" target="_blank">Ext JS blog.</a>  He is the lead author of the <a href="http://learningextjs.com" target="_blank">Learning Ext JS</a> book and is the organizer for the <a href="http://www.meetup.com/baltimore-dc-javascript-users/" target="_blank">Baltimore JavaScript developers</a> meetup group. </p>
<p><img class="borderimg" style="margin: 15px 15px 0 0;" width="75" height="75" align="left" src="http://www.gravatar.com/avatar/519e2fdbde9ac0662f8c82438e3b4d6c?s=75" alt="" />While not very well known in the Ext JS community, Jonathan Julian is successful independent web developer specializing in Rails and Ext JS applications with extensive experience in Java and related technologies. He occasionally blogs about software and web  development at <a href="http://jonathanjulian.com/" target="_blank">jonathanjulian.com</a> and tweets as @jonathanjulian.  He has presented at the <a href="http://www.meetup.com/baltimore-dc-javascript-users/" target="_blank">Baltimore JavaScript developers</a> meetup group. </p>
<p><img class="borderimg" style="margin: 15px 15px 0 0;" width="75" height="75" align="left" src="http://media.linkedin.com/mpr/mpr/shrink_80_80/p/1/000/012/3f1/1719f93.jpg" alt="" />Jay Garcia, author of the up and coming book, Ext JS in Action (<a href="http://extjsinaction.com/" target="_blank">http://extjsinaction.com/</a>), provides daily support on the Ext JS forums as well as free extensions and widgets to the library.  He is an author for  <a href="http://tdg-i.com/213/november-2009-js-magazine-now-available" target="_blank">JSMagazine</a>, the <a href="http://www.extjs.com/blog/2009/09/13/5-steps-drag-and-drop-with-ext-js/" target="_blank">Ext JS blog</a> and his own blog at <a href="http://tdg-i.com" target="_blank">http://tdg-i.com</a>.  He&#8217;s developed enterprise-level applications using Ext JS since early 2006, when it was known as &#8220;yui-ext&#8221; and has continued to support and assist in the expansion of the product ever since.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.vinylfox.com/three-pillars-four-geeks-and-ext-js/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

