<?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>Kevin Jensen</title>
	<atom:link href="http://www.kevinjensen.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kevinjensen.com</link>
	<description>Technology Ninja. Loving Father.</description>
	<lastBuildDate>Sat, 05 May 2012 13:47:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>And this is why I hate politics..such a dirty game</title>
		<link>http://www.kevinjensen.com/2012/05/05/and-this-is-why-i-hate-politics-such-a-dirty-game/</link>
		<comments>http://www.kevinjensen.com/2012/05/05/and-this-is-why-i-hate-politics-such-a-dirty-game/#comments</comments>
		<pubDate>Sat, 05 May 2012 13:40:12 +0000</pubDate>
		<dc:creator>kevin</dc:creator>
				<category><![CDATA[Blogroll]]></category>
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.kevinjensen.com/?p=139</guid>
		<description><![CDATA[Minnesota residents hit another roadblock in getting the Minnesota Vikings a new stadium on Friday &#8220;Gov. Mark Dayton&#8217;s veto of a high-priority GOP tax bill Friday drew an angry response from legislative leaders and concerns that the ill will could persist through Monday&#8217;s climactic vote on a Vikings stadium.&#8221; &#8220;He vetoed our highest priority,&#8221; said Ortman said, who also is deputy majority leader. &#8220;I think there will be consequences. I think that he has lost the trust of many of my colleagues in the Legislature.&#8221; So basically because one party didn&#8217;t get their way..everyone is going to pay for it and this stadium deal is at risk. Our forefathers are rolling over in their graves right now.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.kevinjensen.com/wp-content/uploads/2012/05/02legi0505.jpg" rel="wp-prettyPhoto[139]"><img src="http://www.kevinjensen.com/wp-content/uploads/2012/05/02legi0505-300x206.jpg" alt="Mark Dayton and Minnesota Lawmakers playing games" title="Mark Dayton and Minnesota Lawmakers playing games" width="300" height="206" class="alignnone size-medium wp-image-141" /></a></p>
<p>Minnesota residents hit another roadblock in getting the Minnesota Vikings a new stadium on Friday</p>
<p>&#8220;Gov. Mark Dayton&#8217;s veto of a high-priority GOP tax bill Friday drew an angry response from legislative leaders and concerns that the ill will could persist through Monday&#8217;s climactic vote on a Vikings stadium.&#8221; <a href="http://www.startribune.com/politics/statelocal/150251485.html" title="via startribune.com"></a></p>
<p>&#8220;He vetoed our highest priority,&#8221; said Ortman said, who also is deputy majority leader. &#8220;I think there will be consequences. I think that he has lost the trust of many of my colleagues in the Legislature.&#8221;</p>
<p>So basically because one party didn&#8217;t get their way..everyone is going to pay for it and this stadium deal is at risk.  Our forefathers are rolling over in their graves right now.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2012/05/05/and-this-is-why-i-hate-politics-such-a-dirty-game/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript style guides</title>
		<link>http://www.kevinjensen.com/2012/05/04/javascript-style-guides/</link>
		<comments>http://www.kevinjensen.com/2012/05/04/javascript-style-guides/#comments</comments>
		<pubDate>Fri, 04 May 2012 20:21:57 +0000</pubDate>
		<dc:creator>kevin</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[style]]></category>

		<guid isPermaLink="false">http://www.kevinjensen.com/?p=130</guid>
		<description><![CDATA[one of my favorite developers Addy Osmani has published a blog article on Javascript Style guides. I don&#8217;t have a specific guide that I follow but I do have mental guidelines. Here are 6 style guides to reference: Idiomatic.js. This is not only highly recommended and very comprehensive, but is also the style guide we&#8217;ve adopted for several of the projects I&#8217;m involved in. It includes contributions by jQuery core contributor Rick Waldron, jsPerf contributor Mathias Bynens and many other experienced JS devs in the community. Not all developers agree 100% with the practices it advocates, but that&#8217;s the great thing about a forkable style guide &#8211; it&#8217;s easy to adapt to your own needs. jQuery Core Style Guide. Perhaps the most popular style guide modern JS developers are aware of, it is used by the jQuery core team, jQuery UI, QUnit and many other projects. Rick Waldron once again had a hand in this as have Adam Sontag and John Resig, also of jQuery fame. Google JavaScript Style Guide. Written by former Google JavaScript developers such as Robby Walker (Closure Linter), this contains several readability best practices that those from a particularly traditional software engineering background will appreciate. Further comments on it can be found here. Dojo Style Guide Another very comprehensive alternative by the people that brought us the excellent dojo toolkit. Interestingly this guide is based on the structure of the Java programming conventions guide. If you like what you see, you might also appreciate dojo&#8217;s inline documentation sguide, which remains my favorite style of inline commenting in JS. Aloha Editor JavaScript Style Guide This guide comes from the authors of the relatively non-trivial contentEditable-based Aloha Editor. Whilst it recommends the jQuery style guide, it has some useful (minor) additions such as how they suggest styling AMD [...]]]></description>
			<content:encoded><![CDATA[<p>one of my favorite developers <a href="http://www.addyosmani.com" title="Addy Osmani">Addy Osmani</a> has published a blog article on <a href="http://addyosmani.com/blog/javascript-style-guides-and-beautifiers/" title="Javascript Style Guides">Javascript Style guides</a>.</p>
<p>I don&#8217;t have a specific guide that I follow but I do have mental guidelines.</p>
<p>Here are 6 style guides to reference:</p>
<ol>
<li>
<p><a href="https://github.com/rwldrn/idiomatic.js/">Idiomatic.js</a>. This is not only highly recommended and very comprehensive, but is also the style guide we&#8217;ve adopted for several of the projects I&#8217;m involved in. It includes contributions by jQuery core contributor Rick Waldron, jsPerf contributor Mathias Bynens and many other experienced JS devs in the community. Not all developers agree 100% with the practices it advocates, but that&#8217;s the great thing about a forkable style guide &ndash; it&#8217;s easy to adapt to your own needs.</p>
</li>
<li>
<p><a href="http://docs.jquery.com/JQuery_Core_Style_Guidelines">jQuery Core Style Guide</a>. Perhaps the most popular style guide modern JS developers are aware of, it is used by the jQuery core team, jQuery UI, QUnit and many other projects. Rick Waldron once again had a hand in this as have Adam Sontag and John Resig, also of jQuery fame.</p>
</li>
<li>
<p><a href="http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml">Google JavaScript Style Guide</a>. Written by former Google JavaScript developers such as Robby Walker (Closure Linter), this contains several readability best practices that those from a particularly traditional software engineering background will appreciate. Further comments on it can be found <a href="http://blog.founddrama.net/2010/08/annotated-google-javascript-style-guide/">here</a>.</p>
</li>
<li>
<p><a href="http://dojotoolkit.org/community/styleGuide">Dojo Style Guide</a> Another very comprehensive alternative by the people that brought us the excellent dojo toolkit. Interestingly this guide is based on the structure of the <a href="http://geosoft.no/javastyle.html">Java programming conventions guide</a>. If you like what you see, you might also appreciate dojo&#8217;s <a href="http://dojotoolkit.org/reference-guide/1.7/util/doctools/markup.html">inline documentation</a> sguide, which remains my favorite style of inline commenting in JS.</p>
</li>
<li>
<p><a href="http://aloha-editor.org/guides/style_guide.html">Aloha Editor JavaScript Style Guide</a> This guide comes from the authors of the relatively non-trivial contentEditable-based Aloha Editor. Whilst it recommends the jQuery style guide, it has some useful (minor) additions such as how they suggest styling AMD modules.</p>
</li>
<li>
<p><a href="http://javascript.crockford.com/code.html">Crock&#8217;s Code Conventions For JavaScript</a> Another good guide, although perhaps not as detailed example-wise as others. I feel this has been superseded by Idiomatic.js, but if you strongly disagree with it or the jQuery core style guide, this is a much recommended fallback.</p>
</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2012/05/04/javascript-style-guides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatically send behavior-based campaigns with Performable</title>
		<link>http://feedproxy.google.com/~r/CampaignMonitor/~3/VOt0W7YCuxQ/</link>
		<comments>http://feedproxy.google.com/~r/CampaignMonitor/~3/VOt0W7YCuxQ/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 23:39:32 +0000</pubDate>
		<dc:creator>Ros Hodgekiss</dc:creator>
				<category><![CDATA[Latest News]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[No matter how much pleasure you get from putting together a solid, subscriber-focused email marketing campaign (hah!), there's probably a point where you go, "By golly, I wish I could automate parts of this process." Okay, so email campaigns are never ...]]></description>
			<content:encoded><![CDATA[<p>No matter how much pleasure you get from putting together a solid, subscriber-focused email marketing campaign (hah!), there's probably a point where you go, "By golly, I wish I could automate parts of this process." Okay, so email campaigns are never going to write themselves, but when it comes to lining up emails to send at the most effective time, then both our app and our friends at <a href="http://www.performable.com">Performable Analytics</a> are here to help with triggered campaigns.</p>

<p>Last year, we released <a href="http://help.campaignmonitor.com/topic.aspx?t=171">autoresponders</a> to allow you to send campaigns when an event occurred within your subscriber list. Some of these campaigns were things like follow-up emails immediately after someone joined to your list, or an email offer automatically sent a week before a subscriber's birthday. Now, Performable have taken this one massive step further with <a href="http://www.performable.com/campaign-monitor-offer/?utm_campaign=CMReferral&amp;utm_source=campaignmonitor">Engage</a>, a service which extends the autoresponders in your Campaign Monitor account to schedule campaigns based on <strong>events occurring on your site</strong>. For most of us, it's called "Wow, I just got a reminder email after abandoning my online shopping cart!" For the propeller-heads, it's called <strong>behavioral marketing</strong>.</p>

<p><img src="http://i3.campaignmonitor.com/uploads/images/starting-condition.jpg" alt="Starting condition in Performable Engage" width="510" height="212"></p>

<p>This might all seem pretty fiddly, however the folks at Performable have smoothed out the process of connecting sites to their marketing analytics service, then in turn, connecting Engage to your Campaign Monitor account. For example, lets go back to the earlier shopping cart scenario. Lets say you've got Performable Engage rolling and a basic, 'New subscriber signs up' autoresponder (or two) in your account. You then want to send an email to folks who have signed up as customers, added an item to their online cart, but never completed their purchase. You also want to delay the email being sent by a couple of days and heck, send a follow-up email if additional criteria is met. Here's what this workflow would look like in Performable Engage <i>(click to enlarge)</i>:</p>

<p><a href="http://i3.campaignmonitor.com/uploads/images/flow-full.jpg"><img src="http://i3.campaignmonitor.com/uploads/images/flow-510w.jpg" alt="Flow featuring multiple emails" border="0" width="510" height="621"></a></p>

<p>Wow, that's some pretty clever email marketing right there. Now, imagine extending this to folks who have signed up to receive your cracking latest album of ambient chiptunes, but haven't gone on to download it. Or with Performable's <a href="http://www.zendesk.com/">Zendesk</a> integration, being able to contact people who have lodged a ticket with you, but haven't logged back into their account for your web app. How crazy automated is that?</p>

<p><img src="http://i3.campaignmonitor.com/uploads/images/email-stats.gif" alt="Engage stats" border="0" width="200" height="106" style="float:right;margin:0 0 5px 10px"></p>

<p>Performable Engage is also backed up by solid reports, both from within Performable and your Campaign Monitor account. Engage will tell you how many emails have sent and are scheduled to go (alongside Performable's regular lifecycle marketing metrics) and we'll keep tabs on opens, clicks and more via your autoresponder reports.</p>

<p>Based on this model, you may be well keen to check out our <a href="http://www.campaignmonitor.com/pricing/">monthly pricing</a> - with unlimited autoresponders and campaigns bundled into most plans, it's simply less stress.</p>

<p>Of course, in the words of Master Splinter, <i>with great power comes great responsibility</i>. Just as most folk were sensible enough to not go mad with plain ol' autoresponders, this kind of triggered campaign should be used with a bit of humanity. In short, to gently encourage subscribers to come visit you again, over being, well, annoying.</p>

<p>Finally, the folks at Performable have extended readers like you a 50% discount on their small business plans. To see if its suite of marketing analytics and email automation tools are suitable for your site, <a href="http://www.performable.com/campaign-monitor-offer/?utm_campaign=CMReferral&amp;utm_source=campaignmonitor">trial Performable for free</a> and start scheduling 'em emails.</p><img src="http://feeds.feedburner.com/~r/CampaignMonitor/~4/VOt0W7YCuxQ" height="1" width="1">]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/23/automatically-send-behavior-based-campaigns-with-performable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convention Based Localization With ASP.NET MVC &#8211; Davy Brion&#8217;s Blog</title>
		<link>http://dotnetshoutout.com/Convention-Based-Localization-With-ASPNET-MVC-Davy-Brions-Blog</link>
		<comments>http://dotnetshoutout.com/Convention-Based-Localization-With-ASPNET-MVC-Davy-Brions-Blog#comments</comments>
		<pubDate>Wed, 23 Mar 2011 22:45:35 +0000</pubDate>
		<dc:creator>(author unknown)</dc:creator>
				<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[Localization]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A feature of ASP.NET MVC that i really like is that when you use the LabelFor extension method in a strongly-typed view, the LabelFor implementation will try to retrieve and use metadata for the property you&#39;re creating a label for. For instance:
@...]]></description>
			<content:encoded><![CDATA[<div><div><div style="float:right"><img alt="" src="http://images.shrinktheweb.com/xino.php?stwembed=1&amp;stwinside=1&amp;stwaccesskeyid=de58f1dfc44078e&amp;stwsize=sm&amp;stwurl=http://davybrion.com/blog/2011/03/convention-based-localization-with-asp-net-mvc/"></div><div>A feature of ASP.NET MVC that i really like is that when you use the LabelFor extension method in a strongly-typed view, the LabelFor implementation will try to retrieve and use metadata for the property you&#39;re creating a label for. For instance:
@Html.LabelFor(m =&gt; m.SomeProperty)

This will generate an HTML label for the SomeProperty property of your model. If you need localized views, you can annotate the property in your model like this:
        [Display(ResourceType = typeof(Resources), Name = &quot;Res...</div></div><div style="padding-top:4px"></div></div>]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/23/convention-based-localization-with-asp-net-mvc-davy-brions-blog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projection Screen Basics</title>
		<link>http://feedproxy.google.com/~r/MissingRemote/~3/J7ccwnhIjYU/projection-screen-basics</link>
		<comments>http://feedproxy.google.com/~r/MissingRemote/~3/J7ccwnhIjYU/projection-screen-basics#comments</comments>
		<pubDate>Wed, 23 Mar 2011 18:58:26 +0000</pubDate>
		<dc:creator>Aaron Ledger</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Like Andrew, I also would like to have a projection setup someday. There's simply no replacement for the sheer envelopment that a projector can bring with a 100"+ screen. Unfortunately, my current abode isn't ideal, but I plan to set up a dedicated scr...]]></description>
			<content:encoded><![CDATA[<p>Like Andrew, I also would like to have a projection setup someday. There's simply no replacement for the sheer envelopment that a projector can bring with a 100"+ screen. Unfortunately, my current abode isn't ideal, but I plan to set up a dedicated screening room in my next residence so I like to stay informed on the technology. Following on their <a href="http://www.missingremote.com/news/2011-03-18/hd-guru-explains-projectors">HD projector overview</a>, HD Guru goes over the various projection screens available (and yes, you do need a screen and not just some painted wall).</p><blockquote><p>A few days ago I wrote an article espousing the virtues of front projection. I am an unabashed fan and hopelessly biased towards PJs. But to get the best performance out of a projector, you’re going to need a screen.</p><p>And this is the point where I lose the audience.</p><p>Still with me? Screens may seem boring, and there’s a lot to learn, but if you’re spending any amount of money on a projector you owe it to yourself to get a screen that lets you get the most from your new purchase.</p><p style="text-align:right"><a href="http://hdguru.com/hdtv-projection-screens-the-good-the-bad-and-the-lumpy/4292/">HD Guru</a></p></blockquote><p><iframe src="http://feedads.g.doubleclick.net/~ah/f/55a76g6jn61pu7vqj1rhoifekg/468/60#http://www.missingremote.com/news/2011-03-23/projection-screen-basics" width="100%" height="60" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"></iframe></p><img src="http://feeds.feedburner.com/~r/MissingRemote/~4/J7ccwnhIjYU" height="1" width="1">]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/23/projection-screen-basics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hover on “Everything But”</title>
		<link>http://css-tricks.com/hover-on-everything-but/</link>
		<comments>http://css-tricks.com/hover-on-everything-but/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 13:39:15 +0000</pubDate>
		<dc:creator>Chris Coyier</dc:creator>
				<category><![CDATA[Article]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Adding a hover state to an element is durn easy. Let's use an opacity change as an example:div {
   opacity: 1.0;
}
div:hover {
   opacity: 0.5;
}But what if we want to have that hover state apply to everything but the element actually being hovered ov...]]></description>
			<content:encoded><![CDATA[<p>Adding a hover state to an element is durn easy. Let's use an opacity change as an example:</p><pre rel="CSS"><code>div {
   opacity: 1.0;
}
div:hover {
   opacity: 0.5;
}</code></pre><p>But what if we want to have that hover state apply to <em>everything but</em> the element actually being hovered over? (e.g. other adjacent sibling divs) <span></span></p><p>Let's assume this basic HTML:</p><pre rel="HTML"><code>&lt;section class=&quot;parent&quot;&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;/section&gt;</code></pre><p>We'll apply the current CSS properties to all the children of the parent when the parent is in the hover state.</p><pre rel="CSS"><code>.parent:hover &gt; div {
  opacity: 0.5;
}</code></pre><p>Then when the parent is hovered <strong>and</strong> the individual div is hovered, we bump the opacity back up, giving the final effect we are looking for.</p><pre rel="CSS"><code>.parent:hover &gt; div:hover {
  opacity: 1.0;
}</code></pre><h3>Real World?</h3><p>A similar kind of thing is in the Twitter for Mac app on individual tweets:</p><p><img src="http://cdn.css-tricks.com/wp-content/uploads/2011/03/twitterhover.png" alt="" title="twitterhover" width="570" height="301"></p><h3>Demo</h3><p>This idea can be extended into multiple levels of depth. Here is an example of three "lists." All list items have full opacity in their regular state, but as you roll over the lists, the currently hovered list is slightly more opaque than then others, and the currently hovered list item is fully opaque.</p><p><a href="http://css-tricks.com/examples/HoverEverythingBut/">View Demo</a></p><p>And yes, old you-know-who browsers don't do :hover on anything but anchor links. If it's mission critical, use JavaScript to detect mouseenter events on them and apply/remove class names.</p>]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/23/hover-on-%e2%80%9ceverything-but%e2%80%9d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The wages of sin: Proper and improper usage of abstracting an OR/M</title>
		<link>http://feedproxy.google.com/~r/AyendeRahien/~3/IKUilRGfcZ0/the-wages-of-sin-proper-and-improper-usage-of-abstracting.aspx</link>
		<comments>http://feedproxy.google.com/~r/AyendeRahien/~3/IKUilRGfcZ0/the-wages-of-sin-proper-and-improper-usage-of-abstracting.aspx#comments</comments>
		<pubDate>Tue, 22 Mar 2011 10:00:00 +0000</pubDate>
		<dc:creator>Ayende Rahien</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Originally posted at 3/11/2011This time, this is a review of the Sharp Commerce application. Again, I have stumbled upon the application by pure chance, and I have very little notion about who wrote it.   In this case, I want to focus on the ProductRep...]]></description>
			<content:encoded><![CDATA[<blockquote>Originally posted at 3/11/2011</blockquote><p>This time, this is a review of the <a href="http://github.com/nazjunaid/SharpCommerce">Sharp Commerce</a> application. Again, I have stumbled upon the application by pure chance, and I have very little notion about who wrote it. </p>  <p>In this case, I want to focus on the ProductRepository:</p>  <p><a href="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/The-wages-of-sin-Proper-and-improper-usa_12BA5/image_6.png"><img style="border-right-width:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px" title="image" border="0" alt="image" src="http://ayende.com/Blog/images/ayende_com/Blog/Windows-Live-Writer/The-wages-of-sin-Proper-and-improper-usa_12BA5/image_thumb_2.png" width="639" height="186"></a></p>  <p>In particular, those methods also participate in Useless Abstraction For The Sake Of Abstraction Anti Pattern. Here is how they are implemented:</p>  <blockquote>   <pre><span>public</span> AttributeItem GetAttributeItem(<span>int</span> attributeItemId)
{
    <span>return</span> Session.Get&lt;AttributeItem&gt;(attributeItemId);
}

<span>public</span> Attribute GetAttribute(<span>int</span> attrbuteId)
{
    <span>return</span> Session.Get&lt;Attribute&gt;(attrbuteId);
}

<span>public</span> IEnumerable&lt;Attribute&gt; GetAllAttributes()
{
    <span>return</span> Session.QueryOver&lt;Attribute&gt;()
        .Future&lt;Attribute&gt;();
}

<span>public</span> <span>void</span> SaveOrUpdate(Attribute attribute)
{
    Session.SaveOrUpdate(attribute);
}</pre>
  </blockquote>

<p>And here is how they are called (from ProductService):</p>

<blockquote>
  <pre><span>public</span> AttributeItem GetAttributeItem(<span>int</span> attributeItemId)
{
    <span>return</span> productRepository.GetAttributeItem(attributeItemId);
}

<span>public</span> Attribute GetAttribute(<span>int</span> attrbuteId)
{
    <span>return</span> productRepository.GetAttribute(attrbuteId);
}

<span>public</span> <span>void</span> SaveAttribute(Attribute attribute)
{
    productRepository.SaveOrUpdate(attribute);
}

 <span>public</span> IList&lt;Product&gt; GetProducts()
 {
     <span>return</span> productRepository.GetAll();
 }

 <span>public</span> Product GetProduct(<span>int</span> id)
 {
     <span>return</span> productRepository.Get(id);
 }

 <span>public</span> <span>void</span> SaveOrUpdate(Product product)
 {
     productRepository.SaveOrUpdate(product);
 }

 <span>public</span> <span>void</span> Delete(Product product)
 {
     productRepository.Delete(product);
 }

 <span>public</span> IEnumerable&lt;Attribute&gt; GetAllAttributes()
 {
     <span>return</span> productRepository.GetAllAttributes();
 }</pre>
  </blockquote>

<p>Um… why exactly?</p>

<p>But as I mentioned, this post is also about the <em>proper </em>usage of abstracting the OR/M. A repository was originally conceived as a to abstract away messy data access code into nicer to use code. The product repository have one method that actually do something meaningful, the Search method:</p>

<blockquote>
  <pre><span>public</span> IEnumerable&lt;Product&gt; Search(IProductSearchCriteria searchParameters, <span>out</span> <span>int</span> count)
{
    <span>string</span> query = <span>string</span>.Empty;
    <span>if</span> (searchParameters.CategoryId.HasValue &amp;&amp; searchParameters.CategoryId.Value &gt; 0)
    {
        var categoryIds = (from c <span>in</span> Session.Query&lt;Category&gt;()
                           from a <span>in</span> c.Descendants
                           <span>where</span> c.Id == searchParameters.CategoryId
                           select a.Id).ToList();

        query = <span>"Categories.Id :"</span> + searchParameters.CategoryId;
        <span>foreach</span> (<span>int</span> categoryId <span>in</span> categoryIds)
        {
            query += <span>" OR Categories.Id :"</span> + categoryId;
        }
    }

    <span>if</span> (!<span>string</span>.IsNullOrEmpty(searchParameters.Keywords))
    {
        <span>if</span> (query.Length &gt; 0)
            query += <span>" AND "</span>;

        query += <span>string</span>.Format(<span>"Name :{0} OR Description :{0}"</span>, searchParameters.Keywords);
    }

    <span>if</span> (query.Length &gt; 0)
    {
        query += <span>string</span>.Format(<span>" AND IsLive :{0} AND IsDeleted :{1}"</span>, <span>true</span>, <span>false</span>);

        var countQuery = global::NHibernate.Search.Search.CreateFullTextSession(Session)
            .CreateFullTextQuery&lt;Product&gt;(query);

        var fullTextQuery = global::NHibernate.Search.Search.CreateFullTextSession(Session)
            .CreateFullTextQuery&lt;Product&gt;(query)
            .SetFetchSize(searchParameters.MaxResults)
            .SetFirstResult(searchParameters.PageIndex * searchParameters.MaxResults);

        count = countQuery.ResultSize;

        <span>return</span> fullTextQuery.List&lt;Product&gt;();
    }
    <span>else</span>
    {
        var results = Session.CreateCriteria&lt;Product&gt;()
            .Add(Restrictions.Eq(<span>"IsLive"</span>, <span>true</span>))
            .Add(Restrictions.Eq(<span>"IsDeleted"</span>, <span>false</span>))
            .SetFetchSize(searchParameters.MaxResults)
            .SetFirstResult(searchParameters.PageIndex * searchParameters.MaxResults)
            .Future&lt;Product&gt;();

        count = Session.CreateCriteria&lt;Product&gt;()
            .Add(Restrictions.Eq(<span>"IsLive"</span>, <span>true</span>))
            .Add(Restrictions.Eq(<span>"IsDeleted"</span>, <span>false</span>))
            .SetProjection(Projections.Count(Projections.Id()))
            .FutureValue&lt;<span>int</span>&gt;().Value;

        <span>return</span> results;
    }
}</pre>
  </blockquote>

<p>I would quibble about whatever this is the best way to actually implement this method, but there is little doubt that something like this is messy. I would want to put this in a very distant corner of my code base, but it does provides a useful abstraction. I wouldn’t put it in a repository, though. I would probably put it in a Search Service instead, but that isn’t that important.</p>

<p>What <em>is</em> important is to understand where there is actually a big distinction between code that merely wrap code for the sake of increasing the abstraction level and code that provide some useful abstraction over an operation.</p><img src="http://ayende.com/Blog/aggbug/11708.aspx" width="1" height="1"><img src="http://feeds.feedburner.com/~r/AyendeRahien/~4/IKUilRGfcZ0" height="1" width="1">]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/22/the-wages-of-sin-proper-and-improper-usage-of-abstracting-an-orm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5 Boilerplate MVC 3 Websites with AppHarbor in 3 Easy Steps</title>
		<link>http://blogs.claritycon.com/blog/2011/03/21/html5-boilerplate-mvc-3-websites-with-appharbor-in-3-easy-steps/</link>
		<comments>http://blogs.claritycon.com/blog/2011/03/21/html5-boilerplate-mvc-3-websites-with-appharbor-in-3-easy-steps/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 18:01:20 +0000</pubDate>
		<dc:creator>Jacob Gable</dc:creator>
				<category><![CDATA[.NET 3.0 / 3.5 / Silverlight]]></category>
		<category><![CDATA[appharbor]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[mvc3]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[MVC]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[

Here’s a quick way to get a new .Net MVC 3 site up that incorporates HTML5 Boilerplate patterns and practices.
Step 0: Get Git (If you don’t have it)

Git for Windows is available from the msysgit repository on Google Code; this guide was written...]]></description>
			<content:encoded><![CDATA[<div style="text-align:left" dir="ltr">
<div>
<p>Here’s a quick way to get a new <a href="http://www.asp.net/mvc/mvc3">.Net MVC 3</a> site up that incorporates <a href="http://html5boilerplate.com/">HTML5 Boilerplate</a> patterns and practices.</p>
<div><strong>Step 0: Get Git (If you don’t have it)</strong></div>
<div>
<p>Git for Windows is available from the <a href="http://code.google.com/p/msysgit/downloads/list">msysgit repository on Google Code</a>; this guide was written for the <a href="http://code.google.com/p/msysgit/downloads/detail?name=Git-1.7.4-preview20110204.exe&amp;can=2&amp;q=">1.7.4 preview version</a>.</p>
</div>
<div>
<p>There’s even a <a href="http://www.geekgumbo.com/2010/04/09/installing-git-on-windows/">guide for installing on windows</a> if you need some help.</p>
<p><strong>Step 1:  Create Your AppHarbor Project</strong></p>
</div>
<div>
<p>Go to the <a href="http://appharbor.com/">AppHarbor</a> home page and <a href="https://appharbor.com/account/new">create a new account</a> if you haven’t done so yet.  Then click the <a href="https://appharbor.com/application/new">Create New</a> link on the <a href="https://appharbor.com/application">Applications</a> tab to get started.</p>
</div>
<div>
<div>
<p><img src="http://posterous.com/getfile/files.posterous.com/jacob4u2/iszMTLusvfgZZeuiWDl7WcKhooTrTSWMEvcHeHv6aL7qFHcCa8hP6vVmslAS/NewApp.png" alt="Newapp" width="462" height="331"></p>
</div>
</div>
<div>
<p>Once you’ve got your application created, copy the Repository URL so you can push your source up to your new site.</p>
</div>
<div>
<div>
<p><a href="http://posterous.com/getfile/files.posterous.com/jacob4u2/OyzzwThGP8J7BUFDFo7f4ny9382uzN8bzks6xn7802LPqV0L4QrM9zjyeZbs/GitLink.png"><img src="http://posterous.com/getfile/files.posterous.com/jacob4u2/5QfwkKxuZryJBAsG5PRfRGXOknyHlyuaONSpBSU2NewwCjfX8KEtDYytIL0i/GitLink.png.scaled.500.jpg" alt="Gitlink" width="500" height="238"></a></p>
</div>
</div>
<div><strong>Step 2:  Create Your MotherEffin HTML5 MVC 3 Site Project</strong></div>
<div>
<p>I’ve created a super easy <a title="MotherEffin HTML5 MVC 3 Site Template" href="http://visualstudiogallery.msdn.microsoft.com/2b462e2e-5215-4d07-a4de-4c31c432c12b">HTML5 Boilerplate MVC 3 template</a> project that can deploy to AppHarbor with no modifications.  You can get it from the <a title="MotherEffin HTML5 Site" href="http://visualstudiogallery.msdn.microsoft.com/2b462e2e-5215-4d07-a4de-4c31c432c12b">Visual Studio Extension gallery</a>, or through the new project dialog by clicking the Online Templates tab item on the left and searching for “HTML5?.</p>
</div>
<div>
<div>
<p><a href="http://posterous.com/getfile/files.posterous.com/jacob4u2/NuXZobIDkUrMmgXn3dxGr6aUBzwFNVOI3imKWPnuqMtpDqd5pZdEyvqdIO4f/HTML5ProjectTemplate.png.scaled.1000.jpg"><img src="http://posterous.com/getfile/files.posterous.com/jacob4u2/T8hj9WSNu5wQI5flIIcVoiGJPfgWFkHz4zpWJpA3OMp4g5AIVTveDxGW91vF/HTML5ProjectTemplate.png.scaled.500.jpg" alt="Html5projecttemplate" width="500" height="305"></a></p>
</div>
</div>
<div>Make a note of your project location so we can use the Git Bash shell to push our source.</div>
<div><strong><br>
Step 3: Push it to AppHarbor with Git</strong></div>
<div>
<p>Once you’ve got your project all set up and ready to deploy, navigate to your project’s location, right click on the root directory and select “Git Bash Here”.</p>
</div>
<div>Enter the following commands to initialize your new Git Repository</div>
<div>
<ol style="background-color:transparent;border-color:initial;font-size:16px;margin-bottom:0px;margin-left:30px;margin-right:0px;margin-top:0px;vertical-align:baseline;border-width:0px;padding:0px">
<li><span style="color:#444444;font-family:Calibri, sans-serif;font-size:16px;line-height:19px"> <code style="background-color:transparent;border-color:initial;font-family:Consolas, monospace, sans-serif;font-size:16px;vertical-align:baseline;border-width:0px;padding:0px;margin:0px">git init</code></span><span style="color:#444444"> </span></li>
<li> <code style="background-color:transparent;border-color:initial;font-family:Consolas, monospace, sans-serif;font-size:16px;vertical-align:baseline;border-width:0px;padding:0px;margin:0px">git add .</code></li>
<li> <code style="background-color:transparent;border-color:initial;font-family:Consolas, monospace, sans-serif;font-size:16px;vertical-align:baseline;border-width:0px;padding:0px;margin:0px">git commit -m "initial check in"</code></li>
</ol>
</div>
<div>
<div>
<p>Once you have your files committed locally, you are ready to push up to the AppHarbor Git Repository Url.</p>
<p>Here are examples of the commands to do that:</p>
</div>
</div>
<div>
<ol style="background-color:transparent;border-color:initial;font-size:16px;margin-bottom:0px;margin-left:30px;margin-right:0px;margin-top:0px;vertical-align:baseline;border-width:0px;padding:0px">
<li><span style="color:#444444;font-family:Calibri, sans-serif;font-size:16px;line-height:19px"> <code style="background-color:transparent;border-color:initial;font-family:Consolas, monospace, sans-serif;font-size:16px;vertical-align:baseline;border-width:0px;padding:0px;margin:0px">git remote add appharbor [YourSiteRepositoryUrl]</code></span><span style="color:#444444;font-family:Calibri, sans-serif"> </span></li>
<li> <code style="background-color:transparent;border-color:initial;font-family:Consolas, monospace, sans-serif;font-size:16px;vertical-align:baseline;border-width:0px;padding:0px;margin:0px">git push appharbor master</code></li>
</ol>
</div>
<div>
<p><a href="http://posterous.com/getfile/files.posterous.com/jacob4u2/qBv6ACwkViNg5kwY4SAqUX4tKeStY7FvmtctUiNMKBlMXezKzaAzMKsWl5Vp/GitBashHere.png"><img src="http://posterous.com/getfile/files.posterous.com/jacob4u2/Ch4rud6Q2A7S8CXfoBobEBB04fcTlOsVrSdjjMsipXmmvrqDFdpzQm0NXoWZ/GitBashHere.png.scaled.500.jpg" alt="Gitbashhere" width="500" height="251"></a></p>
</div>
<div><a href="http://posterous.com/getfile/files.posterous.com/jacob4u2/L76CgcgShdVhV6kNKpCly6vR0OdHfGZ9NEFdJ1jeTbfOV0luSiAxfLfS2M9J/GitInitApp.png"><img src="http://posterous.com/getfile/files.posterous.com/jacob4u2/F580sIrC9NYLOA0LhvFKs0gqoBOXXJl1WUPvBZFtqEmdeMfslOPirgaAJt9S/GitInitApp.png.scaled.500.jpg" alt="Gitinitapp" width="500" height="294"></a></div>
<div><a href="http://posterous.com/getfile/files.posterous.com/jacob4u2/wsshqiczhak52KshYKQj629s27KGqFy5VvkHgVyxokBX7cbRuPbSJJn7IyB5/GitPushApp.png"><img src="http://posterous.com/getfile/files.posterous.com/jacob4u2/MSjlIObJx6jgJes7lM2E7byrysh7aCOs03Ho7cToH0g5uRUaCZhPGu56XjDb/GitPushApp.png.scaled.500.jpg" alt="Gitpushapp" width="500" height="291"></a></div>
<div><strong>Enjoy Your Site</strong></div>
<div>
<p>Congratulations, you’ve just deployed your first HTML5 website.</p>
</div>
<div>
<p>Now all you have to do is navigate to your app’s url; i.e <a href="http://best-site-evar.apphb.com/">http://best-site-evar.apphb.com</a>.</p>
</div>
<div>
<p>Next step, add a database and add the code first entity framework NuGet package for fast database scaffolding.  Hopefully I’ll get a tutorial up for that soon.</p>
</div>
<div><strong><br>
</strong> <strong>Now Playing</strong> – <a title="her mother, brother, grandmother hate me in that order..." href="http://www.youtube.com/watch?v=pBUxuyYC96o">Kanye West ft. Rihanna – All of the Lights</a></div>
<div></div>
<div>See the original post on <a title="Jacob4u2 Posterous - HTML5 Boilerplate site with MVC 3 and AppHarbor" href="http://jacob4u2.posterous.com/html5-boilerplate-mvc-3-site-with-appharbor-i">my posterous blog</a></div>
</div>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/21/html5-boilerplate-mvc-3-websites-with-appharbor-in-3-easy-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hanselminutes Podcast 257 &#8211; Selenium for Web Automation Testing with Jim Evans</title>
		<link>http://feedproxy.google.com/~r/ScottHanselman/~3/fxpPnBE7CSQ/HanselminutesPodcast257SeleniumForWebAutomationTestingWithJimEvans.aspx</link>
		<comments>http://feedproxy.google.com/~r/ScottHanselman/~3/fxpPnBE7CSQ/HanselminutesPodcast257SeleniumForWebAutomationTestingWithJimEvans.aspx#comments</comments>
		<pubDate>Mon, 21 Mar 2011 17:29:06 +0000</pubDate>
		<dc:creator>Scott Hanselman</dc:creator>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ Scott chats with Jim Evans from the Selenium team about how to get into Web Automation Testing. What's new in Selenium v2? Can you use Selenium with any browser? How does .NET fit into the process? All this and more in this Web Testing Episode.  Downl...]]></description>
			<content:encoded><![CDATA[<div><p><a href="http://seleniumhq.org/"><img style="border-bottom:0px;border-left:0px;margin:0px 0px 0px 10px;display:inline;border-top:0px;border-right:0px" title="image" border="0" alt="image" align="right" src="http://www.hanselman.com/blog/content/binary/WindowsLiveWriter/d5fd2394bd05_92C1/image_3.png" width="199" height="175"></a> Scott chats with Jim Evans from the Selenium team about how to get into Web Automation Testing. What's new in Selenium v2? Can you use Selenium with any browser? How does .NET fit into the process? All this and more in this Web Testing Episode.</p>  <h3><strong>Download: </strong><a href="http://s3.amazonaws.com/hanselminutes/hanselminutes_0257.mp3">MP3 Full Show</a></h3>  <h3>Links:</h3>  <ul>   <li><a title="http://seleniumhq.org/" href="http://seleniumhq.org"><strong>http://seleniumhq.org</strong></a></li>    <ul>     <li><a href="http://seleniumhq.org/about/how.html">How Selenium works</a></li>      <li>Support Matrix: <a href="http://seleniumhq.org/about/platforms.html#browsers">Browsers</a>, <a href="http://seleniumhq.org/about/platforms.html#operating-systems">Operating Systems</a>, <a href="http://seleniumhq.org/about/platforms.html#programming-languages">Programming Languages</a>, <a href="http://seleniumhq.org/about/platforms.html#testing-frameworks">Testing Frameworks</a></li>      <li><a href="http://seleniumhq.org/documentation/screencasts/">Screencasts</a></li>      <li><a href="http://seleniumhq.org/documentation/tutorials">Tutorials / Labs</a></li>      <li><a href="http://release.openqa.org/selenium-core/1.0/reference.html">Selenium API</a></li>   </ul>    <li><a title="http://seleniumexamples.com/" href="http://seleniumexamples.com">http://seleniumexamples.com</a></li> </ul>  <h6><strong></strong></h6>  <p><strong>NOTE: If you want to download our complete archives as a feed - that's all 257 shows, </strong><a href="http://feeds.feedburner.com/HanselminutesCompleteMP3"><strong>subscribe to the Complete MP3 Feed here</strong></a><strong>.</strong></p>  <p><strong>Also, please do take a moment and </strong><a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=117488860"><strong>review the show on iTunes</strong></a><strong>.</strong></p>  <h5><strong>Subscribe: </strong><a href="http://feeds.feedburner.com/Hanselminutes"><img border="0" alt="Subscribe to Hanselminutes" src="http://www.hanselman.com/blog/content/binary/feed_2Dicon_2D16x16.png"></a> or <a href="http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=117488860"><img border="0" alt="Subscribe to my Podcast in iTunes" src="http://www.hanselman.com/blog/themes/zenGarden2/itunes_subscribe.gif"></a> or <a href="javascript:void(0);"><strong>Zune</strong></a></h5>  <p>Do also <a href="http://www.hanselminutes.com/archives.aspx">remember the complete archives</a> are always up and they have <strong><em>PDF Transcripts</em></strong>, a little known feature that show up a few weeks after each show.</p>  <p><a href="http://www.telerik.com/products/aspnet/overview.aspx?gad=CPLKy9kDEghsdEbLXRZ0NBiF1bL_AyCCkdsU"><strong>Telerik</strong></a> is our sponsor for this show.</p>  <p><a href="http://www.telerik.com/products/aspnet/overview.aspx?gad=CPLKy9kDEghsdEbLXRZ0NBiF1bL_AyCCkdsU"><strong><img border="0" align="left" src="http://www.hanselman.com/blog/content/binary/WindowsLiveWriter/HanselminutesPodcast51StaticCodeAnalysis_140AB/telerikLogo%5B1%5D%5B8%5D.gif" width="216" height="74"></strong></a><strong>Building quality software is never easy. It requires skills and imagination. We cannot promise to improve your skills, but when it comes to User Interface and developer tools, we can provide the building blocks to take your application a step closer to your imagination. Explore the leading UI suites for </strong><a href="http://asp.net/"><strong>ASP.NET</strong></a><strong> AJAX, </strong><a href="http://www.telerik.com/products/aspnet-mvc.aspx"><strong>MVC</strong></a><strong>, </strong><a href="http://www.telerik.com/products/silverlight.aspx"><strong>Silverlight</strong></a><strong>, </strong><a href="http://www.telerik.com/products/winforms.aspx"><strong>Windows Forms</strong></a><strong> and </strong><a href="http://www.telerik.com/products/wpf.aspx"><strong>WPF</strong></a><strong>. Enjoy developer tools like </strong><a href="http://www.telerik.com/products/reporting.aspx"><strong>.NET Reporting</strong></a><strong>,</strong><a href="http://www.telerik.com/products/orm.aspx"><strong>ORM</strong></a><strong>,</strong><a href="http://www.telerik.com/automated-testing-tools.aspx"><strong>Automated Testing Tools</strong></a><strong>, </strong><a href="http://www.telerik.com/team-productivity-tools/teampulse.aspx"><strong>Agile Project Management Tools</strong></a><strong>, and </strong><a href="http://www.sitefinity.com/"><strong>Content Management Solution</strong></a><strong>. And now you can increase your productivity with </strong><a href="http://www.telerik.com/products/justcode.aspx"><strong>JustCode</strong></a><strong>, Telerik’s new productivity tool for code analysis and refactoring. Visit </strong><a href="http://www.telerik.com/"><strong>www.telerik.com</strong></a><strong>.</strong></p>  <p><strong><em></em></strong>As I've said before this show comes to you with the audio expertise and stewardship of <a href="http://weblogs.asp.net/cfranklin/archive/2006/01/11/435036.aspx">Carl Franklin</a>. The name comes from <a href="http://www.paraesthesia.com/blog/comments.php?id=776_0_1_0_C">Travis Illig</a>, but the goal of the show is simple. Avoid wasting the listener's time. (and make the commute less boring)</p>  <p>Enjoy. Who knows what'll happen in the next show?</p><br><hr>© 2011 Scott Hanselman. All rights reserved. <br></div><p><iframe src="http://feedads.g.doubleclick.net/~ah/f/abrdk7uet7v0ksr8p75hfrs71g/300/250?ca=1&amp;fh=280#http://www.hanselman.com/blog/HanselminutesPodcast257SeleniumForWebAutomationTestingWithJimEvans.aspx" width="100%" height="280" frameborder="0" scrolling="no" marginwidth="0" marginheight="0"></iframe></p><div>
<a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=fxpPnBE7CSQ:M42jAgspMzI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=fxpPnBE7CSQ:M42jAgspMzI:D7DqB2pKExk" border="0"></a> <a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=fxpPnBE7CSQ:M42jAgspMzI:MjquXQBfoPI"><img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=MjquXQBfoPI" border="0"></a> <a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=fxpPnBE7CSQ:M42jAgspMzI:V_sGLiPBpWU"><img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=fxpPnBE7CSQ:M42jAgspMzI:V_sGLiPBpWU" border="0"></a> <a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=fxpPnBE7CSQ:M42jAgspMzI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/ScottHanselman?i=fxpPnBE7CSQ:M42jAgspMzI:F7zBnMyn0Lo" border="0"></a> <a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=fxpPnBE7CSQ:M42jAgspMzI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=yIl2AUoC8zA" border="0"></a> <a href="http://feeds.feedburner.com/~ff/ScottHanselman?a=fxpPnBE7CSQ:M42jAgspMzI:5M_9TJJRyfI"><img src="http://feeds.feedburner.com/~ff/ScottHanselman?d=5M_9TJJRyfI" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/ScottHanselman/~4/fxpPnBE7CSQ" height="1" width="1">]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/21/hanselminutes-podcast-257-selenium-for-web-automation-testing-with-jim-evans/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Product Blog update: Changes to Basecamp email notifications, using Highrise with MailChimp and Formstack, etc.</title>
		<link>http://feedproxy.google.com/~r/37signals/beMH/~3/QigsciYi7LM/2818-product-blog-update-changes-to-basecamp-email-notifications-using-highrise-with-mailchimp-and-formstack-etc</link>
		<comments>http://feedproxy.google.com/~r/37signals/beMH/~3/QigsciYi7LM/2818-product-blog-update-changes-to-basecamp-email-notifications-using-highrise-with-mailchimp-and-formstack-etc#comments</comments>
		<pubDate>Mon, 21 Mar 2011 17:18:00 +0000</pubDate>
		<dc:creator>37signals</dc:creator>
		
		<guid isPermaLink="false"></guid>
		<description><![CDATA[Basecamp 
Tips: Make sure your time stamps show up accurately in Basecamp. You can create an announcement that appears at the top of a project’s Overview page. The announcement can describe the project, give a special heads up, or say anything else y...]]></description>
			<content:encoded><![CDATA[<p><strong>Basecamp</strong> <br>
Tips: <a href="http://productblog.37signals.com/products/2011/03/how-to-change-time-zones-in-basecamp.html">Make sure your time stamps show up accurately</a> in Basecamp. You can create <a href="http://productblog.37signals.com/products/2011/02/tip-set-an-overview-page-announcement-in-basecamp.html">an announcement that appears at the top of a project’s Overview page</a>. The announcement can describe the project, give a special heads up, or say anything else you want people to see. The footers of Basecamp messages now show <a href="http://productblog.37signals.com/products/2011/03/this-comment-was-sent-to-.html">a list of everyone who is receiving the email</a>.  We also changed the way <a href="http://productblog.37signals.com/products/2011/02/changes-to-basecamp-email-notifcations.html">Basecamp email notifications appear in your inbox</a>. Notification subjects will always show the name of the project in brackets at the beginning of the subject line. Maybe you’d like to set up an email filter for messages, like this one in Apple Mail:</p>


	<p><img src="http://s3.amazonaws.com/37assets/svn/6a00d83534b21169e20148c87f6d75970c.png"></p>


	<p>Extras: BugDigger lets you create bug reports at the push of a button — and <a href="http://productblog.37signals.com/products/2011/02/use-bugdigger-to-track-bugs-with-basecamp-to-do-lists.html">it integrates with Basecamp</a>. bcToolkit, a Basecamp reporting tool, <a href="http://productblog.37signals.com/products/2011/02/bctoolkit-basecamp-reporting-tool-announces-update-that-fixes-issues-with-moved-to-do-lists.html">announced an update</a> that fixes issues with moved to-do lists. <a href="http://productblog.37signals.com/products/2011/02/video-bug-recorder-lets-you-record-a-screencast-and-upload-it-directly-to-basecamp.html">Video Bug Recorder for Basecamp</a> is a Windows tool that records video from your screen and uploads it to your Basecamp account with just a few clicks.</p>


	<p>Buzz: Basecamp is <a href="http://productblog.37signals.com/products/2011/02/pc-magazine-basecamp-is-the-simplest-fastest-and-most-scalable-project-management-service-available.html">the Editors’ Choice winner of PC Mag’s “The Best Free Online Project Management Software.”</a> They say, “Basecamp is the simplest, fastest, and most scalable project management service available.” Mark White has an eBook that promises to reduce your workweek from 70 to 40 hours and <a href="http://productblog.37signals.com/products/2011/03/ebook-offers-tips-to-reduce-your-workweek-and-recommends-basecamp.html">advises using Basecamp to avoid phone calls</a>.</p>


	<p>Case studies: Cyber-Duck is a digital agency based in London <a href="http://productblog.37signals.com/products/2011/03/digital-agency-based-in-london-calls-basecamp-a-lifesaver.html">that swears by Basecamp</a>. Matthew Egan, President of <span>SEO</span> firm Image Freedom, wrote to tell us <a href="http://productblog.37signals.com/products/2011/02/seo-firm-uses-basecamp-to-win-clients-and-stay-accountable.html">how his team uses Basecamp</a>. Gregor McKelvie offers tips on <a href="http://productblog.37signals.com/products/2011/02/labsixtyfive-gives-tips-for-small-companies-getting-started-with-basecamp.html">how a small company can get more out of Basecamp</a>.</p>


	<p><strong>Highrise</strong> <br>
Extras: Randall Robinson offers advice on <a href="http://productblog.37signals.com/products/2011/03/using-mailchimp-and-highrise-together-to-create-mailing-lists-and-track-campaigns.html">using MailChimp and Highrise together</a> to create mailing lists and track campaigns. <a href="http://productblog.37signals.com/products/2011/03/use-mumboe-with-highrise-to-keep-track-of-business-agreements-and-contracts.html">Use Mumboe with Highrise</a> to keep track of business agreements and contracts. CompanionLink Express lets you <a href="http://productblog.37signals.com/products/2011/02/companionlink-express-lets-you-sync-highrise-contacts-tasks-and-cases-with-your-phone.html">sync Highrise contacts, tasks, and cases with your phone</a>. Ringio moves your phone system into the cloud and it now <a href="http://productblog.37signals.com/products/2011/02/plug-in-unites-highrise-and-ringio.html">integrates with Highrise</a>. Sage Wedding Pros’ Michelle Loretta wrote about how she loves <a href="http://productblog.37signals.com/products/2011/02/wedding-planners-love-how-formstack-integrates-with-highrise.html">the integration between Formstack and Highrise</a>. The FreshBooks Add-on Store opened up and includes <a href="http://productblog.37signals.com/products/2011/02/freshbooks-add-on-store-launches-with-highrise-on-board.html">a free add-on for Highrise</a>.</p>


	<p>Buzz: <span>A NY</span> Times article discussed people who run a business alone but want it to appear bigger than it really is — as if it has teams of employees and lots of resources. One of the article’s subjects, Peter Sorgenfrei, <a href="http://productblog.37signals.com/products/2011/03/ny-times-profiles-consulting-firm-that-tracks-emails-with-highrise.html">uses Highrise to keep track of his email</a>. Basecamp and Highrise top eCommerce Hacks’ <a href="http://productblog.37signals.com/products/2011/03/basecamp-and-highrise-lead-off-7-indispensable-web-tools-every-ecommerce-merchant-should-be-using.html">“7 Indispensable Web Tools Every Ecommerce Merchant Should Be Using.”</a></p>


	<p><strong>Backpack</strong> <br>
Extra: <a href="http://productblog.37signals.com/products/2011/03/version-20-of-pouch-brings-backpacks-reminders-calendar-and-journal-to-iphone-and-ipad.html">Version 2.0 of Pouch</a> brings Backpack’s Reminders, Calendar, and Journal to the iPhone and iPad.</p>


	<p>Case study: tap tap tap’s John Casasanta creates iPhone apps and he published <a href="http://productblog.37signals.com/products/2011/03/why-iphone-app-developer-tap-tap-tap-thinks-backpack-is-invaluable.html">a list of tools that help the members of his virtual office collaborate</a>: “Out of all the apps and services I use throughout the day, I find myself spending most of my time in Backpack.”</p>


	<p><strong><span>REWORK</span></strong> <br>
Buzz: In the Sioux City Journal, Corey Westra, the commissioner of the Great Plains Athletic Conference, <a href="http://productblog.37signals.com/products/2011/03/collegiate-athletic-conference-commissioner-.html">talks about how he’s found <span>REWORK</span> insightful</a>. <span>REWORK</span> is one of the best business books of all time, <a href="http://productblog.37signals.com/products/2011/03/uk-brand-strategist-rework-is-one-of-the-best-business-books-of-all-time.html">according to UK brand strategist Ben Austin</a>. Scott Buchmann’s <a href="http://productblog.37signals.com/products/2011/02/a-rework-review-that-praises-getting-your-hands-dirty.html"><span>REWORK</span> review</a> praises getting your hands dirty. He wrote, “The world is littered with classes on how to do anything: how to ride a motorcycle, how to paint, how to juggle, how to make money. Fact is, that you will never learn to do any of these things unless you actually go out and do these things.”</p>


	<p><a href="feed://feeds.feedburner.com/typepad/37signals/products">Subscribe to the Product Blog <span><span>RSS</span></span> feed.</a></p><div>
<a href="http://feeds.feedburner.com/~ff/37signals/beMH?a=QigsciYi7LM:_7LFIJoNw0I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/37signals/beMH?d=yIl2AUoC8zA" border="0"></a> <a href="http://feeds.feedburner.com/~ff/37signals/beMH?a=QigsciYi7LM:_7LFIJoNw0I:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/37signals/beMH?d=7Q72WNTAKBA" border="0"></a>
</div><img src="http://feeds.feedburner.com/~r/37signals/beMH/~4/QigsciYi7LM" height="1" width="1">]]></content:encoded>
			<wfw:commentRss>http://www.kevinjensen.com/2011/03/21/product-blog-update-changes-to-basecamp-email-notifications-using-highrise-with-mailchimp-and-formstack-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

