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

<channel>
	<title>jonathanjulian.com &#187; jonathan</title>
	<atom:link href="http://jonathanjulian.com/author/admin/feed/" rel="self" type="application/rss+xml" />
	<link>http://jonathanjulian.com</link>
	<description>Ruby, Rails, JavaScript, software development</description>
	<lastBuildDate>Sat, 27 Feb 2010 16:59:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>New Ext JS book in the works</title>
		<link>http://jonathanjulian.com/2010/01/new-ext-js-book-in-the-works/</link>
		<comments>http://jonathanjulian.com/2010/01/new-ext-js-book-in-the-works/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 01:08:08 +0000</pubDate>
		<dc:creator>jonathan</dc:creator>
				<category><![CDATA[extjs]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://jonathanjulian.com/?p=158</guid>
		<description><![CDATA[I&#8217;ve heard a rumor from a trusted source that the next version of Learning Ext JS is being written, and it may be titled Learning Ext JS 3.0. It will be updated to reflect working with version 3.x of the library, and have at least three new chapters added. If it is published in 2010, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve heard a rumor from a trusted source that the next version of <a href="http://learningextjs.com/">Learning Ext JS</a> is being written, and it may be titled <strong>Learning Ext JS 3.0</strong>. It will be updated to reflect working with version 3.x of the <a href="http://extjs.com/">library</a>, and have at least <strong><em>three</em></strong> new chapters added. If it is published in 2010, this could be a great year for Ext JS books, with <a href="http://extjsinaction.com/">Ext JS in Action</a> scheduled to go to print in June.</p>
<p><strong>UPDATE February 10</strong>: Confirmed! I&#8217;ve been asked to be a Technical Reviewer, and I&#8217;ve already received 3 chapters to review! This is going to be a great refresh for what I think is the best entry-level Ext JS book.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathanjulian.com/2010/01/new-ext-js-book-in-the-works/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Five Tips to Improve Your Ext JS Application</title>
		<link>http://jonathanjulian.com/2010/01/five-tips-to-improve-your-ext-js-application/</link>
		<comments>http://jonathanjulian.com/2010/01/five-tips-to-improve-your-ext-js-application/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 00:43:47 +0000</pubDate>
		<dc:creator>jonathan</dc:creator>
				<category><![CDATA[extjs]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://jonathanjulian.com/?p=138</guid>
		<description><![CDATA[Three Pillar Global sponsored their first Ext JS meetup earlier this week, and they were kind enough to invite me to give one of the presentations. Thanks to Patrick Sheridan (@sheridap) of Three Pillar for pulling it together, and providing the delicious pizza! My presentation was inserted between Shea Frederick and Jay Garcia&#8217;s. Pretty good [...]]]></description>
			<content:encoded><![CDATA[<h3 style="font-size: 1.17em;"><span style="font-weight: normal; font-size: 13px;"><a href="http://www.threepillarsoftware.com/">Three Pillar Global</a> sponsored their first <a href="http://www.meetup.com/baltimore-dc-javascript-users/calendar/12219819/">Ext JS meetup</a> earlier this week, and they were kind enough to invite me to give one of the presentations. Thanks to Patrick Sheridan (<a href="http://twitter.com/sheridap">@sheridap</a>) of Three Pillar for pulling it together, and providing the delicious pizza! My presentation was inserted between <a href="http://www.vinylfox.com/">Shea Frederick</a> and <a href="http://tdg-i.com/">Jay Garcia</a>&#8217;s. Pretty good company, I&#8217;d say.</span></h3>
<p>Pat started off discussing &#8220;<a href="http://www.slideshare.net/threepillar/three-pillar-global-design-for-use">Design for Use</a>&#8220;. Then Shea told us all about &#8220;<a href="http://www.slideshare.net/VinylFox/practical-ext-js-debugging">Practical Ext JS Debugging</a>&#8220;.</p>
<p>My talk is titled &#8220;Five Tips to Improve Your Ext JS Application&#8221;. I briefly touch on five distinct strategies to use to make your code more maintainable and reusable. Below the slides and video is a short discussion of each topic:</p>
<div id="__ss_2958396" style="width: 425px; text-align: left;"><a style="font: 14px Helvetica,Arial,Sans-serif; display: block; margin: 12px 0 3px 0; text-decoration: underline;" title="Five Tips To Improve Your Ext Js Application" href="http://www.slideshare.net/jonathanjulian/five-tips-to-improve-your-ext-js-application">Five Tips To Improve Your Ext Js Application</a><object style="margin: 0px;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" 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://static.slidesharecdn.com/swf/ssplayer2.swf?doc=fivetipstoimproveyourextjsapplication-100120131238-phpapp01&amp;rel=0&amp;stripped_title=five-tips-to-improve-your-ext-js-application" /><param name="allowfullscreen" value="true" /><embed style="margin: 0px;" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=fivetipstoimproveyourextjsapplication-100120131238-phpapp01&amp;rel=0&amp;stripped_title=five-tips-to-improve-your-ext-js-application" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration: underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration: underline;" href="http://www.slideshare.net/jonathanjulian">Jonathan Julian</a>.</div>
</div>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9768559&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=9768559&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/9768559">Jonathan Julian at the Northern Virginia Ext JS meetup at Three Pillar Global on 1/19/10</a> from <a href="http://vimeo.com/user3205431">Jay Garcia</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<h3>Define your own components</h3>
<p>Explicitly define your own &#8220;classes&#8221; as you build your UI. This will allow your code to be more reusable, testable, and maintainable. It&#8217;s really easy to do, and along with namespacing your files and only defining one component per file, this approach will lead to amazingly clear directory structure.</p>
<h3>Use an event manager</h3>
<p>Sometimes also known as an &#8220;event broker&#8221;, this is a simple object used to centralize all events. The example in the presentation is the &#8220;simplest event manager you can build with Ext JS&#8221;. I like to use at least one in every project to simplify the coding when someone inevitably asks, &#8220;can you make it do X every time the user does Y?&#8221;</p>
<div id="attachment_146" class="wp-caption alignleft" style="width: 290px"><img class="size-medium wp-image-146" title="describing an event manager" src="http://jonathanjulian.com/wp-content/uploads/2010/01/five_tips-crop-280x300.jpg" alt="Here I am describing the MyApp.eventManager" width="280" height="300" /><p class="wp-caption-text">Fire an event on the MyApp.eventManager</p></div>
<h3>Override the framework properly</h3>
<p>Anytime you need to &#8220;hack&#8221; the framework, do your work in a special file (or dir): call it &#8220;overrides&#8221;. Then when you test your upgrade to the next version of Ext JS, all the integration points to inspect are in one place. I also included my idea of a standard directory layout. I think it works well with the idea of &#8220;Namespace Segmentation&#8221; as discussed in Chapter 16 of <a href="http://extjsinaction.com/">Ext JS in Action</a>.</p>
<h3>Remember, it&#8217;s still a web app</h3>
<p>Write good JavaScript code. Use <a href="http://jslint.com/">JSLint</a>. Read <a href="http://jonathanjulian.com/2009/07/javascript-the-good-parts/">The Good Parts</a> and <a href="http://stevesouders.com/efws/">Even Faster Websites</a>.</p>
<h3>Prefer an Ext JS SPA to a classic &#8220;web app&#8221;</h3>
<p>This is a tricky one. If you have the choice, build your application in two tiers &#8211; Ext JS, and web service. They don&#8217;t even have to share the same endpoint! A cleaner design emerges when you separate the concept of the Ui and the data. If you work on a project that already muddles the two with server-side script tags and generation of Ext JS configs with &#8220;helpers&#8221;, then make it a goal to write all new code in the two-tier style. Put your Ext JS code in .js files. And only communicate with the server via JSONStores and Ajax requests.</p>
<div id="attachment_148" class="wp-caption alignright" style="width: 246px"><a href="http://github.com/jjulian/winner_picker"><img class="size-medium wp-image-148  " title="winner_picker on github" src="http://jonathanjulian.com/wp-content/uploads/2010/01/winner_picker-291x300.png" alt="jjulian/winner_picker" width="236" height="243" /></a><p class="wp-caption-text">The winner_picker UI.</p></div>
<h3>The Winner Picker App</h3>
<p>Shea brought a few copies of <a href="http://learningextjs.com/">Learning Ext JS</a>, and Jay brought a few vouchers for an early access copy of <a href="http://extjsinaction.com/">Ext JS in Action</a>. We needed a way to give them away &#8211; so, I dreamed up a simple app to randomly choose an attendee. To make it fun, I wanted to have a slick animation to randomly highlight attendees names for a few seconds before the choice is shown.</p>
<p>In less than an hour or so, here&#8217;s the Ext JS app I made: it&#8217;s a grid with an Array Store (attendees were entered manually), and one button that kicks off the process. And the silly animation: every 10ms, a grid row is selected at random and highlighted. The delay is slowly ramped down for effect. After a few seconds, the last random choice is made, and a message box is shown with the winner&#8217;s name. The<a href="http://github.com/jjulian/winner_picker"> code is on github</a>, and I encourage you to fork the project and improve it, for no other reason than practice (basic knowledge of git is <a href="http://jonathanjulian.com/2009/08/basic-git/">easy to get</a>). The Five Tips can be applied to this tiny project just as well as they can to your large enterprise project!</p>
<h3>Conclusion</h3>
<p>I think it was a successful event, and I hope to be involved in the future. There were a handful of intense discussions afterwards &#8211; it&#8217;s good to be a part of a passionate community! If you are in the Baltimore area, come on out to <a href="http://www.meetup.com/baltimore-dc-javascript-users/">our JavaScript meetup</a> and hang out with us on the first Wednesday of every month. We meet at the <a href="http://beehivebaltimore.com/">Beehive</a> in Canton. If you are in NOVA and want to help build the Ext JS meetup scene there, get in contact with Pat (<a href="http://twitter.com/sheridap">@sheridap</a>) or Jay (<a href="http://twitter.com/tdgi">@tdgi</a>).</p>
<p>I&#8217;d love to hear what you think about the Five Tips. Feel free to comment here, or on the <a href="http://www.slideshare.net/jonathanjulian/five-tips-to-improve-your-ext-js-application">slideshare page</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathanjulian.com/2010/01/five-tips-to-improve-your-ext-js-application/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Backup your mysql blog with cron</title>
		<link>http://jonathanjulian.com/2009/12/backup-your-mysql-blog-with-cron/</link>
		<comments>http://jonathanjulian.com/2009/12/backup-your-mysql-blog-with-cron/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 22:46:38 +0000</pubDate>
		<dc:creator>jonathan</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[UNIX]]></category>

		<guid isPermaLink="false">http://jonathanjulian.com/?p=124</guid>
		<description><![CDATA[Everyone&#8217;s tweeting about codinghorror&#8217;s data loss today. I&#8217;m not sure exactly why their hosting provider lost their blog, but I&#8217;m prepared if mine ever does. In my case, it&#8217;s easy &#8211; I email myself a dump of the WordPress mysql database nightly.
$ crontab -l
0 7 * * *  /usr/bin/mysqldump -u root -psecret --all-databases &#124;bzip2 &#62; [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_125" class="wp-caption alignnone" style="width: 539px"><img class="size-full wp-image-125" title="codinghorror" src="http://jonathanjulian.com/wp-content/uploads/2009/12/00000179.png" alt="codinghorror.com loses it's blog to a hosting failure" width="529" height="69" /><p class="wp-caption-text">codinghorror.com loses it&#39;s blog to a hosting failure</p></div>
<p>Everyone&#8217;s <a href="http://twitter.com/bryanl/statuses/6580555281">tweeting</a> about <a href="http://codinghorror.com/">codinghorror</a>&#8217;s data loss today. I&#8217;m not sure exactly why their hosting provider lost their blog, but I&#8217;m prepared if mine ever does. In my case, it&#8217;s easy &#8211; I email myself a dump of the WordPress mysql database nightly.</p>
<pre>$ crontab -l
0 7 * * *  /usr/bin/mysqldump -u root -psecret --all-databases |bzip2 &gt; /tmp/dbbackup.sql.bz &amp;&amp; (printf "\%b" "Subject: db backup for `date`\nTo: jonathan\n"; /usr/bin/uuencode /tmp/dbbackup.sql.bz all-databases.sql.bz) |/usr/sbin/ssmtp jonathan@example.com</pre>
<p>That command runs once a night, dumping the structure and contents of my mysql database, compresses it, and formats the file as an email attachment and sends it to me using <a href="http://www.linux.com/archive/feature/132006">ssmtp</a>. You can substitute sendmail, or your favorite MTA (Mail Transfer Agent).</p>
<p>Every morning, I hit &#8220;y&#8221; on that message in gmail, and that&#8217;s a fine tradeoff for sleeping soundly.</p>
<p><strong>UPDATE</strong>: the same technique can be used to backup your entire www directory, saving images and site tweaks. This cron task runs once a week, emailing my my entire WordPress install for all sites hosted on this slice.</p>
<pre>15 7 */7 * *  cd /var/www &amp;&amp; tar zcf /tmp/www.tar.gz * &amp;&amp; (printf "\%b" "Subject: www backup for `date`\nTo: jonathan\n"; /usr/bin/uuencode /tmp/www.tar.gz www.tar.gz) |/usr/sbin/ssmtp jonathan@example.com</pre>
<p>As you can imagine, the files can be uploaded to another host via scp or sent to Amazon S3 instead of emailed.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathanjulian.com/2009/12/backup-your-mysql-blog-with-cron/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introduction to delayed_job</title>
		<link>http://jonathanjulian.com/2009/11/introduction-to-delayed_job/</link>
		<comments>http://jonathanjulian.com/2009/11/introduction-to-delayed_job/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 13:03:58 +0000</pubDate>
		<dc:creator>jonathan</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://jonathanjulian.com/?p=119</guid>
		<description><![CDATA[I gave this short presentation at the November bmore-on-rails meeting last night. Flip Sasser also presented an overview of Resque, and Michael Dotterer showed us a bit about background_job.
We decided that delayed_job is an easy and solid way to get background tasks running in your Rails app, but if you are a massive site that needs [...]]]></description>
			<content:encoded><![CDATA[<p>I gave this short presentation at the <a href="http://www.meetup.com/bmore-on-rails/calendar/11620904/">November</a> <a href="http://www.meetup.com/bmore-on-rails/">bmore-on-rails</a> meeting last night. <a href="http://twitter.com/flipsasser">Flip Sasser</a> also presented an overview of <a href="http://github.com/blog/542-introducing-resque">Resque</a>, and <a href="http://www.workingwithrails.com/person/17379-michael-dotterer">Michael Dotterer</a> showed us a bit about <a href="http://codeforpeople.rubyforge.org/svn/bj/trunk/README">background_job</a>.</p>
<p>We decided that delayed_job is an easy and solid way to get background tasks running in your Rails app, but if you are a massive site that needs a heavy-duty and configurable solution, then Resque may be what you need. Resque&#8217;s complexity makes this a non-trivial decision! Start with delayed_job since it&#8217;s so quick to implement, and you can always choose another solution later.</p>
<div id="__ss_2467230" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Introduction To Delayed Job" href="http://www.slideshare.net/jonathanjulian/introduction-to-delayed-job">Introduction To Delayed Job</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" 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://static.slidesharecdn.com/swf/ssplayer2.swf?doc=introtodelayedjob-091110110012-phpapp01&amp;stripped_title=introduction-to-delayed-job" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=introtodelayedjob-091110110012-phpapp01&amp;stripped_title=introduction-to-delayed-job" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/jonathanjulian">Jonathan Julian</a>.</div>
</div>
<p>Want to get delayed_job running in your app in 10 minutes? Follow the steps in <a href="http://railstips.org/2008/11/19/delayed-gratification-with-rails">Delayed Gratification with Rails</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathanjulian.com/2009/11/introduction-to-delayed_job/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Wrapping a div around will_paginate page_entries_info</title>
		<link>http://jonathanjulian.com/2009/11/wrapping-a-div-around-will_paginate-page_entries_info/</link>
		<comments>http://jonathanjulian.com/2009/11/wrapping-a-div-around-will_paginate-page_entries_info/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 20:19:26 +0000</pubDate>
		<dc:creator>jonathan</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://jonathanjulian.com/?p=116</guid>
		<description><![CDATA[The page_entries_info view helper looks great, but it is just plain text; I can&#8217;t add margin or padding or float it. Here&#8217;s a quick alias_method to wrap it up in a div with the class of your choice.

Just drop that into an file in config/initializers, restart, and get styling!
]]></description>
			<content:encoded><![CDATA[<p>The page_entries_info view helper looks great, but it is just plain text; I can&#8217;t add margin or padding or float it. Here&#8217;s a quick alias_method to wrap it up in a div with the class of your choice.</p>
<p><script src="http://gist.github.com/230245.js"></script></p>
<p>Just drop that into an file in config/initializers, restart, and get styling!</p>
]]></content:encoded>
			<wfw:commentRss>http://jonathanjulian.com/2009/11/wrapping-a-div-around-will_paginate-page_entries_info/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
