<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Charles Bryant's Decoupled Logic</title>
	
	<link>http://www.charlesbryant.com</link>
	<description>Just some words about things on my mind.</description>
	<lastBuildDate>Sun, 12 Jun 2011 02:28:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/charleslbryant" /><feedburner:info uri="charleslbryant" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>charleslbryant</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Using jQuery.map() to Map One Object To Another</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/IDWwIUu54u8/</link>
		<comments>http://www.charlesbryant.com/index.php/386/using-jquery-map-to-map-one-object-to-another/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 02:18:05 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery.map]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=386</guid>
		<description><![CDATA[Today was another day of learning. As part of a redesign, I had to convert a JavaScript object to an array used in the jQueryUI autocomplete plug-in. I have a service that returns a JSON object containing a list of category ID and Names that match a search for terms entered into an auto complete [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.charlesbryant.com/wp-content/uploads/2011/06/jquerymap.jpg"><img class="alignleft size-thumbnail wp-image-389" title="jquerymap" src="http://www.charlesbryant.com/wp-content/uploads/2011/06/jquerymap-150x150.jpg" alt="" width="150" height="150" /></a>Today was another day of learning. As part of a redesign, I had to convert a JavaScript object to an array used in the <a href="http://jqueryui.com/demos/autocomplete/" target="_blank">jQueryUI autocomplete plug-in</a>. I have a service that returns a JSON object containing a list of category ID and Names that match a search for terms entered into an auto complete text box. I need to convert this to an array of arrays containing the category’s ID, Name, and the term highlighted in the Name. If you have a problem like this, here&#8217;s one way to solve it.<span id="more-386"></span></p>
<p>Before I jumped into the chaotic world of loops and recursive algorithms, I decided to see if there was something new and simple. Just so happens jQuery 1.6 has a revamped $.map function that can provide exactly what I need. Last time I used map it only worked on arrays, but now it can take a JavaScript object&#8230;sweet.</p>
<p>It’s so simple it should be a crime. You just feed it your object and a callback function and it returns the result of the callback function in an array. So as it iterates through each item in your object, it runs the anonymous function against the item and packages the results into an array. When it&#8217;s done it returns the array to you. No loops, no iterators, 3 lines of code and done son. Did I say I love jQuery.</p>
<p>Here’s what I have:</p>
<p><em>Alert: this is not production ready code nor does it provide a best practice guidance or implementation.</em></p>
<pre class="brush: javascript;">$.map(categories, function(item) {
var highlight = item.Title.replace(/(+request.term+)/,'i'),'&lt;span class=\"autofound\"&gt;$1&lt;/span&gt;');
return { id: item.Id, highlight: highlight, name: item.Title };
}</pre>
<p>First I pass the map function a collection of categories and supply the anonymous function callback function(item){…}. To set the highlighted term we are using RegEx to find the requested term in the current category item in the map iteration. request.term is the term that the user typed into auto complete, as they type the map function is called and will return the categories that match the request.term in an array with the id, name, and a highlight comprised of the category Title with the requet.term bolded in the category’s Title.  To widen the RegEx matche, we are also ignoring case (&#8216;i&#8217;). Once the term is found we replace it with itself, but bolded.  For example: if term is Hello and item’s category is &#8220;Hello World&#8221;, this returns <strong>&#8220;Hello</strong> World&#8221; as the highlight. Note: you can add another argument to the anonymous function as an iterator index (e.g. function(item, i) with i providing the index in the iteration, actually the index or key of the current item (you can check the references below for more info on this).</p>
<p>You may ask why I don’t write a loop or use jQuery .each(). There is most likely a better way, there always is. Why do it this way? The real answer is because .map() is new (upgraded) and cool and I wanted to learn how to use it with objects. The correct answer should be that it performs better or solves some other issue that the other options don’t. I can’t say that with certainty. I do remember reading posts about comparisons and I know the quick logic in my head decided just to use .map() in this situation (which isn’t a production use, but a proof of concept spike), but it’s been a few days since I did my research and I don’t remember pros and cons, nor do I have time to look again. So, I will leave that research to you and Google. Try <a href="http://tinyurl.com/6fdxa8a" target="_blank">http://tinyurl.com/6fdxa8a</a> for a start.</p>
<p>Some of the references that I can remember using included:</p>
<ul>
<li><a href="http://api.jquery.com/jQuery.map/" target="_blank">http://api.jquery.com/jQuery.map/</a> &#8211; official jQuery.map() API doc</li>
<li><a href="http://www.learningjquery.com/2011/05/jquery-map-in-16" target="_blank">http://www.learningjquery.com/2011/05/jquery-map-in-16</a> &#8211; actually has a deep look into .map() and .each()</li>
<li><a href="http://www.javascriptkit.com/javatutors/re3.shtml" target="_blank">http://www.javascriptkit.com/javatutors/re3.shtml</a> &#8211; not related to .map(), but a quick glance to get my RegEx ignore case property</li>
<li><a href="http://www.michelsalib.com/2010/08/extended-customization-of-jquery-ui-autocomplete/" target="_blank">http://www.michelsalib.com/2010/08/extended-customization-of-jquery-ui-autocomplete/</a> &#8211; actually came across this after my spike. I guess I duplicated someone else’s solution. Either I saw this before or I can feel better about the approach because someone else came to the same conclusion. Either way he has a good post on it.</li>
</ul>
<div class="shr-publisher-386"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=IDWwIUu54u8:CkBQadly-EE:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=IDWwIUu54u8:CkBQadly-EE:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=IDWwIUu54u8:CkBQadly-EE:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/IDWwIUu54u8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/386/using-jquery-map-to-map-one-object-to-another/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/386/using-jquery-map-to-map-one-object-to-another/</feedburner:origLink></item>
		<item>
		<title>Visual Studio Find and Replace with Regular Expresions</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/tECumz3W8CQ/</link>
		<comments>http://www.charlesbryant.com/index.php/376/visual-studio-find-and-replace-with-regular-expresions-2/#comments</comments>
		<pubDate>Thu, 19 May 2011 23:00:27 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[regular expressions]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=376</guid>
		<description><![CDATA[In this new post about some of my daily issues I’m going to finally get around to understanding Visual Studio find and replace with regular expressions. I have always used find and replace to update simple string matches, but now I want to up the ante and find and replace with regular expression matching. Regular [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.charlesbryant.com/wp-content/uploads/2011/05/vsfindreplace.jpg"><img class="alignleft size-thumbnail wp-image-377" title="vsfindreplace" src="http://www.charlesbryant.com/wp-content/uploads/2011/05/vsfindreplace-150x150.jpg" alt="" width="150" height="150" /></a>In this new post about some of my daily issues I’m going to finally get around to understanding Visual Studio find and replace with regular expressions. I have always used find and replace to update simple string matches, but now I want to up the ante and find and replace with regular expression matching. Regular expressions are awesome and I use them in my code, but never had the time or need to explore their use in Visual Studio find and replace. I hope it isn&#8217;t too different from normal regex.</p>
<p>First things first, let’s get grounded with a good references: MSDN &#8211; <a href="http://msdn.microsoft.com/en-us/library/2k3te2cs%28VS.100%29.aspx">http://msdn.microsoft.com/en-us/library/2k3te2cs%28VS.100%29.aspx</a>. Doesn’t look too difficult, just have to watch my typing very carefully.<span id="more-376"></span></p>
<p>Here&#8217;s what I want to do:</p>
<p><strong>Find</strong> Application[“AnyValue”].ToString()</p>
<p><strong>Replace</strong> <strong>with</strong> Config.Get&lt;string&gt;(“AnyValue”)</p>
<p>Here&#8217;s what I got:</p>
<p><strong>Find</strong> Application\[{:q}\]\.ToString\(\)</p>
<p><strong>Replace with</strong> Config.Get&lt;string&gt;(\1)</p>
<p>A little explanation:</p>
<p>\ &#8211; this is an escape character that lets us find characters that are used in regular expression notation (e.g. [ ] ( ) { } )</p>
<p>:q – match string that is enclosed in single or double quotes</p>
<p>{} – this tags values that we want to show up in the replace string. So, {:q} in find can be used as \1 in replace. Or, get the quoted value and put it where the \1 place holder is.</p>
<p>Click &#8220;Replace All,&#8221; run automated build and tests, and done son! Moved 200+ lines of code from using an archaic HttpApplicationState based global configuration to a custom abstract multi-tenant configuration. Research and implementation &#8211; 15 minutes, lesson learned &#8211; priceless.</p>
<div class="shr-publisher-376"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=tECumz3W8CQ:1F-rt-TMxdA:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=tECumz3W8CQ:1F-rt-TMxdA:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECumz3W8CQ:1F-rt-TMxdA:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/tECumz3W8CQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/376/visual-studio-find-and-replace-with-regular-expresions-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/376/visual-studio-find-and-replace-with-regular-expresions-2/</feedburner:origLink></item>
		<item>
		<title>Update ASP.net DataGrid Textbox Value from Popup Window</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/pvGVYfU7w5Y/</link>
		<comments>http://www.charlesbryant.com/index.php/368/update-asp-net-datagrid-textbox-value-from-popup-window/#comments</comments>
		<pubDate>Tue, 10 May 2011 22:00:27 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[DataGrid]]></category>
		<category><![CDATA[JQuery]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=368</guid>
		<description><![CDATA[I am using an old school ASP.net DataGrid with inline editing. When I click on a row’s edit link the row values turn into HTML textboxes and other controls for inline editing. The Id of the controls are scoped by the Id of parent container (e.g. the DataGrid), your normal ASP.net unique naming convention. I [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.charlesbryant.com/wp-content/uploads/2009/09/code.jpg"><img class="alignleft size-full wp-image-92" title="code" src="http://www.charlesbryant.com/wp-content/uploads/2009/09/code.jpg" alt="" width="150" height="150" /></a>I am using an old school ASP.net DataGrid with inline editing. When I click on a row’s edit link the row values turn into HTML textboxes and other controls for inline editing. The Id of the controls are scoped by the Id of parent container (e.g. the DataGrid), your normal ASP.net unique naming convention. I need to attach a JavaScript event handler function to a textbox’s onclick event. This function will open an image file browser in a new window (popup). The image file browser let’s me upload select an image from an image library. Once selected, I click a button and it triggers a function to pass data to the caller (generally passing the image URL to a textbox/WYSIWYG editor). The basic mechanics of the button’s onclick handler is to call a function that uses window.opener to send the data back to the original window. My mission today is cross window communication where I have the image file browser&#8217;s button onlick handler pass the selected image URL to the textbox that was clicked in the DataGrid. Additionally, I have to shorten the URL to a virtual URL because the image file browser sends an absolute URL.<span id="more-368"></span></p>
<p>First thing first, how do we attach an event handler to a dynamically created textbox that is added to the DOM after everything is hooked up. Let’s ask Google. [Time Lapse…about 5 minutes in the future] OK, I’m back and I found a nice answer that references the all powerful jQuery library, which I’m already using so this was great. The jQuery ‘live’ function can attach events to DOM elements that are added after the page is all loaded. I knew this, used it a few times before, but it just didn’t occur to me to use it, duh (these brain farts are common in caffeine induced states).</p>
<pre class="brush: javascript;">$(&lt;selector&gt;).live("click", function() {
    // cool code here
});</pre>
<p>Google Search: “attach javascript event to dynamic element”</p>
<p>Answer URL: <a href="http://stackoverflow.com/questions/1359018/in-jquery-how-to-attach-events-to-dynamic-html-elements" target="_blank">http://stackoverflow.com/questions/1359018/in-jquery-how-to-attach-events-to-dynamic-html-elements</a></p>
<p>OK, that is working nicely, thank God for Google. Note to self: jQuery live can attach a function to dynamically created controls (write it 50 times on the blackboard).</p>
<p>Now I have to open my image file browser. We add a CssClass attribute (class name ‘visual’) to the ItemStyle of the column we want to use to open the image file browser. We will use a simple window.open function for this (actually I will use a popup and center function that I get a lot of reuse out of).</p>
<pre class="brush: javascript;">$(function () {
    $(".visual").live("click", function () {
        PopUp('imagegallery.aspx?no-ck=1&amp;type=file', 'gallery', 300, 400, 1);
    });
});</pre>
<p>Thinking ahead I don’t readily see how to return the image URL to a dynamically created textbox. Normally, I would use window.opener and statically target a known element. Put another way, I usually know what element to target and I can write code that speaks to it directly (hardcode the control Id). In this instance, my element is dynamically generated, so I don’t know who to talk to. Another problem is my image browser uses some heavy JavaScript, but no jQuery so I’m not sure if it will play nice with jQuery. Well, it can’t hurt to try and find out, but I think I can get my textbox selected in the parent (opener) where I can use jQuery no problem. We will experiment with breaking the image file browser later.</p>
<p>Let’s add a selector that will find the textbox. Wait, how do I select it? This is what a text box Id looks like, ctl00$MainBody$dg$ctl02$ctl07 (classic ASP.net WTF). If I edit the row below it I get this, ctl00$MainBody$dg$ctl03$ctl07 for the text box Id. So, I have the DataGrid Id, ctl00$MainBody$dg, and the row/column, $ctl02$ctl07. The variable is the row. Alrighty then, we can do this. Let’s build a jQuery selector that can find this row column. Dang, I am embarrassed to say that I don’t know how to do this off the top of my head. No problem that a quick search of the jQuery docs can’t fix. Since there will only be one row selected at a time, hence one control at $ctl&lt;number&gt;$ctll07, we will take a chance with an Attribute Ends With Selector and target the column, $ctl07.</p>
<pre class="brush: javascript;">$([id$=$ctl07])</pre>
<p>Yes, I hear all the problems you are rattling off. I know if something changes in the container or DataGrid naming, if I change the column order, or whatever else, that it will mess this up, but I’m betting that it won’t happen anytime soon. In the real world, when something is stable, and this DataGrid’s page has been for years, it’s safe to cut corners. Plus, if it does change it is an easy fix and we can harden the implementation when and if the situation calls for it. So, let’s add this to a function that our image file browser window.opener function can call and see if we get our URL back. My code in the image file browser is:</p>
<pre class="brush: javascript;">window.opener.UpdateUrl(fileUrl);</pre>
<p>And on the DataGrid page</p>
<pre class="brush: javascript;">function UpdateUrl(url) {
    $("[id$='$ctl07']").val(url);
}</pre>
<p>After some soul searching, calming exercises and clever Firebug JavaScript debugging, I discovered that my sleepy eyes where reading “name” and interpreting “id”. So, here is the updated JavaScript with the attribute updated to the actual, not imaginary, value. (Note: I moved selector result to a variable to aide debugging)</p>
<pre class="brush: javascript;">function UpdateUrl(url) {
    var textBox = $("input[name$='ctl07']");
    textBox.val(url);
}</pre>
<p>Yeah! That worked. We can open the image file browser by clicking a text box in the DataGrid and the image browser is passing the URL back to the text box.</p>
<p>Now we have to get the virtual path, with no leading slash. I want to get the part of the path that does not include the domain name (e.g. from http://www.mydomain.com/mydirectory/myfile.htm to read only mydirectory/myfile.htm) Since we need speed, this has taken too long, no need in reinventing the wheel. Let’s try borrowing a function from, <a href="http://blog.programmingsolution.net/javascript/url-parsing-using-javascript-get-domain-name-port-number-and-virtual-directory-path/">http://blog.programmingsolution.net/javascript/url-parsing-using-javascript-get-domain-name-port-number-and-virtual-directory-path/</a>.</p>
<pre class="brush: javascript;">function GetVirtualDirectory(url) {
    var urlParts = url.split('/');
    urlParts[urlParts.length - 1] = '';
    var virtualPath = urlParts.join('/');
    return virtualPath;
}</pre>
<p>I know my mother told me to read code before I use it, this is not what I need. If you didn’t notice, the code snip above chops off the end of the URL, the very part I want. Well, I’m tired and I need to be done with this so I present this ugly ball of goo:</p>
<pre class="brush: javascript;">function GetVirtualPath(url) {
    var urlParts = url.split('/');
    urlParts[0] = '';
    urlParts[1] = '';
    urlParts[2] = '';
    var virtualPath = urlParts.join('/');
    virtualPath = virtualPath.substring(3, virtualPath.length);
    return virtualPath;
}</pre>
<p>Same logic just removing the first 3 indexes from urlParts to remove http://www.mydomain.com. Yes this will be refactored to use replace or something a little more sanitary. I just code the first and simplest thing that came to mind.</p>
<p>Well that’s it for now. I have been getting requests for this for a while and it took me about 2 hours to plan, research, code, debug, test, and blog. From my ASP.net DataGrid I am able to click on a textbox to open a custom image file browser, select an image, and insert the value of the virtual path for the image in a text box in the DataGrid. By the way, this little ditty is for an XML based editor that allows users to add and remove images for a JavaScript image scroller.</p>
<div class="shr-publisher-368"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=pvGVYfU7w5Y:TMgh444EmJU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=pvGVYfU7w5Y:TMgh444EmJU:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=pvGVYfU7w5Y:TMgh444EmJU:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/pvGVYfU7w5Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/368/update-asp-net-datagrid-textbox-value-from-popup-window/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/368/update-asp-net-datagrid-textbox-value-from-popup-window/</feedburner:origLink></item>
		<item>
		<title>Set Up DBGP PHP Debugging for NotePadd++</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/XKt2lbUe1Uc/</link>
		<comments>http://www.charlesbryant.com/index.php/359/set-up-dbgp-php-debugging-for-notepadd/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 23:09:45 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[Debugging]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[debugging]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=359</guid>
		<description><![CDATA[I have ventured into the wonderful world of enterprise PHP development at work. This is a big change from ASP.net and a lot of work to get up to speed. I thought I&#8217;d share my adventure in setting up debugging for a tool in my dev environment, NotePad++. An added plus after running through this [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.charlesbryant.com/wp-content/uploads/2011/01/images.jpg"><img class="alignleft size-thumbnail wp-image-364" title="notepad" src="http://www.charlesbryant.com/wp-content/uploads/2011/01/images-150x150.jpg" alt="" width="150" height="150" /></a>I have ventured into the wonderful world of enterprise PHP development at work. This is a big change from ASP.net and a lot of work to get up to speed. I thought I&#8217;d share my adventure in setting up debugging for a tool in my dev environment, <a href="http://notepad-plus-plus.org/" target="_blank">NotePad++</a>. An added plus after running through this exercise was that debugging was also working in <a href="http://netbeans.org/" target="_blank">Netbeans</a>.<span id="more-359"></span></p>
<p>If you already have xdebug installed and configured on your server, you can probably skip to step 7. If you installed an IDE that uses Zend, like Aptana, that already has an xdebug pluggin, you may already have xdebug installed and configured on your server. If you are unsure you can search you php.ini file for zend_extension and see if you have settings similar to step 4.</p>
<p>1.       Get a copy of your phpInfo(). Create a new php page and enter:</p>
<p>&lt;?php</p>
<p style="padding-left: 30px;">phpinfo();</p>
<p>?&gt;<br />
View the page in the browser and copy everything on this page so you can paste in next step.</p>
<p>2.       Go to <a href="http://www.xdebug.org/find-binary.php" target="_blank">http://www.xdebug.org/find-binary.php</a></p>
<p>3.       Paste the text you copied from step 1.</p>
<p>4.       Click the button and follow the directions to install xdebugg. Add the following config key ([xdebug]) and settings to your php.ini file (mine is here, C:/www/xampp/php/php.ini, but yours may be somewhere else), updating the path to match your machine (create tmp/xdebug/ folder if you don’t have one):</p>
<p style="padding-left: 30px;">[xdebug]</p>
<p style="padding-left: 30px;">zend_extension=&#8221;C:/www/xampp/php/ext/php_xdebug.dll&#8221;</p>
<p style="padding-left: 30px;">xdebug.profiler_output_dir = &#8220;C:/www/xampp/tmp/xdebug&#8221;</p>
<p style="padding-left: 30px;">xdebug.remote_log=&#8221;C:/www/xampp/tmp/xdebug/xdebug_remot.log&#8221;</p>
<p style="padding-left: 30px;">xdebug.profiler_output_name = &#8220;cachegrind.out.%p&#8221;</p>
<p style="padding-left: 30px;">xdebug.profiler_enable = 0</p>
<p style="padding-left: 30px;">xdebug.profiler_append=0</p>
<p style="padding-left: 30px;">xdebug.extended_info=1</p>
<p style="padding-left: 30px;">xdebug.remote_enable=1</p>
<p style="padding-left: 30px;">xdebug.remote_handler=dbgp</p>
<p style="padding-left: 30px;">xdebug.remote_mode=req</p>
<p style="padding-left: 30px;">xdebug.remote_host=127.0.0.1</p>
<p style="padding-left: 30px;">xdebug.remote_port=9000</p>
<p style="padding-left: 30px;">xdebug.idekey=xdebug</p>
<p style="padding-left: 30px;">xdebug.show_exception_trace=0</p>
<p style="padding-left: 30px;">xdebug.show_local_vars=9</p>
<p style="padding-left: 30px;">xdebug.show_mem_delta=0</p>
<p style="padding-left: 30px;">xdebug.trace_format=0</p>
<p>5.       Restart PHP.</p>
<p>6.       Download the DBGP plugin: <a href="http://sourceforge.net/projects/npp-plugins/files/DBGP%20Plugin/" target="_blank">http://sourceforge.net/projects/npp-plugins/files/DBGP%20Plugin/</a></p>
<p>7.       Unzip and move dbgpPlugin.dll to your Notepad++ plugins folder (C:\Program Files\Notepad++\plugins).</p>
<p>8.       Restart Notepad++ and you should see DBGP in your plugins menu.</p>
<p>9.       In you menu click Plugins &gt; DBGP &gt; Config… and check “Bypass all mapping (local window setup). If you need remote debugging you can configure that, but I didn’t do that yet so I won’t act like I did.</p>
<p>10.   From here you can add your break points by clicking on a line and hitting the red circle in the debug window. To start debugging just add “?XDEBUG_SESSION_START=name” with name being anything you like. Now the Notepadd++ debug window should have activated and you can step through the code. If not, something is wrong and you may have to Google better or more recent instructions.</p>
<p>If you use Firefox, there is a xdebug Firefox Extension, <a href="https://addons.mozilla.org/en-US/firefox/tag/xdebug" target="_blank">https://addons.mozilla.org/en-US/firefox/tag/xdebug</a>. When my debugger is started I don’t have to use the query string to start debugging in the browser, just open the page and it starts. I haven’t tested these, but there are other browser helpers too:</p>
<ul>
<li>Chrome: <a href="https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc" target="_blank">https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc</a>.</li>
<li>Safari: <a href="https://github.com/benmatselby/xdebug-toggler" target="_blank">https://github.com/benmatselby/xdebug-toggler</a></li>
<li>Opera: <a href="https://addons.opera.com/addons/extensions/details/xdebug-launcher/?display=en" target="_blank">https://addons.opera.com/addons/extensions/details/xdebug-launcher/?display=en</a></li>
</ul>
<p>The configuration in step 5 will also works with debugging in <a href="http://netbeans.org/" target="_blank">NetBeans</a> if you use that IDE. I didn’t test with anything else.</p>
<p><strong>More info:</strong></p>
<p>Xdebug Docs: <a href="http://www.xdebug.org/docs/" target="_blank">http://www.xdebug.org/docs/</a></p>
<p>DBGP Support Forum: <a href="http://sourceforge.net/projects/npp-plugins/forums/forum/709026" target="_blank">http://sourceforge.net/projects/npp-plugins/forums/forum/709026</a></p>
<div class="shr-publisher-359"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=XKt2lbUe1Uc:SUiuhcYTquo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=XKt2lbUe1Uc:SUiuhcYTquo:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=XKt2lbUe1Uc:SUiuhcYTquo:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/XKt2lbUe1Uc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/359/set-up-dbgp-php-debugging-for-notepadd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/359/set-up-dbgp-php-debugging-for-notepadd/</feedburner:origLink></item>
		<item>
		<title>QuickFix: Missing ASP.net Embedded Resource</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/npsu1MiXwYE/</link>
		<comments>http://www.charlesbryant.com/index.php/350/quickfix_missing_asp-net_embedded_resource/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 01:23:25 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[ASP.net]]></category>
		<category><![CDATA[QuickFix]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=350</guid>
		<description><![CDATA[Problem: Missing ASP.net embedded resource on remote server, but not on local dev server. Background: We embed a JavaScript file as a resource in a DLL. This JavaScript file is exposed by webresource.axd. Issue: We found that the problem was related to a mismatch in the build date of the DLL and the time on [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><strong><a href="http://www.charlesbryant.com/wp-content/uploads/2009/09/code.jpg"><img class="alignleft size-full wp-image-92" title="code" src="http://www.charlesbryant.com/wp-content/uploads/2009/09/code.jpg" alt="" width="150" height="150" /></a>Problem:</strong></p>
<p>Missing ASP.net embedded resource on remote server, but not on local dev server.</p>
<p><strong>Background: </strong></p>
<p>We <a href="http://support.microsoft.com/kb/910445">embed a JavaScript file as a resource in a DLL</a>. This JavaScript file is exposed by webresource.axd.</p>
<p><strong>Issue:</strong></p>
<p>We found that the problem was related to a mismatch in the build date of the DLL and the time on the server. The build date is in the future compared to the server system date.<span id="more-350"></span></p>
<p><strong>Error Details:</strong></p>
<p><em><strong>Description: </strong>An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.</em></p>
<p><em><strong>Exception Details: </strong></em> <em>System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.<br />
Parameter name: utcDate</em></p>
<p><em><strong>Source Error:</strong></em><br />
<em>An   unhandled exception was generated during the execution of the current web request.   Information regarding the origin and location of the exception can be   identified using the exception stack trace below.</em></p>
<p><em><br />
<strong>Stack Trace:</strong></em></p>
<p><em>[ArgumentOutOfRangeException:   Specified argument was out of the range of valid values.<br />
Parameter name: utcDate]<br />
System.Web.HttpCachePolicy.UtcSetLastModified(DateTime utcDate)   +3261043<br />
System.Web.HttpCachePolicy.SetLastModified(DateTime date) +47<br />
System.Web.Handlers.ScriptResourceHandler.PrepareResponseCache<br />
(HttpResponse   response, Assembly assembly) +194<br />
System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context)   +1154<br />
System.Web.Handlers.ScriptResourceHandler.System.Web.IHttpHandler<br />
.ProcessRequest(HttpContext   context) +4<br />
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication<br />
.IExecutionStep.Execute()   +154<br />
System.Web.HttpApplication.ExecuteStep(IExecutionStep step,   Boolean&amp;<br />
completedSynchronously) +64</em></p>
<hr size="2" /><em><strong>Version Information:</strong> Microsoft .NET Framework Version:2.0.50727.42; ASP.NET Version:2.0.50727.213</em></p>
<p><strong>Resolution:</strong></p>
<p>Update the server date to a date before the build date or change your build date to a date after the server date.</p>
<div class="shr-publisher-350"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=npsu1MiXwYE:2fnPPdnhBYM:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=npsu1MiXwYE:2fnPPdnhBYM:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=npsu1MiXwYE:2fnPPdnhBYM:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/npsu1MiXwYE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/350/quickfix_missing_asp-net_embedded_resource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/350/quickfix_missing_asp-net_embedded_resource/</feedburner:origLink></item>
		<item>
		<title>Yo! Check My Reflow</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/v25B5ZQNYcM/</link>
		<comments>http://www.charlesbryant.com/index.php/342/yo-check-my-reflow/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 12:00:47 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[Performance Optimization]]></category>
		<category><![CDATA[UI]]></category>
		<category><![CDATA[browser reflow]]></category>
		<category><![CDATA[reflow]]></category>
		<category><![CDATA[repaint]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=342</guid>
		<description><![CDATA[I remember when I first started getting into website performance optimization, the more I dug into it, the less I seemed to know. I remember hearing of browser repaint and not knowing what reflow is, and not realizing how important either of them really are in performance optimization. I definitely didn’t have many strategies in [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="alignleft size-thumbnail wp-image-345" title="reflow" src="http://www.charlesbryant.com/wp-content/uploads/2010/07/reflow-150x150.jpg" alt="" width="150" height="150" />I remember when I first started getting into website performance optimization, the more I dug into it, the less I seemed to know. I remember hearing of browser repaint and not knowing what reflow is, and not realizing how important either of them really are in performance optimization. I definitely didn’t have many strategies in my toolbox to address issues with reflow. So, after reading a quick overview of reflow on Google Code, I decided to get up to speed on the subject.</p>
<p>I’m not going to go into a deep explanation, because the links below provide more than enough info to get you well versed on reflow. Basically, reflow is how a browser calculates the positioning or layout of elements. This may not be the best definition. So here is <a href="http://www.youtube.com/watch?v=ZTnIxIA5KGw&amp;NR=1" target="_blank">video</a> of the process for those of you who are more visual.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/ZTnIxIA5KGw&amp;hl=en_US&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/ZTnIxIA5KGw&amp;hl=en_US&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object><span id="more-342"></span></p>
<p>As you can see there is a lot going on to get your elements positioned  on the page. Minimizing reflow is very important in improving the  performance of your web page.</p>
<p>Here are some common rules you can follow to reduce the effects of reflow. I found that these rules were common across a few of the resources I checked on reflow.</p>
<ol>
<li>Minimize the depth of your DOM tree.</li>
<li>Minimize CSS rules, remove unused CSS rules, just allow rules to cascade (don’t repeat font-size: 1em if this is already defined in a parent selector).</li>
<li>Animate elements in a fixed or absolute position. (recalculating the position of an animation is bad)</li>
<li>Simplify CSS selectors as much as possible and reduce use of descendant selectors.</li>
<li>Avoid or minimize inline styles and define as much as possible in external CSS.</li>
<li>Avoid tables for layout and if you have to use them use fixed width.</li>
</ol>
<p>Now I need to go start testing the effectiveness of some of these optimizations on sites I manage. I hope it helps you speed things up.</p>
<p>Resources:</p>
<ul>
<li><a href="http://www.mozilla.org/newlayout/doc/reflow.html">http://www.mozilla.org/newlayout/doc/reflow.html</a></li>
<li><a href="http://dev.opera.com/articles/view/efficient-javascript/?page=3#reflow">http://dev.opera.com/articles/view/efficient-javascript/?page=3#reflow</a></li>
<li><a href="http://www.stubbornella.org/content/2009/03/27/reflows-repaints-css-performance-making-your-javascript-slow/">http://www.stubbornella.org/content/2009/03/27/reflows-repaints-css-performance-making-your-javascript-slow/</a></li>
<li><a href="http://code.google.com/speed/articles/reflow.html">http://code.google.com/speed/articles/reflow.html</a></li>
<li><a href="http://redivide.com/blog/gecko-reflow-awesome-visualization-of-web-page-layout/">http://redivide.com/blog/gecko-reflow-awesome-visualization-of-web-page-layout/</a></li>
<li><a href="https://wiki.mozilla.org/Gecko:Table_reflow_optimization">https://wiki.mozilla.org/Gecko:Table_reflow_optimization</a></li>
<li><a href="https://wiki.mozilla.org/Gecko:Reflow_Refactoring">https://wiki.mozilla.org/Gecko:Reflow_Refactoring</a></li>
</ul>
<div class="shr-publisher-342"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=v25B5ZQNYcM:NYyOVHKkZNI:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=v25B5ZQNYcM:NYyOVHKkZNI:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=v25B5ZQNYcM:NYyOVHKkZNI:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/v25B5ZQNYcM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/342/yo-check-my-reflow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/342/yo-check-my-reflow/</feedburner:origLink></item>
		<item>
		<title>It’s More Than Where You Load JavaScript, but How</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/WISnqo-WvEI/</link>
		<comments>http://www.charlesbryant.com/index.php/340/its-more-than-where-you-load-javascript-but-how/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 12:00:24 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Performance Optimization]]></category>
		<category><![CDATA[asynchchronus javascript loading]]></category>
		<category><![CDATA[Visual Round Trip Analyzer]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=340</guid>
		<description><![CDATA[Well I know that JavaScript blocks anything else from downloading on the page. My strategy to lessen this effect has been to move JavaScript to the bottom of the page. After reading 12 Steps to Faster Web Pages with Visual Round Trip Analyzer, I have to question this strategy. It describes a technique for using [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p>Well I know that JavaScript blocks anything else from downloading on the page. My strategy to lessen this effect has been to move JavaScript to the bottom of the page. After reading <a href="http://msdn.microsoft.com/en-us/magazine/dd188562.aspx" target="_blank">12 Steps to Faster Web Pages with Visual Round Trip Analyzer</a>, I have to question this strategy. It describes a technique for using JavaScript to write the external script tags.</p>
<pre class="brush: xhtml;">function AsyncLoad()
{
    var l = arguments.length;

    for (var i=0;i&lt;l;i++)
    {
        document.write("&lt;script src='" + arguments[i] + "'&gt;&lt;/" + "script&gt;");
    }
}

AsyncLoad("file1.js", "file2.js", "file3.js");
</pre>
<p>The article states that although moving external scripts to the bottom reduces their blocking effect, it doesn’t take advantage of the bandwidth available to get everything downloaded as soon as possible. So, loading files with a document.write allows them to be loaded outside of the JavaScript engine, hence no blocking by JavaScript. How is this so?</p>
<p>Well let’s take a trip deep into geek land and check into how browsers actually interact with external scripts. Reading through this Mozilla bug report (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=364315">https://bugzilla.mozilla.org/show_bug.cgi?id=364315</a>) and a few other sites, when the browser encounters a script tag that references an external script it will download the script. It will not allow parallel downloading of other assets until the script is done downloading and parsing. Don’t take this as gospel, because I haven’t looked at browser source code or anything. I am just interpreting what I have read from multiple sources. This bug report also suggest that the browser vendors are already attacking the blocking behavior so the technique I am describing here won’t be needed in newer browsers.</p>
<p>So, although async JavaScript loading doesn’t address the problem of HTTP requests, but it prevents those pesky JavaScript blockers from causing a traffic jam, allows other elements to download in parallel, and efficiently uses bandwidth.</p>
<p>Well I’m off to do some testing. If you haven’t played around with Visual Round Trip Analyzer, I will be blogging about it soon (if I have the time).</p>
<p>I hope you found this useful.</p>
<div class="shr-publisher-340"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=WISnqo-WvEI:scjFbpdB_fs:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=WISnqo-WvEI:scjFbpdB_fs:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=WISnqo-WvEI:scjFbpdB_fs:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/WISnqo-WvEI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/340/its-more-than-where-you-load-javascript-but-how/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/340/its-more-than-where-you-load-javascript-but-how/</feedburner:origLink></item>
		<item>
		<title>RTT Says the Client is not Alway Right</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/P4Yn2RJ49X8/</link>
		<comments>http://www.charlesbryant.com/index.php/334/rtt-says-the-client-is-not-alway-right/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 02:11:26 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[Lost In Space]]></category>
		<category><![CDATA[Performance Optimization]]></category>
		<category><![CDATA[round trip time]]></category>
		<category><![CDATA[rtt]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=334</guid>
		<description><![CDATA[I have a team member experimenting with base64 encoding of images to reduce HTTP requests (that&#8217;s a mouthful). I&#8217;m not going to try to explain what this involves, but it isn&#8217;t as complex as it first sounds. You can get more info on base64 encoding on this blog post by James McCaffrey. One of the [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="alignleft size-thumbnail wp-image-335" title="airport-delay" src="http://www.charlesbryant.com/wp-content/uploads/2010/06/airport-delay-150x150.jpg" alt="" width="150" height="150" />I have a team member experimenting with base64 encoding of images to reduce HTTP requests (that&#8217;s a mouthful). I&#8217;m not going to try to explain what this involves, but it isn&#8217;t as complex as it first sounds. You can get more info on base64 encoding on this <a href="http://dotnet.sys-con.com/node/192527" target="_blank">blog post</a> by James McCaffrey. One of the side effects of this technique is it increases file size. So, the question is, what’s better for the performance of your web pages, a few large files or many small ones? Since HTTP requests are costly and bandwidth is plentiful, I’ll take a few large files for $500 Alex.</p>
<p>Did you know it’s faster to download a few large files than it is to download multiple small files of the same cumulative size as the large files? How is that so? It’s because of our nemesis <a href="http://en.wikipedia.org/wiki/Round-trip_delay_time" target="_blank">Round Trip Time</a> or RTT for short. RTT is the measure of the time it takes for a TCP packages to be sent to a server in a client request and sent back to the client in a server response. If you look at Yahoo&#8217;s <a href="http://developer.yahoo.com/performance/rules.html" target="_blank">Best Practices for Speeding Up Your Website</a>, many of the rules address reducing RTT.</p>
<p>The main problem with RTT is that there is a delay caused by network latency. The latency is compounded when a DNS lookup has to be performed. When every you can reduce DNS lookups you reduce RTT delay. So, requesting one file instead of many is a great strategy. Whether you base64 encode images into your CSS file, combine images to sprites, use caching to prevent unchanged assets from being requested, reduce the number of domain names requested, or you combine your JavaScript files to one file, anything you do to reduce RTT will improve the performance of your web pages.</p>
<p>There are still a lot of people out there that believe the way to improve performance is to first improve issues on the back end, optimize servers and server side code. Don&#8217;t be fooled, about 80% of the time used to download a page is affected client side in the browser. You can look at this easy to understand <a href="http://www.yuiblog.com/blog/2006/11/28/performance-research-part-1/" target="_blank">research</a> from Yahoo&#8217;s UI team. Next time you look at a waterfall performance report, remember that if the little bar that represents the initial request and response from your server is small in comparison to the rest of the assets downloaded, forget about throwing servers and backend code optimization at your performance problem. Look at client side optimization and maybe even base64 encoding.</p>
<p>In website performance the client is probably not right. Fix the client and your site will not suffer from the effects of RTT delay.</p>
<div class="shr-publisher-334"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=P4Yn2RJ49X8:IaURSuusQII:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=P4Yn2RJ49X8:IaURSuusQII:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=P4Yn2RJ49X8:IaURSuusQII:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/P4Yn2RJ49X8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/334/rtt-says-the-client-is-not-alway-right/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/334/rtt-says-the-client-is-not-alway-right/</feedburner:origLink></item>
		<item>
		<title>I Feel the Need for Website Speed</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/ek2t6B6AfAQ/</link>
		<comments>http://www.charlesbryant.com/index.php/331/i-feel-the-need-for-website-speed/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 12:00:42 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[Performance Optimization]]></category>
		<category><![CDATA[Page Speed]]></category>
		<category><![CDATA[website performance optimization]]></category>
		<category><![CDATA[YSlow]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=331</guid>
		<description><![CDATA[We are working on a performance project at work. One of the marketing guys wrote a blog post for our customers that talked about improving website performance. There is a lot of talk about performance going on at the company. One of the drivers of this talk is the desire to satisfy visitors with a [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><img class="alignleft size-thumbnail wp-image-332" title="top-fuel-news1" src="http://www.charlesbryant.com/wp-content/uploads/2010/06/top-fuel-news1-150x150.jpg" alt="" width="150" height="150" />We are working on a performance project at work. One of the marketing guys wrote a blog post for our customers that talked about improving website performance. There is a lot of talk about performance going on at the company. One of the drivers of this talk is the desire to satisfy visitors with a fast responsive website. Another reason to jump on the performance bandwagon is <a href="http://code.google.com/speed/" target="_blank">Google’s commitment to a faster internet</a> and backing up the philosophy with a change to the page rank algorithm to add page speed as a factor in where your site sits in search results. Lastly, we just want to be competitive. Beating the performance of the competition is just another notch on the belt and another battle won in the fight for market share. So, to keep visitors happy, maintain top 10 in the Google SERP (search engine result page), and to stay competitive, our site has to be fast.<span id="more-331"></span></p>
<p>If you call yourself a professional web developer and haven’t heard of YSlow, I’d have to put your title to the test. Well the author of YSlow, Steve Souder, is my web performance hero. He has done many talks, wrote books, blogged, and basically evangelized the importance of frontend or client side performance. I just watched a <a href="http://www.youtube.com/watch?v=BTHvs3V8DBA&amp;feature=player_embedded" target="_blank">video</a> of Steve at a Google Tech Talk where he reviewed the guidance you get from YSlow. YSlow is a tool that helps you identify areas to improve the performance of your website. In fact, Steve wrote a book, <a href="http://www.amazon.com/High-Performance-Web-Sites-Essential/dp/0596529309/ref=pd_sim_b_6" target="_blank">High Performance Websites</a>, that provides details of the guidance given by this tool. The guidance started with 14 rules on Yahoo, but has since been expounded upon by his new book, <a href="http://www.amazon.com/Even-Faster-Web-Sites-Performance/dp/0596522304/ref=pd_sim_b_1" target="_blank">Even Faster Websites</a>. The original 14 rules are:</p>
<p>1.	Make fewer HTTP requests<br />
2.	Use a CDN<br />
3.	Add an expires header<br />
4.	GZip components<br />
5.	Put stylesheets at the top<br />
6.	Put scripts at the bottom<br />
7.	Avoid CSS expressions<br />
8.	Make JS and CSS external<br />
9.	Reduce DNS lookups<br />
10.	Minify JS<br />
11.	Avoid redirects<br />
12.	Remove duplicate scripts<br />
13.	Configure ETags<br />
14.	Make AJAX cacheable</p>
<p>Steve has since moved from Yahoo to Google and it would be expected that Google now has a performance guidance tool too, <a href="http://code.google.com/speed/page-speed/" target="_blank">Page Speed</a>. Not sure if Steve had anything to do with this, but it makes sense if he did. Along with guidance for improving performance Page Speed also has a tool to measure website performance. Both tools are available as a Firebug and Chrome plugin.</p>
<p>Here are some other tools and you can check my <a href="http://www.charlesbryant.com/index.php/category/web-development/performance-optimization/">other posts</a> for more:</p>
<ul>
<li><a href="http://gtmetrix.com/" target="_blank">gtmetrix.com</a> &#8211; GTmetrix uses Google Page Speed and Yahoo! YSlow to grade your site&#8217;s         performance and provides actionable         recommendations to fix these issues. This tool also allows you to compare you site against other pages (maybe your competitors).</li>
<li><a href="http://www.webpagetest.org" target="_blank">www.webpagetest.org</a> &#8211; Pagetest allows you to provide the URL of a webpage to be tested. The test will be conducted from the geographic location you specify and you will be  provided a waterfall of your page load performance  as well as a comparison against an optimization checklist. One cool thing about this tool is the video that it produces of your web page load. You can actually produce a video comparing your page to other pages.</li>
<li><a href="http://www.websiteoptimization.com/services/analyze/" target="_blank">websiteoptimization.com</a> &#8211; Enter a URL below to calculate page size, composition, and download  time. The script calculates the size of individual elements and sums up  each type of web page component. Based on these page characteristics the  script then offers advice on how to improve page load time.</li>
</ul>
<p>So, if you develop or manage a website, make sure you jump on the performance bandwagon, get familiar with the tools that can help you improve performance, and checkout some of the people defining website performance optimization. Improving performance can take a little time, but it is probably one of the cheapest and effective improvements you can make to your website.</p>
<div class="shr-publisher-331"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=ek2t6B6AfAQ:7tzk49-vEu8:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=ek2t6B6AfAQ:7tzk49-vEu8:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=ek2t6B6AfAQ:7tzk49-vEu8:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/ek2t6B6AfAQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/331/i-feel-the-need-for-website-speed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/331/i-feel-the-need-for-website-speed/</feedburner:origLink></item>
		<item>
		<title>Standars Based Website Design Coming to a Browser Near You</title>
		<link>http://feedproxy.google.com/~r/charleslbryant/~3/tECcLYldnCk/</link>
		<comments>http://www.charlesbryant.com/index.php/325/standars-based-website-design-coming-to-a-browser-near-you-2/#comments</comments>
		<pubDate>Sun, 27 Jun 2010 12:00:13 +0000</pubDate>
		<dc:creator>charleslbryant</dc:creator>
				<category><![CDATA[Bits and Bytes]]></category>
		<category><![CDATA[graphic design]]></category>
		<category><![CDATA[web design]]></category>

		<guid isPermaLink="false">http://www.charlesbryant.com/?p=325</guid>
		<description><![CDATA[I have been building websites for over 10 years now. It&#8217;s usually the same drill each time. Use a graphics editing program to design the site and cut and optimize the images. Use an HTML editor to script the site. View, test, and debug in a browser. Normally, I go back and forth between these [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><p><a href="http://www.charlesbryant.com/wp-content/uploads/2010/06/browser-logos.jpg"><img class="alignleft size-thumbnail wp-image-326" title="browser-logos" src="http://www.charlesbryant.com/wp-content/uploads/2010/06/browser-logos-150x150.jpg" alt="" width="150" height="150" /></a>I have been building websites for over 10 years now. It&#8217;s usually the same drill each time. Use a graphics editing program to design the site and cut and optimize the images. Use an HTML editor to script the site. View, test, and debug in a browser. Normally, I go back and forth between these apps until I achieve the desired results in the browser. Well it looks like all of this will all be done inside the browser soon. Being able to design and edit in the platform I&#8217;m targeting is huge to me. So, I am very excited by all of the innovation in this space.<span id="more-325"></span></p>
<p>I have been following online, in browser, graphic editing programs for a while. Aviary provides <a href="http://aviary.com/tools/image-editor" target="_blank">Phoenix</a>, one of my favorites. I haven&#8217;t had a chance to work with most of them, but here are a few on my list to review:</p>
<ul>
<li><a href="http://www.pixlr.com/" target="_blank">pixlr.com</a></li>
<li><a href="http://www.picnik.com/" target="_blank">picnik.com</a></li>
<li><a href="http://www.splashup.com/" target="_blank">splashup.com</a></li>
</ul>
<p>There are more, free and paid, but for the most part these are photo editors and not specifically suited to web design. The point is, if this is where photo editing is headed, a tool robust enough for website design is sure to follow. Splashup.com feels an awful like Photoshop, my favorite web design tool which is a traditional photo editor. None the less, these tools can be used to create web graphics or even a full website design.</p>
<p>So, we can create our website graphics in browser what about image optimization. If you want to use graphics on your site they have to be optimized to make your pages load faster. I use to use Photoshop exclusively to optimize my images, but have already moved this part of my process in the browser. My favorite tool hands down is <a href="http://developer.yahoo.com/yslow/smushit/" target="_blank">Smush.it,</a> a part of Yahoo&#8217;s <a href="http://developer.yahoo.com/yslow/" target="_blank">YSlow</a> <a href="http://getfirebug.com/" target="_blank">Firebug</a> plugin. Even when I optimize images in Photoshop I will run them through Smush.it to make sure I squeezed out every ounce of performance goodness. There are others and like the graphic editors I haven&#8217;t used most of them:</p>
<ul>
<li><a href="http://tools.dynamicdrive.com/imageoptimizer/" target="_blank">dynamicdrive</a></li>
<li><a href="http://www.imageoptimizer.net/Pages/Home.aspx" target="_blank">imageoptimizer.net</a></li>
<li><a href="http://www.netmechanic.com/GIFBot/optimize-graphic.htm" target="_blank">GIFBot</a></li>
</ul>
<p>Well we have created our graphics in the browser, optimized images in the browser, what about scripting the web pages. HTML editing in the browser has been common since Rich text WYSIWYG editors came in vogue. Also, developer tools like Firebug have allowed us to make small changes to HTML and CSS and see the results of the edits right in the browser, but you can&#8217;t save the edits and you have to transpose the edits to your HTML editor to save the updated page. What I have been missing is a tool that would allow me to build a page from scratch and save the results all inside a browser interface. Well, now there&#8217;s <a href="http://buildorpro.com" target="_blank">Builder Pro</a> and<a href="http://snappages.com" target="_blank"> Snap Pages</a> both vying for my web design affection. I haven&#8217;t had a chance to actually use either of these tools. They have just peeked my interest and prompted me to write this post.</p>
<p>Both of these tools have great videos providing an intro into the capabilities of the tools, but Snap Pages may be more suited to consumer use than professional web design, but the jury is still out on that. Either way, Snap Pages looks great and produces some stunning sites, but I haven&#8217;t checkout out the source code it produces yet.</p>
<p>Builder Pro is more in line with what my idea of an in browser editor would be. When I watched the video of this tool redesigning twitter.com&#8217;s home page, my jaw dropped. Having used Firebug to do similar things on my sites, seeing a tool dedicated to making this easy just floored me. If you knew me, you would know that I don&#8217;t get excited about many things on the internet, but this one has me excited. I can&#8217;t wait to try it. If this works like I hope it will, it will save me time and make my sites better at the same time.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="265" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=12115679&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="265" src="http://vimeo.com/moogaloop.swf?clip_id=12115679&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a href="http://vimeo.com/12115679">BuildorPro in action</a> from <a href="http://vimeo.com/buildor">James Law</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>If I can edit in the browser and instantly see the results of my edits in Firefox, IE, Chrome, Opera, Safari or my mobile phone, that is a major improvement in my process. Can you imagine getting a call to make an emergency edit to a web page, pulling out your smart phone, make the edit in the browser, test, and publish? All from your phone. Work on any computer or device with a compatible browser and internet connection. I don&#8217;t have to buy multiple high price licenses for each software package I use for all of the computers I may want to design on. The browser has the ability to free use of our dependence on the old ball and chain OS. No more installation, no more incompatibility issues, no more worrying about getting a new computer ready to design websites. Granted we inherit new and unexplored problems with browser based software, but the vision of the freedom to be gained makes it look like the grass is greener on the other side.</p>
<p>I can definitely see myself designing a static website totally in the browser. Now only if graphic design, image optimization, HTML editing can all be integrated into one tool. Then on top of that throw in some server side and database development, project management, time tracking and invoicing, audio/video editing, and strategy development and that would be a tool that would allow me to throw away all of these expensive programs. Well that won&#8217;t happen anytime soon, but its good to see that it may be a reality in my lifetime.</p>
<div class="shr-publisher-325"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><!-- End Shareaholic LikeButtonSetBottom Automatic --><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=tECcLYldnCk:6DSqzXqoWlQ:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/charleslbryant?i=tECcLYldnCk:6DSqzXqoWlQ:V_sGLiPBpWU" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=TzevzKxY174" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/charleslbryant?a=tECcLYldnCk:6DSqzXqoWlQ:l6gmwiTKsz0"><img src="http://feeds.feedburner.com/~ff/charleslbryant?d=l6gmwiTKsz0" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/charleslbryant/~4/tECcLYldnCk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.charlesbryant.com/index.php/325/standars-based-website-design-coming-to-a-browser-near-you-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.charlesbryant.com/index.php/325/standars-based-website-design-coming-to-a-browser-near-you-2/</feedburner:origLink></item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: basic (Requested URI is rejected)

Served from: www.charlesbryant.com @ 2012-05-18 20:49:18 -->

