<?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>Jason Carr &#187; Technology</title>
	<atom:link href="http://www.jasoncarr.com/category/technology/feed" rel="self" type="application/rss+xml" />
	<link>http://www.jasoncarr.com</link>
	<description></description>
	<lastBuildDate>Sun, 25 Dec 2011 07:36:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Amazon MP3, Cloud Player, Cloud Drive &#8211; New Features Coming Soon</title>
		<link>http://www.jasoncarr.com/technology/amazon-mp3-cloud-player-cloud-drive-new-features-coming-soon</link>
		<comments>http://www.jasoncarr.com/technology/amazon-mp3-cloud-player-cloud-drive-new-features-coming-soon#comments</comments>
		<pubDate>Tue, 05 Jul 2011 19:57:29 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[Amazon Cloud Drive]]></category>
		<category><![CDATA[Amazon Cloud Player]]></category>
		<category><![CDATA[Amazon MP3]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.jasoncarr.com/?p=1341</guid>
		<description><![CDATA[This article will be admittedly vague, as Amazon has released little to no information on new features that are coming to their MP3, Cloud Player, and Cloud Drive services.  However, I just got off a call with someone from [...]]]></description>
			<content:encoded><![CDATA[<p>This article will be admittedly vague, as Amazon has released little to no information on new features that are coming to their MP3, Cloud Player, and Cloud Drive services.  However, I just got off a call with someone from Amazon&#8217;s Cloud Drive technical support team, and asked when and what might be coming regarding new features for the services.</p>
<table cellpadding="0" cellspacing="0" border="0" style="border: none;">
<tr style="border: none;">
<td style="border: none; text-align: center;"><a href="http://www.amazon.com/MP3-Music-Download/b?ie=UTF8&#038;node=163856011" target="_blank"><img src="/pictures/amazon-mp3.jpg" alt="amazon mp3 Amazon MP3, Cloud Player, Cloud Drive   New Features Coming Soon"  title="Amazon MP3, Cloud Player, Cloud Drive   New Features Coming Soon" /></a></td>
<td style="border: none; text-align: center;"><a href="https://www.amazon.com/clouddrive/learnmore" target="_blank"><img src="/pictures/amazon-cloud-drive.gif" alt="amazon cloud drive Amazon MP3, Cloud Player, Cloud Drive   New Features Coming Soon"  title="Amazon MP3, Cloud Player, Cloud Drive   New Features Coming Soon" /></a></td>
<td style="border: none; text-align: center;"><a href="http://www.amazon.com/b?ie=UTF8&#038;node=2658409011" target="_blank"><img src="/pictures/amazon-cloud-player.jpg" alt="amazon cloud player Amazon MP3, Cloud Player, Cloud Drive   New Features Coming Soon"  title="Amazon MP3, Cloud Player, Cloud Drive   New Features Coming Soon" /></a></td>
</tr>
</table>
<p>The candid response I received noted that the techs had been told that new features were coming &#8220;within the next couple of weeks.&#8221;  However, apparently Amazon is being hush-hush as to what the new features will entail, as the tech claimed to know absolutely nothing about them.  In fact, the tech was openly irritated by the fact that he was not being told what was coming, and had had no training on the new features.</p>
<p>I will say that I was impressed with the support I received; the fact that Amazon actually has a phone number to call is surprising, and the fact that the person I talked to was obviously US-based (no accent whatsoever) was even more impressive.  On top of that, I waited less than a few minutes to receive support.  That&#8217;s a big win as far as I&#8217;m concerned.</p>
<p>Anyway, we have reason to be excited, as Amazon is sharing internally that new features will be coming to their Amazon MP3, Amazon Cloud Player and/or Amazon Cloud Drive services &#8220;within the next couple of weeks.&#8221;  How excited, though, we&#8217;ll just have to wait and see&#8230;<br />
<span id="more-1341"></span><br />
If you&#8217;ve heard any more information or have anything more to add please share it with us below. :)</p>
<p><script type="text/javascript">
(function() {
var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0];
s.type = 'text/javascript';
s.async = true;
s.src = 'http://widgets.digg.com/buttons.js';
s1.parentNode.insertBefore(s, s1);
})();
</script></p>
<table border="0" cellspacing="0" cellpadding="0" style="width: 200px;">
<tr>
<td><a class="DiggThisButton DiggMedium"></a></td>
<td>
<script src="http://www.stumbleupon.com/hostedbadge.php?s=5"></script></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/amazon-mp3-cloud-player-cloud-drive-new-features-coming-soon/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>5 Crucial Tips for Being Lazy and Productive at the Same Time</title>
		<link>http://www.jasoncarr.com/technology/5-crucial-tips-for-being-lazy-and-productive-at-the-same-time</link>
		<comments>http://www.jasoncarr.com/technology/5-crucial-tips-for-being-lazy-and-productive-at-the-same-time#comments</comments>
		<pubDate>Fri, 18 Mar 2011 16:00:44 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.jasoncarr.com/?p=1240</guid>
		<description><![CDATA[One thing&#8217;s for sure: I hate work.  But we all have to be productive from time to time (or we&#8217;ll end up living in our parents&#8217; basements till we&#8217;re 45).  These are a few tricks I&#8217;ve learned over [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/pictures/lazy.jpg" alt="lazy 5 Crucial Tips for Being Lazy and Productive at the Same Time" style="float: right; margin-left: 15px;" title="5 Crucial Tips for Being Lazy and Productive at the Same Time" />One thing&#8217;s for sure: I hate work.  But we all have to be productive from time to time (or we&#8217;ll end up living in our parents&#8217; basements till we&#8217;re 45).  These are a few tricks I&#8217;ve learned over the years that constantly save me ample amounts of time, and I think it&#8217;s hilarious when I see other people wasting their time using the traditional approach.<br />
<span id="more-1240"></span></p>
<style>
ol { font-weight: bold; }
ol li p { font-weight: normal; }
</style>
<ol>
<li>
<p><strong>Stop ironing your clothes.</strong></p>
<p>If you&#8217;re like me, buying &#8220;wrinkle-free&#8221; pants and shirts doesn&#8217;t really do any good when you let them sit in the dryer or in a basket for a week before you wear them.  And going to work looking like a slob unfortunately doesn&#8217;t do much good for your career (which really sucks when you&#8217;re lazy).</p>
<p><strong>So what&#8217;s the trick?</strong></p>
<p><a href="http://www.zazzle.com/no_ironing_sticker-217894944586038375" target="_blank" style="outline: none;"><img src="/pictures/no-ironing.jpg" alt="no ironing 5 Crucial Tips for Being Lazy and Productive at the Same Time" style="float: right;" title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a>Hang them on the side of the shower, put the shower on full blast (and as hot as possible), close the bathroom door, and give it five minutes.  The wrinkles can&#8217;t stand the steam and disappear pretty quickly.  Sure beats ironing.</p>
<p>Obviously, environmental buffs will cringe at the thought of this, but if you really want to be environmentally friendly then stop being lazy (or you can just do it while you take your shower, either way).</p>
</li>
<li>
<p><strong>Never pay a bill again.</strong></p>
<p>Paying bills sucks, not only because it&#8217;s a responsible thing to do, but also because it forces you to come to the realization that all of your money is going away.  This makes me cringe, so I used to tend to just not pay my bills.</p>
<p>Problem is, this causes other issues, and you generally end up having more problems on your hands.  Not good for laziness, or your credit.</p>
<p><strong>So what is a lazy man to do?</strong></p>
<p>Automate your bills, obviously.  Most companies will let you pay your bills online, and many will let you schedule your payments so you don&#8217;t actually have to do anything to pay the bill.  Typically, they&#8217;ll just send you an email when you&#8217;ve made the payment at the right time every month.  This way you never have to actually do anything.  Sound good?</p>
<p>Unfortunately, though, there always seems to be a company on your list that&#8217;s stuck in 1984 and can&#8217;t seem to get their act together in collecting their money.  Well, amuse them and get a bank account that will automatically send them an old-fashioned check in the mail at the same time every month.  It&#8217;s called &#8220;automatic bill pay&#8221; and any bank worthy of this decade will do this for you in their Internet banking interface.  If your bank still won&#8217;t do this, get a different bank.  I recommend these guys:</p>
<p style="text-align: center;"><a href="http://www.ingdirect.com/" target="_blank" style="outline: none;"><img src="/pictures/ing-direct.png" alt="ing direct 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a></p>
</li>
<li>
<p><strong>Take your office with you wherever you go.</strong></p>
<p>A huge part of being able to be productive and lazy is not having to physically move to get your work done.  You&#8217;re not likely to get stuff done if you&#8217;re not at home and you have no way of remotely getting anything done.  I often find myself with free time in the oddest situations, and if I have everything I need with me, I can make something of it.  Otherwise, I&#8217;m stuck being bored.</p>
<p><strong>But I can&#8217;t take my whole office with me&#8230;</strong></p>
<p>Yes, you can.  If it&#8217;s all digital, anyway.  If you&#8217;re still dealing with a briefcase and papers, then you&#8217;re really wasting your time.  I use a combination of <a href="http://www.dropbox.com/" target="_blank">Dropbox</a> (for sharing my entire file collection between computers), <a href="http://www.portableapps.com/" target="_blank">PortableApps.com</a> (for sharing applications between computers), <a href="http://docs.google.com" target="_blank">Google Docs</a> (for easy online access to all my documents), and <a href="http://www.gmail.com/" target="_blank">Gmail</a> (for email).</p>
<p><a href="http://www.dropbox.com/" target="_blank" style="outline: none;"><img src="/pictures/dropbox.gif" alt="dropbox 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a><a href="http://www.portableapps.com/" target="_blank" style="outline: none;"><img src="/pictures/portableapps.gif" alt="portableapps 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a><br /><a href="http://docs.google.com/" target="_blank" style="outline: none;"><img src="/pictures/googledocs.gif" alt="googledocs 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a><a href="http://www.gmail.com/" target="_blank" style="outline: none;"><img src="/pictures/gmail.gif" alt="gmail 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a></p>
<p>The best part is that I can access all of my data through all of the aforementioned services (sans PortableApps.com applications) on my Android phone.  This means full access everywhere I go, and I can take advantage of waiting times throughout the day to get stuff done that I don&#8217;t want to have to do while relaxing in the evening.</p>
</li>
<li>
<p><strong>Stop having to remember/fill in passwords online.</strong></p>
<p>These days, you probably have logins online for dozens of different websites, and they&#8217;re probably all set to the same password (sic) or just a few different passwords (not much better).  The security issues of this are a real problem, but lazy is as lazy does.</p>
<p>Still, though, how do you remember which of those few passwords you&#8217;re using for each site?  You&#8217;ll probably end up trying all three, and if you&#8217;re lucky you&#8217;ll get in before the site locks you out for your negligence.</p>
<p><strong>So fix it.  Now.</strong></p>
<p>Use a password manager like <a href="http://www.lastpass.com/" target="_blank">LastPass</a> to automatically log you in to all of your websites.  LastPass is my favorite because it works with all major web browsers, it&#8217;s free, and it&#8217;s really easy and convenient to use.</p>
<p style="text-align: center;"><a href="http://www.lastpass.com/" target="_blank" style="outline: none;"><img src="/pictures/lastpass.png" alt="lastpass 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a></p>
<p>Not only does LastPass allow you to be lazy, but it also secures your online presence.  It generates secure passwords for you (if you let it), so your passwords can all be different and even be crazy complicated (because you never have to type them out).  Did I mention it will automatically sync between all your computers and browsers?  This is one rare product that lets you be lazy and more secure at the same time.  Use it.</p>
</li>
<li>
<p><strong>Never listen to another voicemail ever again.</strong></p>
<p>Voicemails suck because it takes forever to listen to them, especially when they&#8217;re from people who don&#8217;t know how to be concise.  Not to mention horrible voicemail systems that take three years to navigate.</p>
<p>If you&#8217;re like me, your impatience for voicemails and voicemail systems leads to an overflowing voicemail box of three-year-old messages.  And they don&#8217;t do a whole lot of good three years later.  Especially when your voicemail provider automatically deletes them after a month or two.</p>
<p><strong>But is there really a way around it?</strong></p>
<p>Yes, there is.  It&#8217;s called <a href="http://voice.google.com/" target="_blank">Google Voice</a> and it will automatically translate voicemail messages into emails and/or text messages.  This is hyper-productive because all it takes is a quick glance at the email or text message and you&#8217;ll get the point, unlike having to dial in, use the prompts, and then listen to the message.</p>
<p style="text-align: center;"><a href="http://voice.google.com/" target="_blank" style="outline: none;"><img src="/pictures/googlevoice.gif" alt="googlevoice 5 Crucial Tips for Being Lazy and Productive at the Same Time"  title="5 Crucial Tips for Being Lazy and Productive at the Same Time" /></a></p>
<p>Unfortunately Google Voice is still invitation-only (meaning you have to get an invitation from Google in order to use it), but that will change very soon.  There are invitations floating around on various forums (I got mine by simply asking someone for one).  To start, though, request an invitation <a href="https://services.google.com/fb/forms/googlevoiceinvite/" target="_blank">here</a> (directly from Google) and then do some web searches to see if you can find one more quickly.  Not having to listen to voicemail messages is far worth the trouble of getting an invite, so don&#8217;t let that stop you.</p>
</li>
</ol>
<p>If any of these tips were new to you, let us know how they&#8217;ve made you more productive (and/or lazy).  Share your own tips, too; we&#8217;re all looking for ways to work less, get more done, and have more fun.<br />
<script type="text/javascript">
(function() {
var s = document.createElement('SCRIPT'), s1 = document.getElementsByTagName('SCRIPT')[0];
s.type = 'text/javascript';
s.async = true;
s.src = 'http://widgets.digg.com/buttons.js';
s1.parentNode.insertBefore(s, s1);
})();
</script></p>
<table border="0" cellspacing="0" cellpadding="0" style="width: 200px;">
<tr>
<td><a class="DiggThisButton DiggMedium"></a></td>
<td>
<script src="http://www.stumbleupon.com/hostedbadge.php?s=5"></script></td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/5-crucial-tips-for-being-lazy-and-productive-at-the-same-time/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery Tools Scrollable &#8211; Stop Scrolling Past the End</title>
		<link>http://www.jasoncarr.com/technology/jquery-tools-scrollable-stop-scrolling-past-the-end</link>
		<comments>http://www.jasoncarr.com/technology/jquery-tools-scrollable-stop-scrolling-past-the-end#comments</comments>
		<pubDate>Mon, 31 Jan 2011 18:45:07 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery Tools]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://www.jasoncarr.com/?p=1156</guid>
		<description><![CDATA[jQuery Tools is an amazing library, and the Scrollable control is extremely useful.  However, it doesn&#8217;t work well by default for situations where you want to display more than one item in your list at a time, and scroll [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://flowplayer.org/tools/index.html" target="_blank">jQuery Tools</a> is an amazing library, and the <a href="http://flowplayer.org/tools/scrollable/index.html" target="_blank">Scrollable</a> control is extremely useful.  However, it doesn&#8217;t work well by default for situations where you want to display more than one item in your list at a time, and scroll through them one by one (instead of five at a time such as in <a href="http://flowplayer.org/tools/demos/scrollable/index.html" target="_blank">this</a> example).  It took a bit of time for me to figure this out, so I thought I&#8217;d share it with everyone.  Credit goes to neogisme and soon7 from <a href="http://flowplayer.org/tools/forum/35/41619" target="_blank">this post</a> for getting me half-way there.<br />
<span id="more-1156"></span><br />
Simply change your Scrollable initiation Javascript to include the following code:</p>
<pre class="brush: jscript; title: ; notranslate">
jQuery(function() {

  // Initialize the Scrollable control
  jQuery(&quot;.scrollable&quot;).scrollable();

  // Get the Scrollable control
  var scrollable = jQuery(&quot;.scrollable&quot;).data(&quot;scrollable&quot;);

  // Set to the number of visible items
  var size = 3;

  // Handle the Scrollable control's onSeek event
  scrollable.onSeek(function(event, index) {

    // Check to see if we're at the end
    if (this.getIndex() &gt;= this.getSize() - size) {

      // Disable the Next link
      jQuery(&quot;a.next&quot;).addClass(&quot;disabled&quot;);

    }

  });

  // Handle the Scrollable control's onBeforeSeek event
  scrollable.onBeforeSeek(function(event, index) {

    // Check to see if we're at the end
    if (this.getIndex() &gt;= this.getSize() - size) {

      // Check to see if we're trying to move forward
      if (index &gt; this.getIndex()) {

        // Cancel navigation
        return false;

      }

    }

  });

});
</pre>
<p>The code simply hooks into the Scrollable control&#8217;s onBeforeSeek event, and stops the control from moving forward if at the end. This will prevent the user from scrolling past the end not only for clicking the forward and backward links, but also for arrow key and mouse wheel input (if mouse wheel support is turned on via the initialization settings for the control).  The previous solutions I found from neogisme and soon7 would scroll past and then scroll back and/or disable the forward and backward links, but they didn&#8217;t properly prevent the user from scrolling past the end for all forms of input.</p>
<p>Here&#8217;s an example of it in action:</p>
<style type="text/css">
#scrollable-example {
	background: #F2F2F2;
	border: 1px solid #AAA;
        margin-top: 20px;
        margin-bottom: 20px;
        height: 75px;
	padding: 20px;
	width: 500px;
}
#scrollable-example .scrollable {
	float: left;
	position:relative;
	overflow:hidden;
	width: 340px;
	height:75px;
}
#scrollable-example .scrollable .items {
	width:20000em;
	position:absolute;
}
#scrollable-example .items div {
	float:left;
	width: 120px;
}
#scrollable-example .prev {
	cursor: pointer;
        float: left;
	outline: none;
	padding-right: 20px;
}
#scrollable-example .next {
        cursor: pointer;
	float: left;
	outline: none;
	padding-left: 20px;
}
#scrollable-example .disabled {
        color: #BBB !important;
        cursor: default !important;
}
</style>
<p><script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script><script src="http://cdn.jquerytools.org/1.2.5/jquery.tools.min.js"></script><script type="text/javascript">
  jQuery(document).ready(function() {
    jQuery(function() {
      jQuery(".scrollable").scrollable();
      var scrollable = jQuery(".scrollable").data("scrollable");
      var size = 3;
      scrollable.onSeek(function() {
        if (this.getIndex() >= this.getSize() - size) {
          jQuery("a.next").addClass("disabled");
        }
      });
      scrollable.onBeforeSeek(function(event, index) {
        if (this.getIndex() >= this.getSize() - size) {
          if (index > this.getIndex()) {
            return false;
          }
        }
      });
    });
  });
