<?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>JeffreyBarke.net</title>
	
	<link>http://jeffreybarke.net</link>
	<description>A web development blog that covers HTML, CSS, JS, PHP, WordPress and CodeIgniter.</description>
	<lastBuildDate>Mon, 20 Feb 2012 23:24:26 +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/jeffreybarkenet" /><feedburner:info uri="jeffreybarkenet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Cisco AnyConnect VPN Client reverts hosts file</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/fWTnwD-Ghks/</link>
		<comments>http://jeffreybarke.net/2012/02/anyconnect-reverts-hosts-file/#comments</comments>
		<pubDate>Mon, 20 Feb 2012 16:08:53 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[anyconnect]]></category>
		<category><![CDATA[hosts-file]]></category>
		<category><![CDATA[vpn]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=126</guid>
		<description><![CDATA[The Cisco AnyConnect VPN client reverts the hosts file to a previous state. To persist changes to the hosts file, you&#8217;ll need to update both hosts and hosts.ac. <a href="http://jeffreybarke.net/2012/02/anyconnect-reverts-hosts-file/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>While working on localhost yesterday, I noticed that changes I&#8217;d make to the hosts file kept getting reverted. The hosts file wasn&#8217;t getting completely reset, only the most recent changes I&#8217;d made were lost. I&#8217;ve never had this problem before, so I thought, &#8220;What am I doing different today?&#8221; The only thing I could think of: using Cisco&#8217;s AnyConnect <abbr title="Virtual private network">VPN</abbr> client to connect to my work computer.</p>
<p>After it happened again this morning, I did a quick Google search for &#8220;cisco anyconnect resets hosts files.&#8221; Turns out AnyConnect <em>is</em> the problem. To solve it, you need to edit both hosts and hosts.ac. I agree with <a href="http://ubuntuforums.org/showthread.php?t=1896148#post11560249" rel="external">ANewBite</a>: &#8220;Why <abbr title="AnyConnect">AC</abbr> generates another hosts file is either beyond my comprehension or really stupid.&#8221;</p>
<h2>References</h2>
<ul>
<li>/etc/hosts getting reset in Lion. Super User. <a href="http://superuser.com/questions/354902/etc-hosts-getting-reset-in-lion" rel="external">http://superuser.com/questions/354902/etc-hosts-getting-reset-in-lion</a>. Retrieved 20 February 2012.</li>
<li>[SOLVED] hosts file keeps getting reset/rewritten, hosts.ac the culprit. Ubuntu Forums. <a href="http://ubuntuforums.org/showthread.php?t=1896148" rel="external">http://ubuntuforums.org/showthread.php?t=1896148</a>. Retrieved 20 February 2012.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/fWTnwD-Ghks" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2012/02/anyconnect-reverts-hosts-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2012/02/anyconnect-reverts-hosts-file/</feedburner:origLink></item>
		<item>
		<title>Local development environment</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/Om6aSkvyWJg/</link>
		<comments>http://jeffreybarke.net/2011/08/local-development-environment/#comments</comments>
		<pubDate>Tue, 23 Aug 2011 03:36:34 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[tabula-rasa]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=70</guid>
		<description><![CDATA[An overview of my local development environment, which is basically a MacBook Pro running <abbr title="Macintosh, Apache, Mysql and PHP">MAMP</abbr>. My text editor of choice is TextMate, and I use Transmit as an FTP client. My primary development browser is Firefox, and this post includes a list of all extensions I have installed. Subversion is the <abbr title="version control system">VCS</abbr> I use for all of my sites. <a href="http://jeffreybarke.net/2011/08/local-development-environment/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p class="postUpdateDate"><i>This post was last updated on 22 August 2011.</i></p>
<p class="thumbWrap"><img src="http://jeffreybarke.net/wp-content/uploads/2011/08/local-environment-150x150.jpg" alt="" width="150" height="150" class="alignleft size-thumbnail wp-image-92"></p>
<p>Related to my recent &#8220;<a href="http://jeffreybarke.net/2011/08/tabula-rasa/">restart</a>,&#8221; I want to talk a little bit about my local development environment. I apologize; this is kind of a long, boring post that is basically &#8220;listy.&#8221; However, I both wanted to document the things that I have, don&#8217;t have and do and share them with other developers. I&#8217;m also very interested in hearing about other developers&#8217; local environments.</p>
<p>My new computer is a 15-inch MacBook Pro running Snow Leopard (10.6.8) with a 2 <abbr title="gigahertz">GHz</abbr> processor and 4 <abbr title="gigabyte">GB</abbr> of <abbr title="random-access memory">RAM</abbr>.</p>
<p>The core of my local development environment is <a href="http://www.mamp.info/" rel="external"><abbr title="Macintosh, Apache, MySQL and PHP">MAMP</abbr></a> (2.0.1), which includes:</p>
<ul>
<li>Apache 2.0.63</li>
<li>MySQL 5.1.44</li>
<li>PHP 5.2.13 &amp; 5.3.2</li>
<li>APC 3.1.3</li>
<li>eAccelerator 0.9.6</li>
<li>XCache 1.2.2 &amp; 1.3.0</li>
<li>phpMyAdmin 3.2.5</li>
<li>Zend Optimizer 3.3.9</li>
<li>SQLiteManager 1.2.4</li>
<li>Freetype 2.3.9</li>
<li>t1lib 5.1.2</li>
<li>curl 7.20.0</li>
<li>jpeg 8</li>
<li>libpng-1.2.42</li>
<li>gd 2.0.34</li>
<li>libxml 2.7.6</li>
<li>libxslt 1.1.26</li>
<li>gettext 0.17</li>
<li>libidn 1.15</li>
<li>iconv 1.13</li>
<li>mcrypt 2.6.8</li>
<li>YAZ 4.0.1 &amp; PHP/YAZ 1.0.14</li>
</ul>
<p>In the next few days, I plan to revisit <a href="http://jeffreybarke.net/tag/mamp/">the previous how-tos I&#8217;ve written on MAMP</a> to see if they&#8217;re still valid.</p>
<p><a href="http://macromates.com/" rel="external">TextMate</a> (1.5.10 (1631)) is my text editor of choice and I use <a href="http://www.panic.com/transmit/" rel="external">Transmit</a> (4.17) as an <abbr title="File Transfer Protocol">FTP</abbr> client.</p>
<p>Subversion is the <abbr title="version control system">VCS</abbr> I use for all of my sites, and it turns out the MacBook Pro (either) comes with (or was installed with the <a href="http://developer.apple.com/technologies/tools/" rel="external">developer tools</a>) Subversion 1.6.26 and Git 1.7.3.4. Since I use both from the command line, I haven&#8217;t installed a <abbr title="graphical user interface">GUI</abbr> for either.</p>
<p>My primary browser for development purposes is still Firefox (I know, I know&#8230; <em>So</em> old-fashioned! :p). I have version 6.0 installed and I use the following extensions:</p>
<ul>
<li><a href="http://www.colorzilla.com/firefox/" rel="external">ColorZilla</a></li>
<li><a href="http://getfirebug.com/" rel="external">Firebug</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/firecookie/" rel="external">Firecookie</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/live-http-headers/" rel="external">Live <abbr title="HyperText Transfer Protocol">HTTP</abbr> headers</a></li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/measureit/" rel="external">MeasureIt</a> (currently incompatible with version 6.0)</li>
<li><a href="https://addons.mozilla.org/en-US/firefox/addon/operator/" rel="external">Operator</a></li>
<li><a href="http://code.google.com/speed/page-speed/" rel="external">Page Speed</a></li>
<li><a href="http://chrispederick.com/work/user-agent-switcher/" rel="external">User Agent Switcher</a></li>
<li><a href="http://chrispederick.com/work/web-developer/" rel="external">Web Developer</a></li>
<li><a href="http://developer.yahoo.com/yslow/" rel="external">YSlow</a></li>
</ul>
<p>For testing/development, I also have Chrome 13.0.782.215, Safari 5.1 and Opera 11.50 installed. All ship with good developer tools, so I haven&#8217;t installed any extensions for any of them.</p>
<p>I have the latest version of the following browser plugins installed:</p>
<ul>
<li>Flash</li>
<li>Java</li>
<li>QuickTime</li>
<li>Silverlight</li>
</ul>
<p>On my previous laptop (also a MacBook Pro), I was running Parallels with four virtual machines installed:</p>
<ul>
<li>Windows XP with Internet Explorer (IE) 6 and various old versions of other browsers.</li>
<li>Windows Vista with IE 7 and various old versions of other browsers.</li>
<li>Windows 7 with IE 9 and various new versions of other browsers.</li>
<li>Ubuntu. Primarily to test Konqueror. (I did a job for the <abbr title="British Broadcasting Corporation">BBC</abbr> and they require it. Srsly!)</li>
</ul>
<p>At the moment, I haz none. <img src='http://jeffreybarke.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>I also don&#8217;t have a graphics editor (or, at least a good one I know about) installed. I&#8217;m debating whether I should install <abbr title="GNU Image Manipulation Program">GIMP</abbr> or just shell out for Photoshop. And there&#8217;s no diagramming software installed either (I used to run Omnigraffle).</p>
<p>As I change my local development environment (or, in the event I forgot anything!), I plan to update this post. If you have any comments about my setup or would like to share your environment (either a long &#8220;post&#8221; in the comments or a link in the comments to a post on your blog), I&#8217;d love to hear them/about it!</p>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/Om6aSkvyWJg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2011/08/local-development-environment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2011/08/local-development-environment/</feedburner:origLink></item>
		<item>
		<title>Tabula rasa</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/TV-JuwcY0Zo/</link>
		<comments>http://jeffreybarke.net/2011/08/tabula-rasa/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 23:05:17 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[tabula-rasa]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=11</guid>
		<description><![CDATA[Tabula rasa: The term in Latin equates to the English &#8220;blank slate&#8221; (or, more accurately, &#8220;erased slate&#8221;) (which refers to writing on a slate sheet in chalk) but comes from the Roman tabula or wax tablet, used for notes, which &#8230; <a href="http://jeffreybarke.net/2011/08/tabula-rasa/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<blockquote><p><i>Tabula rasa</i>: The term in Latin equates to the English &#8220;blank slate&#8221; (or, more accurately, &#8220;erased slate&#8221;) (which refers to writing on a slate sheet in chalk) but comes from the Roman <i>tabula</i> or wax tablet, used for notes, which was blanked by heating the wax and then smoothing it to give a <i>tabula rasa</i>.</p>
</blockquote>
<p>Well, sort of&#8230; If you&#8217;re a&#8217;tall familiar with this blog/site, you&#8217;ll have noticed that two significant things have changed:</p>
<ol>
<li>A majority of the content is gone.</li>
<li>It&#8217;s using the (now) default WordPress theme <a href="http://theme.wordpress.com/themes/twentyeleven/" rel="external">Twenty Eleven</a>.</li>
</ol>
<p>The reason for this was the confluence of three situations (the third being dispositive):</p>
<ol>
<li>I haven&#8217;t written a post since 13 January 2011 (Whut?!?)</li>
<li>I&#8217;ve been meaning to do (and have started on twice) a redesign of this blog (including <abbr title="information architecture">IA</abbr>, markup and visual design) for the past year and a half. A lot of that work was done, but&#8230;</li>
<li>My personal (and only) computer was stolen two and a half weeks ago. <em>And</em> my backup turned out to be spotty (more on this later), so a lot of personal work was lost.</li>
</ol>
<p>After purchasing a new computer, restoring what I could, resetting passwords and realizing that some things were just irretrievably lost, I decided to look at this as an opportunity to clean up my production server and completely redo my blog. So I backed it up, whacked it and did a vanilla install of WordPress 3.2.1.</p>
<p>Originally, I planned to remove everything and just start with this post and an updated &#8220;about&#8221; page. However, I decided to import the few posts that it seems people still find useful and the dag bio isn&#8217;t done yet (believe it or not, I hate writing about myself!).</p>
<p>From this point forward, if you&#8217;re interested, I plan to do daily posts and talk about my local and production environments, WordPress and how I plan to redo the theme according to current best practices (both markup and performance). After that, I&#8217;ll eventually bring all of my archives back online and continue blogging about web development in general.</p>
<p>Since I haven&#8217;t settled on the categories or tags I ultimately plan to use, the only thing that is certain is that all posts related to my redesign/rebuild will be tagged <a href="http://jeffreybarke.net/tag/tabula-rasa/" rel="tag">tabula-rasa</a>.</p>
<p>Hopefully, you&#8217;ll join me as I publicly work through re-doing this site. I look forward to hearing your feedback, and, more importantly, it should be fun!</p>
<p>&#8212;Jeffrey</p>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/TV-JuwcY0Zo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2011/08/tabula-rasa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2011/08/tabula-rasa/</feedburner:origLink></item>
		<item>
		<title>WordPress permalinks, directory structure and 403 forbidden response codes</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/Ye1Z4s3EU6E/</link>
		<comments>http://jeffreybarke.net/2011/01/wordpress-permalinks-403-forbidden-error/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 14:15:45 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mod-rewrite]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=48</guid>
		<description><![CDATA[If you&#8217;re using a &#8220;clean <abbr title="Uniform Resource Locator">URL</abbr>&#8221; permalink structure in WordPress and you have physical directories that match any of the URLs, you might be returning a <code>403 Forbidden</code> response code even if the page render normally. This post shows how to remedy this situation using mod_rewrite. <a href="http://jeffreybarke.net/2011/01/wordpress-permalinks-403-forbidden-error/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>So, full disclosure: I probably set JeffreyBarke.net up wrong. Or, at least not in a &#8220;typical&#8221; way. However, it&#8217;s been the way it is for a long time now and I never thought there was a problem until yesterday, when I was checking Google Webmaster Tools for crawl errors. It turns out I was getting two <code>403 Forbidden</code> error codes on two pages: <a href="http://jeffreybarke.net/code/">Code</a> and <a href="http://jeffreybarke.net/tools/">Tools</a>. At first, I didn&#8217;t believe the results because the pages render fine, but I checked the actual headers and, yerp, there was the 403.</p>
<p>Before I talk about how I got the pages to return proper 200 response codes, I want to give a little background on how JeffreyBarke.net is structured and how it got the way it is. The site is primarily powered by WordPress, which is installed in the web root. However, there are a number of directories (some legacy, some not) that are also in the web root. I have WordPress set up to use &#8220;clean <abbr title="Uniform Resource Locator">URL</abbr>&#8221; permalinks (achieved via mod_rewrite). Sometimes, the WordPress mod_rewrite URLs overlap with existing directories, and this is causing the 403 response codes.</p>
<p>JeffreyBarke.net got this way because I used to have WordPress installed in a <code>/blog/</code> subdirectory and the site root was custom-powered by a mix of flat and dynamic files. I got tired of this arrangement and decided to run everything through WordPress by doing a clean install at the web root. However, I also wanted certain demos, tutorials, code and tools which couldn&#8217;t be integrated with WordPress to remain at their current URLs.</p>
<p>This means I have a physical directory that looks like the following excerpt:</p>
<pre><code>/
	index.php
	tools
		codeigniter-encryption-key-generator
			index.php
	wp-admin
	wp-content
	wp-includes</code></pre>
<p>Since there&#8217;s no index.php file in the tools directory, when you navigate to <code>http://jeffreybarke.net/tools/</code>, mod_rewrite routes you to the WordPress page with the <code>tools</code> slug. When you navigate to <code>http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/</code>, the actual index.php file is returned.</p>
<p>Here&#8217;s the interesting part, though: since I disabled directory browsing in the root .htaccess file and there&#8217;s no index.php, a request for /tools/ <em>should</em> return a 403 Forbidden response code. I&#8217;m kind of surprised that the page renders a&#8217;tall.. If I enable directory browsing, the page doesn&#8217;t render and I get the standard Apache directory view.</p>
<p>Ok, enough background&#8212;how do I have my cake and eat it too?</p>
<p>These are the mod_rewrite rules WordPress automatically generates for my permalink structure:</p>
<pre><code># BEGIN WordPress
&lt;IfModule mod_rewrite.c&gt;
	RewriteBase /
	RewriteRule ^index\.php$ - [L]
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule . /index.php [L]
&lt;/IfModule&gt;
# END WordPress</code></pre>
<p>The second <code>RewriteCond</code> checks that the URL isn&#8217;t referring to an existing directory, which, in the case of both <code>/code/</code> and <code>/tools/</code>, it is. It&#8217;s this second <code>RewriteCond</code> I want to disable, but only for specific directories.</p>
<p>This can be achieved by adding the following lines to the .htaccess file that contains the WordPress permalink structure:</p>
<pre><code># Fix 403 errors on existing directories; WordPress overrides.
RewriteCond %{REQUEST_URI} ^/(code|tools)/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . /index.php [L]</code></pre>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/Ye1Z4s3EU6E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2011/01/wordpress-permalinks-403-forbidden-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2011/01/wordpress-permalinks-403-forbidden-error/</feedburner:origLink></item>
		<item>
		<title>CodeIgniter encryption key generator</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/ZP_1JzM_DEo/</link>
		<comments>http://jeffreybarke.net/2011/01/codeigniter-encryption-key-generator/#comments</comments>
		<pubDate>Sun, 02 Jan 2011 19:16:37 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=28</guid>
		<description><![CDATA[Inspired by WordPress&#8217;s <a href="https://api.wordpress.org/secret-key/1.1/salt/" rel="external">secret-key service</a>, I created a <a href="http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/">CodeIgniter encryption key generator</a>. Navigate to or refresh the page to get a random, 32-character sting that can be used by <a href="http://codeigniter.com/user_guide/libraries/encryption.html" rel="external">CodeIgniter&#8217;s encryption class</a>. <a href="http://jeffreybarke.net/2011/01/codeigniter-encryption-key-generator/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Inspired by WordPress&#8217;s <a href="https://api.wordpress.org/secret-key/1.1/salt/" rel="external">secret-key service</a>, I created a <a href="http://jeffreybarke.net/tools/codeigniter-encryption-key-generator/">CodeIgniter encryption key generator</a>. Navigate to or refresh the page to get a random, 32-character sting that can be used by <a href="http://codeigniter.com/user_guide/libraries/encryption.html" rel="external">CodeIgniter&#8217;s encryption class</a>.</p>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/ZP_1JzM_DEo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2011/01/codeigniter-encryption-key-generator/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2011/01/codeigniter-encryption-key-generator/</feedburner:origLink></item>
		<item>
		<title>HTML email breakage due to automatic text resizing</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/oRfxIzGrNx0/</link>
		<comments>http://jeffreybarke.net/2010/12/html-email-breakage-automatic-text-resizing/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 01:54:06 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[html-email]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=35</guid>
		<description><![CDATA[WebKit&#8217;s automatic text resizing can break <abbr title="HyperText Markup Language">HTML</abbr> emails when a font size less than 15 pixels is critical. Luckily, there&#8217;s an easy fix to this issue. Also, setting inline image elements to display as block-level can avoid the &#8220;mysterious gap&#8221; that breaks HTML email layouts. <a href="http://jeffreybarke.net/2010/12/html-email-breakage-automatic-text-resizing/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After finishing an <abbr title="HyperText Markup Language">HTML</abbr> email for The Knot today, I ran it, as usual, through <a href="http://www.campaignmonitor.com/testing/" rel="external">Campaign Monitor&#8217;s design and spam test</a>. To my surprise, the only clients it didn&#8217;t look good in (other than Lotus Notes &lt; 8, <em>boo! Lotus Notes</em>) were the iPad and iPhone! I can&#8217;t recall the last time I did an email that didn&#8217;t render well in either of them.</p>
<p>In this case, the <a href="http://24ways.org/2009/rock-solid-html-emails" title="24 ways: Rock Solid HTML Emails" rel="external">issue turned out to be an old one</a>, but one I didn&#8217;t remember. By default, <a href="http://ibrennan.co.uk/knowledge-share/iphone-and-ipad-minimum-font-sizes-in-html-emails/" rel="external">Apple sets the minimum font size in an HTML email</a> to 15px. Luckily, there&#8217;s an easy way to disable this behavior.</p>
<p>For those really tight layouts where every pixel matters, add the following <abbr title="Cascading Style Sheets">CSS</abbr> rule to any text less than 15px:</p>
<p><code class="code css">-webkit-text-size-adjust: none;</code></p>
<p>Since I&#8217;m posting about HTML emails, I figured I might as well mention an(other old) issue that recently affected some developers at The Knot, but which can be a real headache if you&#8217;re not familiar with it: the mysterious gap below images. Certain browsers and clients add a few pixels of padding below images (which is caused by the default vertical alignment of inline elements) and this can break the carefully crafted, &#8220;semantically-rich&#8221; tabled-based layouts of HTML emails.</p>
<p>Since Outlook 2007 doesn&#8217;t support background images, I use the <code>img</code> tag for all images and always set them to display as block-level elements. Issue resolved!</p>
<p>For developers of HTML emails, the best advice I can give is periodically review the <a href="http://www.campaignmonitor.com/design-guidelines/" rel="external">great documentation at Campaign Monitor</a>!</p>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/oRfxIzGrNx0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2010/12/html-email-breakage-automatic-text-resizing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2010/12/html-email-breakage-automatic-text-resizing/</feedburner:origLink></item>
		<item>
		<title>New York JavaScript Meetup: A sneak preview of the Cujo.js MVC framework</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/RhjNRxjsE6k/</link>
		<comments>http://jeffreybarke.net/2010/08/sneak-preview-of-cujo-js-mvc-framework/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 00:42:32 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[cujo]]></category>
		<category><![CDATA[cujo-js]]></category>
		<category><![CDATA[john-hann]]></category>
		<category><![CDATA[new-york-javascript-meetup]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=42</guid>
		<description><![CDATA[My live notes from John Hann&#8217;s 25 August 2010 presentation on modern JavaScript frameworks to the <a href="http://www.meetup.com/javascript-7/calendar/14373175/" rel="external">New York JavaScript Meetup</a>, including a sneak preview of the Cujo.js <abbr title="Model-View-Controller">MVC</abbr> framework. <a href="http://jeffreybarke.net/2010/08/sneak-preview-of-cujo-js-mvc-framework/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>My live notes from John Hann&#8217;s 25 August 2010 presentation on modern JavaScript frameworks to the <a href="http://www.meetup.com/javascript-7/calendar/14373175/" rel="external">New York JavaScript meetup</a>.</p>
<blockquote><p>Modern JavaScript frameworks rock! Dojo, jQuery, MooTools, Prototype&#8230; alleviate us from browser quirks so we can concentrate on coding awesome web sites. But none of these offer any guidance whatsoever&#8212;and hardly any tools&#8212;for building enterprise-worthy, ultra-rich web applications. It&#8217;s just too easy to create inflexible, unmaintainable spaghetti code.</p>
<p>A few Javascript-based, in-browser Model-View-Controller endeavors have popped up to help provide solutions. Most of these are simply rehashed server-side MVC frameworks. They just don&#8217;t get it. MVC sucks for web development. The bigger the project, the worse it gets.</p>
<p>Cujo.js was specifically designed to eliminate these inter-dependencies. Yes, it&#8217;s an MVC framework, but it&#8217;s different&#8230;</p>
</blockquote>
<div id="__ss_4451476"><object id="__sse4451476" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cujotxjspresentation-100609080057-phpapp01&amp;stripped_title=cujo-dojo-css3-mvc" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed name="__sse4451476" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cujotxjspresentation-100609080057-phpapp01&amp;stripped_title=cujo-dojo-css3-mvc" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>The above slides are from a presentation on Cujo.js, but are <em>not</em> the slides to this presentation.</p>
<h2>cujo.js: A sneak preview</h2>
<p>John Hann<br /><a href="http://twitter.com/unscriptable" rel="external">@unscriptable</a><br />lifeIMAGE, Inc.</p>
<p>cujo is about building ultra-rich web applications.</p>
<h3>What is an ultra-rich web app?</h3>
<ul>
<li>Feature-rich</li>
<li>Single-page app (&#8220;spa&#8221;)</li>
<li>Desktop-like</li>
<li>You &#8220;live&#8221; in the app</li>
</ul>
<p>Examples: lila<sup>&trade;</sup> Inbox, meebo, Gmail, Google Docs, Facebook</p>
<h3>Why would anybody want to build a spa?</h3>
<ul>
<li>Responsiveness</li>
<li>Mobile (HTML5 apps, Phonegap)</li>
<li>Cross-platform</li>
<li>Vendor-agnostic</li>
<li>Auto-update</li>
<li>Offline</li>
<li>More responsiblity to client (more clients), less for server (fewer)</li>
</ul>
<h3>The rise of the JS libraries</h3>
<ul>
<li>Prototype</li>
<li>Dojo</li>
<li>jQuery</li>
<li>Mootools</li>
<li>Mochikit</li>
</ul>
<p>Why JS libraries?</p>
<ul>
<li>Browser abstraction</li>
<li>Language abstraction</li>
<li>Plugins, components, widgets</li>
</ul>
<p>All the node-wrangling tools to build all ultra-rich applications.</p>
<p>However, <em>5,000 lines of tangled JavaScript later</em>, what the heck happened?</p>
<p>It&#8217;s your nodes, dumb-ass. Stop fiddling with your nodes! Building an ultra-rich app requires software engineering.</p>
<p><em>We&#8217;re building desktop applications on the web.</em></p>
<h3>Why can&#8217;t I just fiddle with my nodes?</h3>
<ul>
<li>Bigger app
<ul>
<li>More complexity</li>
<li>More code</li>
<li>More coders</li>
</ul>
</li>
<li>Complicating factors:
<ul>
<li>Customization</li>
<li>il8n/L10n</li>
<li>Authorization</li>
<li>Animation</li>
</ul>
</li>
</ul>
<h3>How to uncomplexify?</h3>
<ul>
<li>Modularization: &#8220;Think tiny&#8221;</li>
<li>Encapsulation: Don&#8217;t touch my coadz</li>
<li>Loose coupling: I won&#8217;t touch your coadz</li>
<li>Reuse: Don&#8217;t repeat yourself</li>
<li>Separation of labor: Mind your own biz</li>
</ul>
<h3>Does $() help?</h3>
<p>It doesn&#8217;t</p>
<p>3rd-party solutions help Dojo and YUI do more than jQuery, but not enough.</p>
<p>Don&#8217;t believe me?</p>
<p>Does $().fn help modularize my CSS?<br />
Does dojo.connect() protect my code?<br />
Does $().live respect my widget&#8217;s personal space?<br />
Does $.extend help me reuse HTML?<br />
Does $.animate coordinate nicely with my CSS designer&#8217;s CSS files?</p>
<p>Animation is not behavior&#8212;belongs with designer (CSS3 transitions)</p>
<p>Cujo is built on Dojo.</p>
<h3>Dojo MVC?</h3>
<p>models, views, controllers&#8230;</p>
<h3>Why is cujo.js moar?</h3>
<p>Data flows magically between nodes &amp; server.<br />
Template languages disappear (and so does the ID attribute!)<br />
Views invoke the &#8230;</p>
<p>Dojo 1.6 data stores are hawt!</p>
<p>Data stores are data models. Most handle client-server communication so you don&#8217;t:</p>
<ul>
<li>json</li>
<li>json-rest</li>
<li>couchdb</li>
<li>flickr</li>
<li>google</li>
<li>csv</li>
<li>xml</li>
<li>atom</li>
<li>etc</li>
</ul>
<p>Data binding provides the &#8220;last mile.&#8221; (Dojo 1.6 will provide data binding). The end result: &#8220;live&#8221; data. <small>As live as you want it, anyway</small>.</p>
<h3>What template language?</h3>
<p>Why use a {{template language}}? HTML5 <code>data-*</code> attrs FTW!</p>
<p>inheritance: data-cujo-override<br />
loop*: data-cujo-iter<br />
conditional*: data-cujo-if</p>
<p><small>&#8220;oohtml,&#8221; anyone?</small></p>
<h3>The &#8220;holey&#8221; web trinity</h3>
<p>oojs + oohtml + oocss => cujo.mvc. View complete module, yet still overridable.<br />
my/HawtWidget.js (aka &#8220;view-controller&#8221;):<br />
dojo.provie(&#8216;my.HawtWidget)<br />
cujo.requireCss()&#8230;</p>
<h3>Ancient browsers grok CSS2.1 &amp; CSS3</h3>
<p>Once you take control of the stylesheets, the sky is the limit.</p>
<p>Ever wish this worked in IE6?</p>
<ul>
<li>Two selectors (chained) on an element: .myWidget.selected</li>
<li>child selectors</li>
<li>Transitions</li>
</ul>
<h3>Moar modularization</h3>
<p>JS, CSS and HTML as a single unit is easier to create, test, maintain and extend.</p>
<p><code>dojo.provide('mgp.view.logo');<br />
cujo.requireCSS('mgp.view.Logo');<br />
cujo.requireHtml('mgp.view.Logo');<br />
dojo.require('cujo.mvc.View');<br />
dojo.declare('mgp.view.Logo', cujo.mvc.View, {&#8230;</code></p>
<h3>Moar encapsulation</h3>
<p>Self-contained, &#8220;black boxes&#8221;</p>
<p>Minimize cross-dependencies.<br />
cujo.js mixins FTW!<br />
cujo._Connectable limits dojo.connect()<br />
cujo._Settable limits dijit&#8217;s set()</p>
<h3>Moar loose coupling</h3>
<p>It&#8217;s good to be loose and ignorant of your own parents! Cujo emphasizes:</p>
<ul>
<li>doj.connect</li>
<li>dojo.publish/dojo.subscribe</li>
</ul>
<h3>Moar reuse</h3>
<p>Just say no to copy-and-past coding practices.<br />
Increase maintenance<br />
cujo.js embraces OOJS and OOCSS.<br />
Adds OOHTML<br />
OOHTML enables OOCSS (automatically applies inherited classes)</p>
<p><strong>Jon Hann gives a strong endorsement of OOCSS. <em>Learn it</em></strong></p>
<h3>Moar separation of labor</h3>
<p><code>$.css()</code> and <code>$.animate</code> are the CSS designer&#8217;s job. Layout is also the CSS designer&#8217;s job.</p>
<p>Get over it.</p>
<h3>Moar about view state</h3>
<p>Classical OO inheritance: Descendant classes inherit attributes and behavior.</p>
<p>Pure prototypal inheritance: Descendant objects inherit attributes and behavior.</p>
<p>OOCSS: Descendant objects inherit attributes and run-time state.</p>
<h3>When can I haz Cujo.js?</h3>
<p>Cujo.js is in stealth mode while we test moar browsers, finish features, document and clean-up code. Release 0.1 on Github around 15 September 2010</p>
<p><a href="http://cujojs.com/" rel="external">http://cujojs.com/</a><br /><a href="http://twitter.com/cujojs" rel="external">http://twitter.com/cujujs</a></p>
<h3>Q&amp;A</h3>
<p><strong>Q:</strong> Some people think these frameworks proscribe too much.</p>
<p><strong>A:</strong>Possibly went too far the other way. Can define and extend. Theming. Don&#8217;t want to use the templating language, can pull in your own.</p>
<p><strong>Q:</strong> What is the performance overhead?</p>
<p><strong>A:</strong> Two aspects: load-time. Actually processing CSS at load-time. Do a lot of feature detection, not browser-sniffing, so difficult to do that build time.</p>
<p><strong>Q:</strong> You mentioned how Facebook was different in the beginning?</p>
<p><strong>A:</strong> FB only loads 3KB of JS and that 3BK is responsible for loading and running the rest.</p>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/RhjNRxjsE6k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2010/08/sneak-preview-of-cujo-js-mvc-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2010/08/sneak-preview-of-cujo-js-mvc-framework/</feedburner:origLink></item>
		<item>
		<title>Internet Explorer 8: The X-UA-Compatible meta element and conditional comments</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/RrqofWJzlsw/</link>
		<comments>http://jeffreybarke.net/2010/08/internet-explorer-8-the-x-ua-compatible-meta-element-and-conditional-comments/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 18:40:44 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[conditional-comments]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[ie8]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[paul-irish]]></category>
		<category><![CDATA[x-ua-compatible]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=55</guid>
		<description><![CDATA[How to wrap the X-UA-Compatible <code>meta</code> element with <abbr title="Internet Explorer">IE</abbr> conditional comments and still get it to work. Incidentally, this also helps avoid download blocking by conditional comments. <a href="http://jeffreybarke.net/2010/08/internet-explorer-8-the-x-ua-compatible-meta-element-and-conditional-comments/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I woke up this morning to discover that <a href="http://paulirish.com/" rel="external">Paul Irish</a> had left a comment on one of my <a href="http://github.com/theknotfe/templates/commit/f7551094b538625bba0d77cabc73f80ce513cf85" rel="external">GitHub commits</a>: </p>
<blockquote><p>A user reported that this actually didnt work.. the ie=edge never jumped ie8 into standards mode..</p>
<p>did you see it succeed?</p>
</blockquote>
<p>Hmm&#8230; this didn&#8217;t sound good. The error in question was on our <a href="http://github.com/theknotfe/templates/blob/master/html5-template/html5.html" rel="external"><abbr title="Hypertext Markup Language">HTML</abbr>5 template for The Knot</a>. We had wrapped the X-UA-compatible <code>meta</code> element with an <a href="http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx" rel="external"><abbr title="Internet Explorer">IE</abbr> conditional comment</a>. I don&#8217;t remember exactly <em>why</em> we did this, but I think it had something to do with HTML validation.</p>
<p>Now, I know that HTML validation <a href="http://doesvalidationmatter.com/" rel="external">doesn&#8217;t matter</a> (see also <a href="http://www.nczonline.net/blog/2010/08/17/the-value-of-html-validation/" rel="external">&#8220;The value of HTML validation&#8221;</a>), but I <em>do</em> like using it as a lint tool (and yes, I prefer to just see a green favicon in the title bar). However, I also understand that pages don&#8217;t have to validate in the wild and I had never actually <em>tested</em> wrapping the X-UA-Compatible <code>meta</code> element with a conditional comment. I just assumed it would work, because, well, why shouldn&#8217;t it?</p>
<p>Damn. Once again, I learn the value of assumptions. It turns out that <em>the way it&#8217;s coded</em> doesn&#8217;t work. IE8 completely ignores the X-UA-Compatible <code>meta</code> element. Since I recently read about <a href="http://www.phpied.com/conditional-comments-block-downloads/" rel="external">conditional comments blocking downloads</a>, I was curious if this had anything to do with it and if the solution I had settled on for that problem would also help with this one. <em>Voil&#0224;</em>!</p>
<p>Since the download blocking also affects <a href="http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/" rel="external">conditional comments around the <code>body</code> element</a> and I wanted to avoid putting an empty conditional comment in the <code>head</code>, I moved the conditional comments to the <code>html</code> element. This solution also causes the conditional X-UA-Compatible <code>meta</code> element to be seen by IE!</p>
<p><strong>UPDATE:</strong> There is one problem with this technique: it breaks <a href="http://code.google.com/chrome/chromeframe/" rel="external">Google Chrome Frame</a>. Chrome Frame ignores IE conditional comments, so it never gets invoked. If you want your page to work with Chrome Frame <em>and</em> you want it to validate, <a href="http://www.chromium.org/developers/how-tos/chrome-frame-getting-started#TOC-Making-Your-Pages-Work-With-Google-" rel="external">send an HTTP header</a>. If you can&#8217;t set the header, don&#8217;t wrap the <code>meta</code> element with conditional comments. Besides, validation doesn&#8217;t matter anyway, <img src='http://jeffreybarke.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>
<pre><code>&lt;!--[if lte IE 6 ]&gt;&lt;html lang=&#0034;en-us&#0034; class=&#0034;ie ie6&#0034;&gt;&lt;![endif]--&gt;
&lt;!--[if IE 7 ]&gt;&lt;html lang=&#0034;en-us&#0034; class=&#0034;ie ie7&#0034;&gt;&lt;![endif]--&gt;
&lt;!--[if IE 8 ]&gt;&lt;html lang=&#0034;en-us&#0034; class=&#0034;ie ie8&#0034;&gt;&lt;![endif]--&gt;
&lt;!--[if !IE]&gt;--&gt;&lt;html lang=&#0034;en-us&#0034;&gt;&lt;!--&lt;![endif]--&gt;
&lt;head&gt;
	&lt;!--[if IE]&gt;&lt;meta http-equiv=&#0034;X-UA-Compatible&#0034; content=&#0034;IE=edge&#0034; /&gt;&lt;![endif]--&gt;
&lt;/head&gt;
&lt;/body&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</p>
<h2>Tests</h2>
<ol>
<li><a href="http://jeffreybarke.net/tests/x-ua-compatible/ie7.html"><code>IE=7</code></a>. Works!</li>
<li><a href="http://jeffreybarke.net/tests/x-ua-compatible/ieEdge.html"><code>IE=edge</code></a>. Works!</li>
<li><a href="http://jeffreybarke.net/tests/x-ua-compatible/ieEdgeComment.html"><code>IE=edge</code> wrapped in conditional comment</a>. Does not work!</li>
<li><a href="http://jeffreybarke.net/tests/x-ua-compatible/ieEdgeComment2.html"><code>IE=edge</code> wrapped in conditional comment with conditional comments around the <code>html</code> element</a>. Works!</li>
</ol>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/RrqofWJzlsw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2010/08/internet-explorer-8-the-x-ua-compatible-meta-element-and-conditional-comments/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2010/08/internet-explorer-8-the-x-ua-compatible-meta-element-and-conditional-comments/</feedburner:origLink></item>
		<item>
		<title>NY Web Performance Meetup: dynaTrace AJAX Edition</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/WwDTFta34aQ/</link>
		<comments>http://jeffreybarke.net/2010/08/dynatrace-ajax-edition/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 00:22:26 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[andreas-grabner]]></category>
		<category><![CDATA[dynatrace]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=44</guid>
		<description><![CDATA[Notes from Andreas Grabner presentation on the new features of the upcoming dynaTrace AJAX Edition 2.0. dynaTrace AJAX Edition is a free tool that provides full JavaScript, network, rendering, <abbr title="Document Object Model">DOM</abbr> and <abbr title="Cross-domain HTTP Request">XHR</abbr> tracing for Internet Explorer 6, 7 &#38; 8. With the latest version, the Ajax Edition automatically analyzes best practices in the areas of browser caching, network resources, server-side activity, JavaScript/Ajax and also provides additional key performance metrics that are essential for tracking the end-user perceived performance of a web site such as time to first impression, time to <code>onload</code> or time to fully loaded. <a href="http://jeffreybarke.net/2010/08/dynatrace-ajax-edition/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Notes from Andreas Grabner&#8217;s (dynaTrace evangelist) presentation on the new features of the upcoming dynaTrace AJAX Edition (DAE) 2.0. dynaTrace AJAX Edition is a free tool that provides full JavaScript, network, rendering, <abbr title="Document Object Model">DOM</abbr> and <abbr title="Cross-domain HTTP Request">XHR</abbr> tracing for Internet Explorer 6, 7 &amp; 8. With the latest version, the Ajax Edition automatically analyzes best practices in the areas of browser caching, network resources, server-side activity, JavaScript/Ajax and also provides additional key performance metrics that are essential for tracking the end-user perceived performance of a web site such as time to first impression, time to <code>onload</code> or time to fully loaded.</p>
<p><a href="http://www.meetup.com/Web-Performance-NY/calendar/13964452/" rel="external">NY Web Performance Meetup page</a></p>
<p><em>Please note these are my live notes and were published immediately after the presentation. Hopefully I&#8217;ll have a chance to clean up them up at some point in the future.</em></p>
<p><strong>Presentation bottom-line:</strong> Coming ASAP.</p>
<p>dynaTrace was founded in Austria five years ago. Headquarters in Boston. Started on the server-side. Large clients moving to Web 2.0, so developed dynaTrace Ajax Edition as a free tool. Version 2.0 is in beta, but that is the one that should be downloaded.</p>
<p>Currently works with <abbr title="Internet Explorer">IE</abbr> 6, 7 and 8 exclusively. Will hopefully support <abbr title="Firefox">FF</abbr> by the end of the year.</p>
<p.Every time you analyze a web site, data is stored for later review. Stored on local machine, but sessions can be exported and sent.</p>
<p>Eclipse <abbr title="Remote Procedure Call">RPC</abbr> application. Can set run-time configurations. DAE will launch browser for you. Will replace IE logo in upper left corner. This is how you know it&#8217;s the session window. Installs two add-ons to IE.</p>
<p>Everything that is done on the page is recorded. Network activity, JavaScript execution, rendering. Does add overhead to page. If the JS is very heavy, will add more overhead. Variance to overhead: 5-20%. Can turn down the overhead by collecting less data.</p>
<p>Jeans page for Sears took 13-14 seconds from Keynote. Sears unable to reproduce (4 secs). Keynotes uses IE 7 for monitoring, Sears uses IE 8 internally. Accounted for the discrepancy.</p>
<p>blog.dynatrace.com, where Andreas collects these stories.</p>
<p>After collecting data, can switch back to DAE. At top left (under browsers) is the live session. DAE shows all the URLs. Also does ranking like PageSpeed.. Can upload your rankings to ShowSlow</p>
<ul>
<li>Browser caching performance rank</li>
<li>Network request performance rank</li>
<li>Server-Side performance rank</li>
<li>JavaScript/Ajax performance rank</li>
</ul>
<p>Tabbed interface to each of these ranks. Rank pages provide suggestions similar to PageSpeed and links to dynaTrace&#8217;s best practices techniques (also Google and Yahoo!). These are the standard things that most of the service providers do.</p>
<p>The JS tab is where the magic is. Profiler. Shows JS calls, invocations and total time (in ms).</p>
<p>The jQuery class selector is really bad in IE 6 and 7. A little bit better in IE 8. Profile highlights jQuery calls with yellow arrow. Most of the time is spent using jQuery class lookups. If have to do jQuery class selectors, faster to use a tag qualifier: <code>element.className</code> instead of <code>.className</code>.</p>
<p>The more DOM elements and the deeper the nesting, the more expensive the call. If there will be multiple look-ups for the same selector, cache the nodelist in a variable.</p>
<p>These are the keys to IE performance.</p>
<p>The profiler also includes back traces and forward traces. Can really dig down and see what exact calls and the actual JS script that is taking the most time.</p>
<p>The DAE timeline isn&#8217;t a network waterfall, but it shows you how long the JS execution took and how long the rendering took. Timeline is color-coded and has nice zoom features. If you double click on a timeline block, will get the pure execution path (&#8220;purepaths&#8221;). DAE captures the entire trace, which is far more than most profilers.</p>
<p>Everything yellow is DOM. Arrow to left, retrieving property. Arrow down is a method call. To keep the overhead low, doesn&#8217;t capture the method arguments and return values by default. If need it, can be turned on.</p>
<p>Various times: duration, JS, total, exec. Duration is the total time in asynchronous path, JS ???, total time is time spent in synchronous path, exec time that was exclusively spent executing. If the time is large, but the exec is low, then need to drill down into the sub-methods called by the original method.</p>
<p>Turns out that manually drilling down is doable, but the tedious way. When click on a node, the contributor node window will show all the contributing methods and can sort by most expensive of calls (sometimes 1,000s of calls). When you get low enough, will probably hit jQuery. The middle window shows the entire stack trace, so easy to move back up to find the call you made that caused the bad performance.</p>
<p>Cannot see into Flash, but can get the network time, rendering time and CPU usage. When you start to use the Flash object, though, it&#8217;s invisible unless it downloads more network content or interacts with the HTML page/JS.</p>
<p>In question and answer, turns out that to run DAE for IE and Firefox and to compare them, you&#8217;ll have to pay for it. Otherwise it will only support one browser.</p>
<p>Integration with Selenium.</p>
<p>To do a side-by-side comparison, either copy (easy to do) and paste into Excel or else open two performance report tabs and manually bounce between them. To automate it, there&#8217;s the commercial solution.</p>
<p>When the browser closes, the live session is moved to the stored sessions. Session name will default to the runtime config, but can re renamed via a right-click.</p>
<p>Can right-click on the timeline and easily access a number of different drill-downs.</p>
<p>Due to limited number of network connections, there can be a wait time before an asset can be downloaded. DAE shows that as well.</p>
<p>By default, doesn&#8217;t capture images. Captures the URL and uses a browser component to go out and retrieve it from the web. Captures all HTML, JS and CSS. However, can specify additional MIME types you want captured.</p>
<p>How were they able to capture all this information? A lot of reverse engineering of IE. The rendering information isn&#8217;t as detailed as the JS; more difficult to reverse engineer.</p>
<p>Uses a high-precision timer (also used on their server-side product).</p>
<p>In code view, the code is automatically un-minimized.</p>
<h2>Resources</h2>
<ul>
<li><a href="http://blog.dynatrace.com/" rel="external">Blog</a></li>
<li><a href="http://community.dynatrace.com/" rel="external">Community pages</a></li>
<li><a href="http://ajax.dynatrace.com/pages/recorded-ajax-performance-webinars.aspx" rel="external">Webinar</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/WwDTFta34aQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2010/08/dynatrace-ajax-edition/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2010/08/dynatrace-ajax-edition/</feedburner:origLink></item>
		<item>
		<title>How to install PHPUnit with MAMP</title>
		<link>http://feedproxy.google.com/~r/jeffreybarkenet/~3/_NtSdwHOd28/</link>
		<comments>http://jeffreybarke.net/2010/08/how-to-install-phpunit-with-mamp/#comments</comments>
		<pubDate>Sun, 01 Aug 2010 23:53:53 +0000</pubDate>
		<dc:creator>Jeffrey Barke</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mamp]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[unit-testing]]></category>

		<guid isPermaLink="false">http://jeffreybarke.net/?p=31</guid>
		<description><![CDATA[Installing <a href="http://www.phpunit.de/" rel="external">PHPUnit</a> with <a href="http://www.mamp.info/en/index.html" rel="external"><abbr title="Mac, Apache, MySQL, PHP">MAMP</abbr>&#8217;s</a> <a href="http://pear.php.net/" rel="external"><abbr title="PHP Extension and Application Repository">PEAR</abbr></a> installer is pretty straightforward, but there are a few things to note. <a href="http://jeffreybarke.net/2010/08/how-to-install-phpunit-with-mamp/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Installing <a href="http://www.phpunit.de/" rel="external">PHPUnit</a> with <a href="http://www.mamp.info/en/index.html" rel="external"><abbr title="Mac, Apache, MySQL, PHP">MAMP</abbr>&#8217;s</a> <a href="http://pear.php.net/" rel="external"><abbr title="PHP Extension and Application Repository">PEAR</abbr></a> installer is pretty straightforward, but there are a few things to note:</p>
<ol>
<li>Everything will be done through Terminal, so go ahead and launch it now. All of the commands I provide can be copied and pasted as they are.</li>
<li>Make sure you&#8217;re using the version of PEAR that came with MAMP, not the version that came with your Mac. This means you have to use <code>/Applications/MAMP/bin/php5/bin/pear</code> at the prompt, not <code>pear</code>.</li>
<li>PHPUnit 3.4 requires PHP 5.1.4 or later, but PHP 5.3.2 or later is recommended. MAMP 1.8.2 (the version I have installed) is running version 5.2.10. The latest version of MAMP includes version 5.3.2. So far, I haven&#8217;t noticed any problems running PHPUnit under 5.2.10.</li>
<li>PHPUnit also requires PEAR 1.8.1. MAMP 1.8.2 ships with version 1.8.0. To check which version you have installed, type <code class="code bash">/Applications/MAMP/bin/php5/bin/pear -V</code>.</li>
</ol>
<p>If you need to upgrade PEAR, first use the following two commands: <code class="code bash">/Applications/MAMP/bin/php5/bin/pear channel-update pear.php.net<br />/Applications/MAMP/bin/php5/bin/pear upgrade pear</code></p>
<p>Now, it&#8217;s time to install PHPUnit. The PEAR channel used to distribute PHPUnit needs to be registered with the local PEAR environment and a component that PHPUnit depends upon is hosted on the Symfony Components PEAR channel. To register the channels and install, simply type: <code class="code bash">/Applications/MAMP/bin/php5/bin/pear channel-discover pear.phpunit.de<br />/Applications/MAMP/bin/php5/bin/pear channel-discover pear.symfony-project.com<br />/Applications/MAMP/bin/php5/bin/pear install phpunit/PHPUnit</code></p>
<p>PHPUnit is now installed, but to get it to run from Terminal, we need to  move it into our <code>$PATH</code>. To do so, type: <code class="code bash">mv /Applications/MAMP/bin/php5/bin/phpunit /usr/local/bin/phpunit</code>.</p>
<p>To test your install, type: <code class="code bash">phpunit --version</code>.</p>
<p>You should see something like <code>PHPUnit 3.4.15 by Sebastian Bergmann</code>. And that&#8217;s it!</p>
<img src="http://feeds.feedburner.com/~r/jeffreybarkenet/~4/_NtSdwHOd28" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jeffreybarke.net/2010/08/how-to-install-phpunit-with-mamp/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://jeffreybarke.net/2010/08/how-to-install-phpunit-with-mamp/</feedburner:origLink></item>
	</channel>
</rss>