</script></p>
<div id="scrollable-example"><a class="prev browse left" onselectstart="return false;" style="-moz-user-select: none;">Previous</a>
<div class="scrollable">
<div class="items">
<div><img src="http://farm1.static.flickr.com/143/321464099_a7cfcb95cf_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="321464099 a7cfcb95cf t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
<div><img src="http://farm4.static.flickr.com/3089/2796719087_c3ee89a730_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="2796719087 c3ee89a730 t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
<div><img src="http://farm1.static.flickr.com/79/244441862_08ec9b6b49_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="244441862 08ec9b6b49 t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
<div><img src="http://farm1.static.flickr.com/28/66523124_b468cf4978_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="66523124 b468cf4978 t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
<div><img src="http://farm1.static.flickr.com/164/399223606_b875ddf797_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="399223606 b875ddf797 t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
<div><img src="http://farm1.static.flickr.com/163/399223609_db47d35b7c_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="399223609 db47d35b7c t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
<div><img src="http://farm1.static.flickr.com/135/321464104_c010dbf34c_t.jpg" title="jQuery Tools Scrollable   Stop Scrolling Past the End" alt="321464104 c010dbf34c t jQuery Tools Scrollable   Stop Scrolling Past the End" /></div>
</div>
</div>
<p><a class="next browse right" onselectstart="return false;" style="-moz-user-select: none;">Next</a>
<div style="clear: both;"></div>
</div>
<p>If you end up using this (or have something useful to add to it), please drop me a line below. :)</p>
<p><strong>Update (March 28th, 2011):</strong></p>
<p><a href="mailto:steverucker@gmail.com">Steve Rucker</a> was kind enough to send this to me as a way to make the solution data-driven and more dynamic.  If you want simplicity, use the above code, but if you&#8217;re looking for it to be more dynamic, dive into Steve&#8217;s code below:</p>
<blockquote><p>Your blog &#8211; jQuery Tools Scrollable &#8211; Stop Scrolling Past the End &#8211; was a huge help!  Your code saved me a lot of time – the client wanted to always show 4 items in the scroller, and this worked perfectly.</p>
<p>However,  I’m working on a large site that’s pulling dynamic info from a database, so I needed to modify the script to allow for an undetermined number of scrollers.</p>
<p>Here’s what I came up with:</p></blockquote>
<pre class="brush: jscript; title: ; notranslate">
$('.scrollableProducts').each(function (i) {  // loop through scrollers
    var thisCarousel = $('.scrollableProducts:eq(' + i + ')');  // var this scroller
    var size = 4;
    var bucketCount = $(thisCarousel).find('.productLineBucket').length; // get number of buckets in this scroller
    var thisNext = $(thisCarousel).parent().find('a.next'); // var this next controller
    if (bucketCount &lt; size + 1) { // hide next controller if less than size
        thisNext.addClass('disabled');
    }
    $(thisCarousel).scrollable();
    var scrollable = $(thisCarousel).data(&quot;scrollable&quot;);
    scrollable.onSeek(function () {
        if (this.getIndex() &gt;= this.getSize() - size) {
            thisNext.addClass('disabled');
        }
    });
    scrollable.onBeforeSeek(function (event, index) {
        if (this.getIndex() &gt;= this.getSize() - size) {
            if (index &gt; this.getIndex()) {
                return false;
            }
        }
    });
});
</pre>
<p>Thanks again, Steve!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/jquery-tools-scrollable-stop-scrolling-past-the-end/feed</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>How to Get Unlimited Space Out of Your Dropbox Pro Account</title>
		<link>http://www.jasoncarr.com/technology/how-to-get-unlimited-space-out-of-your-dropbox-pro-account</link>
		<comments>http://www.jasoncarr.com/technology/how-to-get-unlimited-space-out-of-your-dropbox-pro-account#comments</comments>
		<pubDate>Tue, 24 Aug 2010 20:10:25 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[Dropbox]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=907</guid>
		<description><![CDATA[If you&#8217;ve never heard of or used Dropbox, you owe it to yourself to give it a shot.  And if you&#8217;re not backing up your important files on a regular basis, you&#8217;re really begging for trouble.
Everyone is in need [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve never heard of or used Dropbox, you owe it to yourself to give it a shot.  And if you&#8217;re not backing up your important files on a regular basis, you&#8217;re really begging for trouble.</p>
<p><a href="http://dropbox.com" target="_blank"><img src="/pictures/dropbox.png" alt="dropbox How to Get Unlimited Space Out of Your Dropbox Pro Account" style="border: 0; float: right; padding: 0; margin: 5px 0 0 15px;" title="How to Get Unlimited Space Out of Your Dropbox Pro Account" /></a>Everyone is in need of a good backup, and Dropbox fits the bill very well for most users.  In addition, it provides excellent syncing functionality to keep your data up to date between all of the computers that you use.  It&#8217;s free for the first 2 GB, and above that you can pay for either 50 or 100 GB of space.  We&#8217;ll be addressing Dropbox Pro accounts (50 or 100 GB accounts) in this article.</p>
<p>In my experience, Dropbox is the most easy to use, mature, and trustworthy service available for online backup and syncing.  It does have one caveat, however: the most space you can use is 100 GB (at least for the moment).  You can&#8217;t even pay for more in a single account.  Granted, 100 GB is a lot of space (especially to back up online), but if you&#8217;re like me, you have more than 100 GB of precious home movies of your little ones.</p>
<p>So what do you do?  Find out after the break&#8230;<br />
<span id="more-907"></span><br />
Here&#8217;s what I&#8217;ve figured out.  It&#8217;s a hack but it&#8217;s well worth it; it&#8217;s working great for me.  Dropbox allows you to pay a small monthly fee ($3.99 at the time this article was written) in addition to your standard fee, to enable an extra service they call &#8220;Packrat&#8221;.  Packrat allows you to keep all of your deleted files, as well as all of the previous revisions of all of your files, for all time.  This means that when you delete a file from your Dropbox folder it will still remain on the Dropbox servers, and you can go back and restore the file later, if necessary.  Dropbox intends this feature to be used for backup purposes (in case files are accidentally deleted, etc.).</p>
<p>This incredible feature is easy to use for more than just-in-case scenarios, however.  Due to Dropbox&#8217;s unlimited history for deleted files (when using Packrat), you can upload a batch of files, delete them, upload a new batch of files, delete them, and repeat this process until you&#8217;ve uploaded every file in your collection.  This isn&#8217;t great for syncing because it won&#8217;t let you sync more than 100 GB at a time between computers, but it is great for backing up that 200 GB home video collection.</p>
<p>Say you have 200 GB of home videos in a folder on your hard disk.  This is how you would proceed:</p>
<ol>
<li>Create a folder in your Dropbox folder for the videos that you would like to upload (we&#8217;ll call it &#8220;Videos&#8221;).</li>
<li>Move some of the videos in your collection into your new Dropbox Videos folder.  Make sure you don&#8217;t move too much to fit in your Dropbox account.</li>
<li>Wait for these new files to upload to Dropbox (which obviously may take a very long time).</li>
<li>Once the files are uploaded, move the video files back to the previous folder they were in, outside of the Dropbox folder.  Dropbox will interpret these files as being deleted, but you&#8217;ll still be able to retrieve them via deleted files in your Dropbox account.</li>
<li>Move a new batch of video files into your Dropbox Videos folder, wait for the files to upload, and repeat the process until all of your files have been uploaded.</li>
</ol>
<p>Once you have all of your files uploaded (or at any point in the middle of the process), you can go to Dropbox&#8217;s website and see your deleted files.  Just click the &#8220;Show Deleted Files&#8221; option on the toolbar (or under More Actions), and you can restore or download your deleted files.  The point is that all your files, whether they total more than 100 GB or not, are still backed up on Dropbox&#8217;s servers.  In the event that your hard drive crashes, it may be a slight nuisance, but you&#8217;ll still be able to fairly easily get your files back from Dropbox&#8217;s servers.  This way, Dropbox can be used as an unlimited backup service.  The only catch is that you can only retrieve (and keep syncing) 100 GB at a time, so if your account is already full you&#8217;ll have to temporarily delete some other files to retrieve the files you&#8217;re going for.</p>
<p>There are services available that provide unlimited backup space for less money (and that don&#8217;t require a &#8220;hack&#8221; to use), but none of them provide the amazing robustness and syncing functionality that Dropbox has.  Rather than subscribe to two different services (and have two different bills), I&#8217;ve chosen to take this route, and it&#8217;s working well for me.</p>
<p>If this article clued you in to this functionality, drop a comment and let me know how it works for you. :)</p>
<p><strong>Update:</strong> I&#8217;ve been told that using Dropbox&#8217;s Packrat features in this manner is against Dropbox&#8217;s terms of service.  I&#8217;ve yet to hear it officially from Dropbox, but use this strategy at your own risk.  I&#8217;m working on getting Dropbox&#8217;s official commentary on the matter; as of yet they have not responded.</p>
<p><strong>Update #2:</strong>Per Phillip&#8217;s comment below, Dropbox has confirmed that using Packrat in this manner is against their terms of use. Unfortunately for them, however, it is impossible to determine when a user has “correct” or “incorrect” intentions when using the service. For Dropbox’s sake (and for the sake of keeping your account), I would advise against using this method for massive amounts of data. In a pinch, however, I see nothing wrong or dangerous in using Packrat this way, as long as it is done moderately. If Dropbox wants to stop users from using the Packrat service in this manner, they need to better-define what is or is not acceptable usage in measurable ways (instead of in ways they cannot truly confirm).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/how-to-get-unlimited-space-out-of-your-dropbox-pro-account/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>UpSync Version 0.7 Released</title>
		<link>http://www.jasoncarr.com/software/upsync-version-0-7-released</link>
		<comments>http://www.jasoncarr.com/software/upsync-version-0-7-released#comments</comments>
		<pubDate>Mon, 05 Oct 2009 19:44:20 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[UpSync]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=381</guid>
		<description><![CDATA[The new version is here!  As always, it is recommended to upgrade as soon as possible.  Here are the major changes:

Administrator permissions are no longer required to run the application from the Program Files folder; application settings and [...]]]></description>
			<content:encoded><![CDATA[<p>The new version is here!  As always, it is recommended to upgrade as soon as possible.  Here are the major changes:</p>
<ul>
<li>Administrator permissions are no longer required to run the application from the Program Files folder; application settings and logs are now stored in the Windows program data folders.</li>
<li>The application has been tested with and should now work fine with UAC under Windows Vista and Windows 7.</li>
<li>Summary logs have been added to the end of the logging to report count totals for the various operations.</li>
<li>Fixed a bug in the new syncing empty folders functionality that caused a neverending loop when the root of either folder was empty.</li>
<li>Added a &#8220;File Filter&#8221; property to mapped folders to allow the use of wildcards (*.txt) to restrict which files to sync (as requested by Jason Saul).</li>
</ul>
<p>Simply run the setup to upgrade to the latest version.</p>
<p><a href="/software/UpSync-0.7-Setup.zip">Download UpSync 0.7 Setup</a><br />
<a href="/software/UpSync-0.7-Sources.zip">Download UpSync 0.7 Source Code (Visual Studio 2008 required)</a></p>
<p>Remember to share your thoughts and suggestions!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/software/upsync-version-0-7-released/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>UpSync Version 0.6 Released</title>
		<link>http://www.jasoncarr.com/software/upsync-version-0-6-released</link>
		<comments>http://www.jasoncarr.com/software/upsync-version-0-6-released#comments</comments>
		<pubDate>Tue, 01 Sep 2009 16:54:39 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[UpSync]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=325</guid>
		<description><![CDATA[I have a new version of UpSync to put out today!  If you are regularly using the application, it is strongly recommended that you upgrade because the stability of the sync process has been greatly improved.  Here&#8217;s a [...]]]></description>
			<content:encoded><![CDATA[<p>I have a new version of UpSync to put out today!  If you are regularly using the application, it is strongly recommended that you upgrade because the stability of the sync process has been greatly improved.  Here&#8217;s a brief list of some of the more interesting changes:</p>
<ul>
<li>Significantly improved error handling</li>
<li>Delete prompts are now all displayed at once (instead of throughout the process)</li>
<li>A new &#8220;stop prompting and do this for x remaining files&#8221; feature has been added</li>
<li>Code is now <a href="http://code.msdn.microsoft.com/sourceanalysis" target="_blank">StyleCop</a>-compliant (as well as code analysis-compliant)</li>
<li>Empty folders are now synced properly based on their creation date</li>
</ul>
<p>You may simply run the new setup and it will automatically upgrade over whatever old version you have installed.</p>
<p><a href="/software/UpSync-0.6-Setup.zip">Download UpSync 0.6 Setup</a><br />
<a href="/software/UpSync-0.6-Sources.zip">Download UpSync 0.6 Source Code (Visual Studio 2008 required)</a></p>
<p>Please remember to comment and share your thoughts on the application! :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/software/upsync-version-0-6-released/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>5 Often Overlooked Caveats of Managing a Digital Music Collection</title>
		<link>http://www.jasoncarr.com/music/5-often-overlooked-caveats-of-managing-a-digital-music-collection</link>
		<comments>http://www.jasoncarr.com/music/5-often-overlooked-caveats-of-managing-a-digital-music-collection#comments</comments>
		<pubDate>Fri, 14 Aug 2009 16:50:01 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[DRM]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=252</guid>
		<description><![CDATA[If you&#8217;re like me, you slave over your music collection on a regular basis making sure every song is properly tagged, free of any audible flaws, and overall as perfect as possible.  Okay, well, you&#8217;re probably not like me. [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re like me, you slave over your music collection on a regular basis making sure every song is properly tagged, free of any audible flaws, and overall as perfect as possible.  Okay, well, you&#8217;re probably not like me.  But still, having your music skip because you used a crappy ripping application or hiccup between songs because of a non-gapless codec is exceedingly annoying.  Here we&#8217;ll go through five commonly-made mistakes by music enthusiasts when managing their music collection.</p>
<p><span id="more-252"></span></p>
<p><strong>1.  Careless Ripping</strong></p>
<p>In case you&#8217;re not familiar with the lingo, to &#8220;rip&#8221; an audio CD means to extract the music from the CD and save it to your hard drive in the form of WAV files.  These WAV files are simply uncompressed audio data, and they&#8217;ll play back in pretty much any audio or music player application.  Before an application can make a compressed MP3 out of your music, it must first rip the raw audio data from the CD onto your computer.  Most music applications, such as iTunes, will perform all of this behind the scenes for you.  This is nice and convenient, but unfortunately doesn&#8217;t always yield the best results.</p>
<p>You may have previously noticed that when you&#8217;ve used iTunes or another application to try and import a CD that&#8217;s been scratched a bit, the end result is not too pleasing.  You may end up with &#8220;clicks&#8221; or &#8220;ticks&#8221; in your music that are obviously not in the original recording, even when those discs play fine in a CD player.  These artifacts are a result of careless ripping, and you may be pleased to know that you can probably still pull the music off those scratched discs without having to hear those annoying ticks all of the time.</p>
<p>The truth is, though, ticks sometimes even show up when ripping a brand new, scratch-free disc.  They obviously show up more often on scratched discs, but unfortunately you can&#8217;t assume your music will always be ripped safely if your disc isn&#8217;t visibly scratched.  This is because most ripping mechanisms in common music applications such as iTunes focus primarily on speed, and not accuracy.  It&#8217;s convenient for the ripping process to be quick, but doesn&#8217;t do much good if the end result is poor.</p>
<p><a href="http://www.exactaudiocopy.de/" target="_blank"><img src="/pictures/eac.png" alt="eac 5 Often Overlooked Caveats of Managing a Digital Music Collection" style="border: 0; float: right; padding: 0; margin: 5px 0 10px 15px;" title="5 Often Overlooked Caveats of Managing a Digital Music Collection" /></a>There is one ripping application available, however, which does absolutely everything it can to make sure that the music that is being read is accurate.  The application is called <a href="http://www.exactaudiocopy.de/">Exact Audio Copy</a>, or EAC.  Unfortunately, it&#8217;s only for Windows, but very fortunately, it is free.  It will help to ensure your music is accurate in several ways, including using your CD or DVD drive&#8217;s on-board error control mechanisms and even checking your music against an online database to ensure it is correct (a feature called AccurateRip).  EAC will need to customize itself for your machine and may take a bit of learning, but all the resources you need are directly on the website I&#8217;ve linked.  Once you&#8217;ve used EAC, you&#8217;ll never go back to your old application for ripping, as it gives you 100% peace of mind that your music is without flaws, and even lets you resurrect old scratched-up CDs.</p>
<p><strong>2.  Lossless/Lossy Format Confusions</strong></p>
<p>You may have never even heard of &#8220;lossy&#8221; audio compression before, but chances are your entire music collection is using lossy compression.  This isn&#8217;t necessarily a bad thing, but you need to be aware of the repercussions of using <em>lossy</em> compression and the alternative of using <em>lossless</em> audio compression.</p>
<p>When you rip your music directly to WAV from an audio CD, you&#8217;ll notice that the resulting WAV files are rather large, sometimes up to 50 megabytes or larger per track.  It&#8217;s inconvenient to store and transfer such large files over the Internet, so people look to compression techniques to reduce the size of the files so that they are more convenient to use.  There are two different types of this compression: lossless and lossy.  Lossless compression works much like a ZIP file does; it takes the data and does its best to compress it as small as possible, without losing any data.  When you extract a zip file, or play a lossless music file, you get the same exact data that was compressed in the first place.  It is an exact replica of the audio that was on the CD.</p>
<p>Lossy audio compression, however, knows about how our human ears work, and attempts to remove the portions of the audio data that are the least important to our ears perceiving it as still sounding good.  These algorithms are incredibly complicated and have been studied for years; modern lossy compression codecs are so good that most people can&#8217;t tell the difference between a song that&#8217;s been encoded using lossless or lossy compression.  Therefore, in many circumstances, lossy compression is ideal.</p>
<p><a href="http://flac.sourceforge.net/" target="_blank"><img src="/pictures/flac.png" alt="flac 5 Often Overlooked Caveats of Managing a Digital Music Collection" style="border: 0; float: right; padding: 0; margin: 5px 0px 10px 15px;" title="5 Often Overlooked Caveats of Managing a Digital Music Collection" /></a>You&#8217;re no-doubt already familiar with many lossy audio codecs: MP3, AAC (M4A, MP4), and WMA are all lossy audio codecs.  You may have never heard of any lossless audio codecs, though; the most popular and recommended of which is <a href="http://flac.sourceforge.net/" target="_blank">FLAC</a>.</p>
<p>So what are the advantages of using a lossless codec?  Though you may not be able to hear the difference between lossless and lossy, lossless music files are much more flexible for the future.  <em>Often people don&#8217;t realize that every time you re-encode a file from one lossy codec to another, you lose quality.</em>  For example, if you take an MP3 and re-encode it to an M4A file to match the rest of your collection, you&#8217;ll end up with a lower quality file than you had in your original MP3.  This is because of the lossy audio techniques used in the compression, which are meant to only be used once.  If you keep converting your files to different codecs, you may start to hear the loss of quality relatively quickly.  <em>Re-compressing a lossy music file is a no-no; never re-compress a lossy music file to another lossy codec to match the rest of your collection.</em>  Lossless music files do not suffer from this problem, however, and can be re-compressed to any format in the future without any loss of quality, which is the biggest advantage to using a lossless codec.</p>
<p>For most people, though, as long as you&#8217;re aware of what not to try and do with a lossy music file, lossy is the way to go.  This is because you generally don&#8217;t need to re-compress your music these days, and you most often can&#8217;t hear a difference between modern lossy and lossless audio formats.  Lossless is nice to have, but doesn&#8217;t compress near as well as lossy does, so lossless music files are often ridiculously large and difficult to manage (not to mention player support is still fairly limited).</p>
<p><a href="http://foobar2000.org" target="_blank"><img src="/pictures/foobar2000.png" alt="foobar2000 5 Often Overlooked Caveats of Managing a Digital Music Collection" style="border: 0; float: left; padding: 0; margin: 5px 15px 10px 0;" title="5 Often Overlooked Caveats of Managing a Digital Music Collection" /></a>If you want to try and hear the difference between lossless and lossy audio formats, download the <a href="http://foobar2000.org" target="_blank">foobar2000</a> music player and the <a href="http://www.foobar2000.org/components/view/foo_abx" target="_blank">ABX Comparator</a> plugin.  This will guide you through a series of &#8220;double-blind&#8221; listening tests to see if you really can tell the difference.  Trust me, though, you probably can&#8217;t.  Foobar2000 is also very useful and convenient for compressing and tagging music files after ripping them.</p>
<p><strong>3.  Non-Gapless Audio</strong><br />
Chances are you&#8217;ll have some CDs or albums in your collection where two or more tracks are strung together without any silence between them, sometimes with the same instruments playing across the tracks.  If the codec, encoder, and/or player you&#8217;re using are not gapless, you&#8217;ll hear a glitch, or pause in the music between these tracks.  This gets very annoying and breaks the listening experience between tracks.</p>
<p>It wasn&#8217;t until recently that lossy audio codecs supported gapless audio, so it used to be that this was another good reason to use a lossless audio codec.  These days, however, gapless is supported by several lossy formats, so gapless audio is no longer a reason to use a lossless codec.</p>
<p>In order to get gapless playback of your lossy music files, though, you need three things: you need a codec that supports gapless audio, an encoder that creates gapless audio files, and a player that will play these gapless files correctly.  This isn&#8217;t as difficult as it sounds, though you may find that some of your older music files are not gapless and will need re-ripped using more modern tools.</p>
<p><img src="/pictures/nowmp.jpg" alt="nowmp 5 Often Overlooked Caveats of Managing a Digital Music Collection" style="border: 0; float: right; padding: 0; margin: 5px 0 10px 15px;" title="5 Often Overlooked Caveats of Managing a Digital Music Collection" />The easiest way to create gapless files these days is to use iTunes to encode to VBR AAC 256.  These are the default encoding options for the latest versions of iTunes, but make sure you get the latest version as previous versions of iTunes did not encode gaplessly.  There are many other options, but this format is in my opinion the most ideal because of the quality, compatibility, and features (such as gapless playback) available.  Remember, though, to use EAC to rip the files first before using iTunes to encode the files.  These gapless files can then be played gaplessly in iTunes, foobar2000, or Winamp, among other players.  Many players, however, such as Microsoft&#8217;s Windows Media Player, still do not play these gapless files correctly, and will still result in hearing annoying gaps between tracks.  This is a good reason to avoid these players.</p>
<p><strong>4.  Improper Compilation Tagging</strong></p>
<p>You may have noticed previously that sometimes music players don&#8217;t handle compilation albums well, or albums that have a different artist for each track.  Ideally, you want to be able to find your music both by the main artist or topic (such as in a soundtrack) of the album, and by the artist of each individual track.  Modern tags and music players solve this issue with the &#8220;Album Artist&#8221; tag.</p>
<p>For example, if you have a soundtrack album, you would put each separate track&#8217;s artist name in the &#8220;Artist&#8221; tag for the song.  Then, the standard is to put &#8220;Various Artists&#8221; in the &#8220;Album Artist&#8221; tag.  This way, the album will show up in your collection as &#8220;Various Artists &#8211; Name Of Soundtrack Album&#8221;, but will still be searchable by the various artists on the album.  Otherwise, without populating the &#8220;Album Artist&#8221; field, most players will interpret the album as many separate albums, one for each different artist on the CD.  iTunes does work slightly different, though the concept is the same.  They&#8217;ve simply added a &#8220;Collection&#8221; check box to the tag, which specifies that the album is a collection (though you can still use the &#8220;Album Artist&#8221; tag just the same).</p>
<p>Occasionally, you may find an album that has a true album artist, but has subsequent artists for each track.  In this case, the solution is obvious; put the album artist&#8217;s name in the &#8220;Album Artist&#8221; field, and each track&#8217;s separate artist name in the &#8220;Artist&#8221; field.  This works much the same as in the previous, soundtrack scenario.</p>
<p><strong>5.  DRM</strong></p>
<p>Unless you&#8217;ve been living under a rock these past few years, you&#8217;ve probably heard something about DRM related to music.  DRM stands for Digital Rights Management and it&#8217;s a way for the rotten record companies to restrict where and when we can listen to the music we&#8217;ve purchased.  Until recently, everything purchased from the iTunes store was covered in nasty DRM.  Thankfully, DRM has been removed for all future purchases, but you&#8217;ve probably got some still in your collection if you&#8217;ve purchased music from iTunes in the past few years.</p>
<p><a href="http://www.defectivebydesign.org/" target="_blank"><img src="/pictures/drm.png" alt="drm 5 Often Overlooked Caveats of Managing a Digital Music Collection" style="border: 0; float: right; padding: 0; margin: 5px 0px 10px 15px;" title="5 Often Overlooked Caveats of Managing a Digital Music Collection" /></a>Don&#8217;t let DRM bite you when you least expect it.  Do your best to only purchase DRM-free music, and consider your DRM-laden music files not future-proof unless you can somehow strip them of the DRM (yes, in some cases, you can, but it&#8217;s not easy).</p>
<p>It&#8217;s also worth noting that though music purchased from the iTunes store no longer has DRM, it can still be tracked back to you as the person who bought the song, and get you into legal trouble if you share it.  In my opinion, this is reason enough in itself to boycott the iTunes store (though I have to admit I haven&#8217;t been as faithful to this as I&#8217;d like to be).</p>
<p><strong>Whew!</strong></p>
<p>By now, if you&#8217;ve made it this far, you&#8217;re practically a digital music collection master.  Or something like that.  To reiterate, here are the five main points to remember:</p>
<ul>
<li>Do your best to rip audio CDs accurately using EAC.</li>
<li>Don&#8217;t abuse lossy audio formats; never re-encode from one lossy format to another.</li>
<li>When possible (and necessary), be sure to use a gapless codec, encoder, and player.</li>
<li>Tag your compilation albums properly using the &#8220;Album Artist&#8221; tag.</li>
<li>Avoid DRM whenever possible.</li>
</ul>
<p>These tips should help you to obtain a much more consistent and higher quality music library.  If you&#8217;ve gotten this far, surely it&#8217;s worth leaving a comment or two!  Let me know if you disagree with anything in the article or have anything to add.  Comments will always receive a reply. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/music/5-often-overlooked-caveats-of-managing-a-digital-music-collection/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Centering a Message Box on the Active Window in C#</title>
		<link>http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp</link>
		<comments>http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp#comments</comments>
		<pubDate>Fri, 07 Aug 2009 18:34:48 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=238</guid>
		<description><![CDATA[One of the annoying caveats of using the built in .NET message box is that it provides no functionality to center a message box on the currently active window.  Oddly, even when you specify the parent window using the [...]]]></description>
			<content:encoded><![CDATA[<p>One of the annoying caveats of using the built in .NET message box is that it provides no functionality to center a message box on the currently active window.  Oddly, even when you specify the parent window using the proper overloaded version of the Show() method, the window still insists on centering itself on the desktop, instead of on the active window.  This is annoying and confusing to the end user because it breaks the ability to set aside particular &#8220;screen real estate&#8221; for an application.  Fortunately, there is a way to fix this, although it does involve the Win32 API.</p>
<p><span id="more-238"></span></p>
<p>To get started, create a class in your project called MessageBoxHelper (or name it whatever you wish).  Replace the code in the file with the following code:</p>
<pre class="brush: csharp; title: ; notranslate">

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

internal static class MessageBoxHelper
{
    internal static void PrepToCenterMessageBoxOnForm(Form form)
    {
        MessageBoxCenterHelper helper = new MessageBoxCenterHelper();
        helper.Prep(form);
    }

    private class MessageBoxCenterHelper
    {
        private int messageHook;
        private IntPtr parentFormHandle;

        public void Prep(Form form)
        {
            NativeMethods.CenterMessageCallBackDelegate callBackDelegate = new NativeMethods.CenterMessageCallBackDelegate(CenterMessageCallBack);
            GCHandle.Alloc(callBackDelegate);

            parentFormHandle = form.Handle;
            messageHook = NativeMethods.SetWindowsHookEx(5, callBackDelegate, new IntPtr(NativeMethods.GetWindowLong(parentFormHandle, -6)), NativeMethods.GetCurrentThreadId()).ToInt32();
        }

        private int CenterMessageCallBack(int message, int wParam, int lParam)
        {
            NativeMethods.RECT formRect;
            NativeMethods.RECT messageBoxRect;
            int xPos;
            int yPos;

            if (message == 5)
            {
                NativeMethods.GetWindowRect(parentFormHandle, out formRect);
                NativeMethods.GetWindowRect(new IntPtr(wParam), out messageBoxRect);

                xPos = (int)((formRect.Left + (formRect.Right - formRect.Left) / 2) - ((messageBoxRect.Right - messageBoxRect.Left) / 2));
                yPos = (int)((formRect.Top + (formRect.Bottom - formRect.Top) / 2) - ((messageBoxRect.Bottom - messageBoxRect.Top) / 2));

                NativeMethods.SetWindowPos(wParam, 0, xPos, yPos, 0, 0, 0x1 | 0x4 | 0x10);
                NativeMethods.UnhookWindowsHookEx(messageHook);
            }

            return 0;
        }
    }

    private static class NativeMethods
    {
        internal struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }

        internal delegate int CenterMessageCallBackDelegate(int message, int wParam, int lParam);

        [DllImport(&quot;user32.dll&quot;)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool UnhookWindowsHookEx(int hhk);

        [DllImport(&quot;user32.dll&quot;, SetLastError = true)]
        internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);

        [DllImport(&quot;kernel32.dll&quot;)]
        internal static extern int GetCurrentThreadId();

        [DllImport(&quot;user32.dll&quot;, SetLastError = true)]
        internal static extern IntPtr SetWindowsHookEx(int hook, CenterMessageCallBackDelegate callback, IntPtr hMod, int dwThreadId);

        [DllImport(&quot;user32.dll&quot;)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool SetWindowPos(int hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);

        [DllImport(&quot;user32.dll&quot;)]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
    }
}
</pre>
<p>I won&#8217;t go into too much detail describing the above code, because most of it is just Win32 API greek.  The gist of it though is there&#8217;s a parent static class called MessageBoxHelper that contains two subclasses.  The NativeMethods subclass is another static class that simply provides the interfaces into the Win32 API calls.  The MessageBoxCenterHelper subclass is instantiated by the parent class, and performs the actual calls to center the message box.  I&#8217;m not overly familiar with the way callbacks, delegates, and events work when using the Win32 API, so I won&#8217;t attempt to explain the logic behind these methods.</p>
<p><strong>Usage</strong></p>
<p>The above implementation may be fairly involved, but using it is extremely easy.  Simply call the MessageBoxHelper.PrepToCenterMessageBoxOnForm static method before calling your message box:</p>
<pre class="brush: csharp; title: ; notranslate">

using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Click(object sender, EventArgs e)
    {
        MessageBoxHelper.PrepToCenterMessageBoxOnForm(this);
        MessageBox.Show(&quot;Hello!&quot;, &quot;Hello!&quot;, MessageBoxButtons.OK, MessageBoxIcon.None, MessageBoxDefaultButton.Button1, 0);
    }
}
</pre>
<p>It&#8217;s worth noting that this code does pass all Code Analysis rules, so you can be confident you won&#8217;t have to rewrite any of it to make it pass.  I do have one small warning, however; make sure that you <em>always</em> call the PrepToCenterMessageBoxOnForm method <em>immediately</em> before your MessageBox.Show call.  Calls to the PrepToCenterMessageBoxOnForm method that are not met with a MessageBox.Show call can interfere with whatever the next form that pops up happens to be, and can result in odd behavior.  Still, you&#8217;re not likely to want to put the code anywhere else, anyway, and I&#8217;ve used it in many enterprise projects without running into any issues.</p>
<p>Let me know if you appreciate this or have any questions or suggestions in the comments!</p>
<p><strong>Update:</strong> Many thanks to Matt Stan for pointing out in the comments that the class also works well for centering a folder browser dialog window (by simply calling the PrepToCenterMessageBoxOnForm method before calling the ShowDialog method).  It may work for some other dialogs as well, and not just these two.  Apparently, however, it does not work for a file open dialog.  I&#8217;ll be doing a bit of research to see if I can modify the code to support all .NET standard dialogs.  I may or may not be successful.</p>
<p>For now, you can assume that it is safe to use on other dialogs, if it works properly.  It is probably guaranteed beyond a reasonable doubt to work regularly within the same .NET framework version for these other dialogs as well.  Regardless, most likely it will work indefinitely for all future .NET framework versions (unless something is significantly restructured in .NET).  The code simply attempts to get a handle to the upcoming window and center it via an event, so it should work generically for most types of windows, and should be plenty safe.</p>
<p>Thanks, Matt!</p>
<p><strong>Update #2:</strong> I&#8217;ve done some research on the .NET dialogs, relating to the centering mechanism.  As well as message boxes, the ColorDialog, FontDialog, and FolderBrowserDialog dialogs do center properly as well.  However, the OpenFileDialog and the SaveFileDialog dialogs unfortunately do not.  This is because somewhere in the order of events after the new position is given these dialogs automatically center themselves on the screen.  This functionality is somehow different from the other dialogs.  You can observe this happening if you add &#8220;0&#215;40&#8243; (SWP_SHOWWINDOW) to the SetWindowPos method&#8217;s flags.  If you do this, you can see the dialog come up in the correct spot, centered on the form, and then quickly jump to the center of the screen.  Unfortunately, I can&#8217;t seem to get around this.  The only solutions I&#8217;ve seen involve extending the OpenFileDialog and SaveFileDialog controls, which is a completely different direction than this article is taking.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>From My BlackBerry</title>
		<link>http://www.jasoncarr.com/technology/from-my-blackberry</link>
		<comments>http://www.jasoncarr.com/technology/from-my-blackberry#comments</comments>
		<pubDate>Fri, 24 Jul 2009 15:44:10 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[BlackBerry]]></category>
		<category><![CDATA[Family]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=230</guid>
		<description><![CDATA[My wife, baby boy, regretfully the dog, and I are on our way to Michigan for a wedding as I&#8217;m typing this post.  I managed to download the latest beta version of WordPress for BlackBerry, and like I&#8217;ve been [...]]]></description>
			<content:encoded><![CDATA[<p>My wife, baby boy, regretfully the dog, and I are on our way to Michigan for a wedding as I&#8217;m typing this post.  I managed to download the latest beta version of WordPress for BlackBerry, and like I&#8217;ve been with everything else WordPress-related, I&#8217;m extremely pleased with the ease of use and functionality (and that it&#8217;s even possible to update the blog from my handheld without having to deal with trying to do it in a crappy browser).</p>
<p><a href="http://blackberry.wordpress.com"  alt="WordPress for BlackBerry">WordPress for BlackBerry</a> is currently at version 0.9.0.134 in beta, but it sure does seem to be working well enough for me.  Of course, it only has a subset of the full WordPress admin features, but it has pretty much everything you need for what you&#8217;d want to do on the road (full page, post, and comment viewing, adding, editing, and deleting).</p>
<p>It seems there&#8217;s no end to what I can do on my BlackBerry these days.  It sure beats my days with Windows Mobile&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/from-my-blackberry/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>6 Anal-Retentive Ways To Improve Your C# Code</title>
		<link>http://www.jasoncarr.com/technology/6-anal-retentive-ways-to-improve-your-csharp-code</link>
		<comments>http://www.jasoncarr.com/technology/6-anal-retentive-ways-to-improve-your-csharp-code#comments</comments>
		<pubDate>Fri, 17 Jul 2009 21:58:33 +0000</pubDate>
		<dc:creator>Jason Carr</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://jasondavidcarr.com/?p=164</guid>
		<description><![CDATA[Nothing irks me more than to have to dig through garbage code.  Working at a software consulting company, I&#8217;ve seen a whole slew of it.  And I&#8217;ve hurled on my computer monitor enough as a result to give it a [...]]]></description>
			<content:encoded><![CDATA[<p>Nothing irks me more than to have to dig through garbage code.  Working at a software consulting company, I&#8217;ve seen a whole slew of it.  And I&#8217;ve hurled on my computer monitor enough as a result to give it a pretty, brownish-green tint.  Bad code destroys hardware.  And souls.</p>
<p>The single biggest clue that a developer either has no idea what they are doing or simply doesn&#8217;t care about their code is <em>inconsistency</em>.  We all have different preferences and coding styles, but when a developer can&#8217;t pick a particular approach to take they come off as incredibly amateur, and for good reason.  Inconsistent code is difficult to read, and is thus difficult to modify in the future.</p>
<p>The majority (or even the entirety) of the list below revolves around writing consistently styled and consistently performing C# code.  Much of this list is admittedly anal retentive, but all of it is guaranteed to improve the quality and readability of your code.<br />
<span id="more-164"></span><br />
<strong>1.  Use the Code Analysis features in Visual Studio.</strong></p>
<p>The Code Analysis features are anal retentive by nature, as you quickly discover when you begin to use them for the first time.  They are, however, worth their weight in gold; they are the most immediately effective way to improve your C# code.</p>
<p>Each time you build your code, Code Analysis will examine it to be sure that a large and growing list of &#8220;best practices&#8221; are met, and will create warnings in your Error List if they are not.  You cannot call your code &#8220;good&#8221; code unless it passes Visual Studio&#8217;s code analysis with flying colors.  There are exceptions to this rule, but they are few and far between.</p>
<p>Enabling Code Analysis in your C# Visual Studio 2005 or 2008 project depends on whether you&#8217;re working with a Windows or Web application.</p>
<p>For a Windows application, go to your Solution Explorer and double-click the project&#8217;s Properties node.  From here, select the Code Analysis tab on the left hand side.  Check the Enable Code Analysis on Build check box, and you&#8217;re on your way.  You&#8217;ll notice that you can enable and disable any of the various checks individually, but I recommend leaving them all checked unless you&#8217;ve found a warning that you&#8217;re sure you can ignore.  As I&#8217;ve stated previously, the Code Analysis is almost <em>always</em> right.</p>
<p>For a Web application, go to your Solution Explorer and select the root node for your website.  Then go up to the Analyze menu and select Code Analysis Configuration.  From here, check the Enable Code Analysis on Build check box and you&#8217;re on your way.</p>
<p><strong>2.  Use regions consistently and effectively.</strong></p>
<p>Nobody likes digging through a huge code file to find a particular method, and C#&#8217;s regions help to solve this problem.  Here is an example:</p>
<pre class="brush: csharp; title: ; notranslate">

#region Private Variables

private int x;
private int y;

#endregion

#region Public Properties

public int X
{
    get
    {
        return x;
    }
}

public int Y
{
    get
    {
        return y;
    }
}

#endregion
</pre>
<p>In Visual Studio, regions can be collapsed or expanded using the +/- buttons to the left of the region names in the code window.  This helps to make it much easier to find a particular method you are looking for.  There are many ways to organize your code with region statements, but I prefer to separate the code by type of construct (variables, constructors, event handlers, methods, properties, etc.) and access modifier (public, internal, protected, or private).</p>
<p><strong>3.  Handle white space consistently.</strong></p>
<p>C# ignores white space, which means you can put extra spaces and lines pretty much wherever you like.  Or, if you&#8217;re insane, you can jam ten-thousand lines of code into a very angry single line of actual text, separated only by semicolons.</p>
<p>Here are a few things to consider, though:</p>
<ul>
<li>Code with more white space is generally much easier to read.  Less condensed code is easier on the eyes and with screen real estate being as ample as it is these days, there&#8217;s little reason to try and jam your code into as few lines as possible.  For the most part, bigger is better.</li>
<li>Even though code blocks, such as if and while statements, do allow you to omit the curly braces, this generally makes your code harder to read.  The general consensus is to <em>always</em> use curly braces even when there is only one line of code you are executing between them.</li>
<li>Consistency, consistency, consistency.  If you put new lines after you close blocks of code, be sure you do it everywhere.  Don&#8217;t &#8220;feel it out.&#8221;  Come up with your own strategy (preferably similar or the same to most other peoples&#8217; strategies) and stick to it.</li>
</ul>
<p><strong>4.  Always specify your access modifiers and choose them carefully.</strong></p>
<p>C# access modifiers are simply the public, internal, protected, and private keywords that you typically place in front of variables, properties, and methods.  Though these are often overlooked, they provide meaning to the functionality behind your code and help to better define the structure of your code through encapsulation.</p>
<p>Here are some grossly oversimplified definitions and uses for the four modifiers.  These definitions are lacking some detail, but should be plenty of information to handle the vast majority of circumstances:</p>
<p><strong>Private</strong> members are only accessible to the class in which they live.  All variables, properties, methods, etc. that do not need to be accessed outside the immediate class should be marked as private.</p>
<p><strong>Protected</strong> members are accessible to the class in which they live, as well as any classes that derive from (extend) the class.  The protected modifier should be used on variables, properties, methods, etc. that may need to be accessed by classes that may derive from (extend) the current class.</p>
<p><strong>Internal </strong>members are accessible everywhere within the current project, but are inaccessible by other projects that might reference the current project.  In other words, using the internal modifier specifies that only classes within the current EXE or DLL file can access the member.  The internal modifier should be used on all variables, properties, methods, etc. that need to be available to other classes within the project, but should not be available outside the project.</p>
<p><strong>Public </strong>members are accessible everywhere, period.  There are no restrictions to their access.  This particular modifier is often overused, as the internal modifier is overlooked.  The public modifier should only be used for members or classes that are or would possibly be needed outside of the current project.</p>
<p>As far as defining classes, typically only internal or public are used, depending on if they need to be accessible outside the project.  This, however, does not account for nested classes, which can have any of the four access modifiers.  Always specify your access modifiers to avoid confusion as to when and where the class or member can be used.</p>
<p><strong>5.  Learn the ways to properly use exceptions and stick to them.</strong></p>
<p>C# exceptions are extremely powerful and convenient, but when used incorrectly, they can both slow your application down and hinder output to the end user.</p>
<p>There are two basic rules of thumb to using exceptions properly:</p>
<ul>
<li>Never catch an exception when you can check for and prevent the error instead.  A typical scenario is trying to open a file that you&#8217;re not entirely sure really exists.  You can wrap the file open code in a try catch, or you can use File.Exists to determine if the file exists before attempting to open it.  Exceptions in C# are expensive, so you only want an exception to be raised if a true error occurs.  If you can predict that it might happen for a particular reason, you should be able to check to make sure that it won&#8217;t happen before proceeding.  This will help to improve performance significantly.</li>
<li>Also, never catch the root Exception class, or any high-level, broad exception.  If you catch an Exception class, and you incorrectly assume that the user didn&#8217;t fill in a particular field as a result, the user will see your incorrect error message and be unable to see the actual error that occurred.  This is unacceptable.  Instead, research the methods you are calling to determine the particular types of exceptions they raise, and catch these specific exceptions.  This way, if something occurs that you didn&#8217;t expect, the end user will see the detailed error message anyway.  The MSDN documentation does a great job of providing you with all of the details you need regarding every exception that is possible for every single method in the .NET framework.</li>
</ul>
<p><strong>6.  ALWAYS use using statements.</strong></p>
<p>In case you&#8217;re not familiar with the syntax of using statements, here is an example:</p>
<pre class="brush: csharp; title: ; notranslate">

using (StreamWriter writer = new StreamWriter(&quot;C:\\file.txt&quot;))
{
    writer.WriteLine(&quot;Hello!&quot;);
}
</pre>
<p>Using statements can be used wherever you&#8217;re instantiating an object that is IDisposable (can be disposed using the Dispose method).  If you don&#8217;t actively dispose objects that support the IDisposable interface, you&#8217;re asking for all sorts of performance and memory leak trouble.  Here are the advantages of using statements over calling the Dispose method directly:</p>
<ul>
<li>Even if an exception is raised within your using statement block, the runtime will <em>still</em> ensure that the object gets properly disposed.  This is automatic with the using statement and is impossible without it.  Before using statements were added in .NET 2.0, you had to attempt to dispose of your objects within a catch block, which was far from error-prone.  Never take this approach.</li>
<li>Using statements help to visually define the scope of a variable that requires disposing.  You can quickly and easily see the start and end of the lifetime of the variable.  Once you are in the habit of consistently using using statements to dispose of objects you will very rarely (if ever) forget to dispose of an object, because of the block nature of the statement.</li>
<li>Using statements even allow you to return from a method within the statement.  The object is still disposed of properly in this situation.  In other words, if you use a using statement, the object is GUARANTEED to be disposed of despite any and all circumstances.  That&#8217;s a pretty big and valuable promise.</li>
</ul>
<p>There is much more to writing good C# code than these 6 rules, but these are the rules that I see consistently broken that are driving me to an early grave.  Let me know in the comments if you think I&#8217;m missing something important or disagree with any of my statements.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jasoncarr.com/technology/6-anal-retentive-ways-to-improve-your-csharp-code/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

