<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

<channel>
	<title>YTechie - C#, ASP.NET, and Adobe Flex Blog</title>
	
	<link>http://www.ytechie.com</link>
	<description>Productive software development using ASP.NET, C#, and Adobe Flex</description>
	<pubDate>Thu, 24 Jul 2008 20:22:57 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/Ytechie" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">1835379</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://www.feedburner.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Ytechie" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FYtechie" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>How to get the best customer service for free</title>
		<link>http://www.ytechie.com/2008/07/how-to-get-the-best-customer-service-for-free.html</link>
		<comments>http://www.ytechie.com/2008/07/how-to-get-the-best-customer-service-for-free.html#comments</comments>
		<pubDate>Thu, 24 Jul 2008 20:22:57 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/how-to-get-the-best-customer-service-for-free.html</guid>
		<description><![CDATA[Today&#8217;s tip is a hack for getting awesome tech support from a company for a product that you may or may not have purchased. It may not be polite, but it may be a method of last resort.
 
We all knows what happens if you buy a product and then call for support. If you&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<p>Today&#8217;s tip is a hack for getting awesome tech support from a company for a product that you may or may not have purchased. It may not be polite, but it may be a method of last resort.</p>
<p align="center"><a href="http://www.ytechie.com/post-images/2008/07/helpful-crowd.jpg" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/post-images/2008/07/helpful-crowd.jpg?referer=');"><img height="180" alt="Helpful-Crowd" src="http://www.ytechie.com/post-images/2008/07/helpful-crowd-thumb.jpg" width="230" border="0" /></a> </p>
<p align="left">We all knows what happens if you buy a product and then call for support. If you&#8217;re lucky, you get put on hold. If you&#8217;re unlucky, you&#8217;ve called outside of their business hours of 1am to 3am. When you do talk to someone, you&#8217;re treated like an idiot (in their defense, it&#8217;s a learned behavior).</p>
<p align="left">If you want great service, call their <strong>sales department</strong>. Tell them you&#8217;re evaluating their product, but ran into an issue. You&#8217;ll be talking to someone that actually wants your business. They&#8217;re typically very helpful, and remind us of the benefit of good customer service.</p>
<p align="left">Just today a coworker <a href="http://www.focalmedia.net/fmsitesearchpro.html" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.focalmedia.net/fmsitesearchpro.html?referer=');">sent me a link</a> (unrelated site) that had a link to a page called &quot;Pre-Sales Questions&quot;. They&#8217;re openly distinguishing between potential customers, and paying customers. The problem is that they make the pre-sales question form easy to use, but the paying customer form is not. Customer service is in a bad state.</p>
<p align="left">My official recommendation is to to fully try out their product during a trial, so that when do you <em>do</em> talk to their sales team, they can at least earn a sale from it. Like I said, this is a method of last resort.</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/344957250" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/how-to-get-the-best-customer-service-for-free.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Programming for someone with blinders</title>
		<link>http://www.ytechie.com/2008/07/programming-for-someone-with-blinders.html</link>
		<comments>http://www.ytechie.com/2008/07/programming-for-someone-with-blinders.html#comments</comments>
		<pubDate>Tue, 22 Jul 2008 12:29:17 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[productivity]]></category>

		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/programming-for-someone-with-blinders.html</guid>
		<description><![CDATA[One of your goals as a developer should be to make your code as readable as possible, both for yourself, and for the other developers you work with.
 
One great way to determine if your code is well written, is to ask yourself if the code you&#8217;re writing is readable by itself. Another developer should [...]]]></description>
			<content:encoded><![CDATA[<p>One of your goals as a developer should be to make your code as readable as possible, both for yourself, and for the other developers you work with.</p>
<p align="center"><a href="http://www.ytechie.com/post-images/2008/07/image9.png" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/post-images/2008/07/image9.png?referer=');"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="189" alt="Horse with Blinders" src="http://www.ytechie.com/post-images/2008/07/image-thumb.png" width="155" border="0" /></a> </p>
<p>One great way to determine if your code is well written, is to ask yourself if the code you&#8217;re writing is readable by itself. Another developer should be able to jump into a module, and have a fairly easy time seeing what&#8217;s going on. They shouldn&#8217;t have to sift through thousands of lines of interweaved code to figure out what&#8217;s going on.</p>
<p>Of course, what I&#8217;m talking about is simply a test for the <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Single_responsibility_principle?referer=');">single responsibility principle</a>. If you&#8217;ve written a huge &quot;do it all&quot; class with thousands of lines of code, you&#8217;re ensuring that you&#8217;re the only one that will be able to maintain it. That that type of code usually suffers from <a href="http://en.wikipedia.org/wiki/Coupling_(computer_science)#Low_coupling" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Coupling_computer_science_Low_coupling?referer=');">high coupling</a> to the other modules in the program.</p>
<p>I used to organize code into classes based on the type of functionality being provided. I used them more as containers for related functionality. At the time, I didn&#8217;t see a reason to split it apart. <em>I was very wrong</em>.</p>
<p>In a recent article by Jimmy Bogard, he walks through <a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/17/separation-of-concerns-by-example-part-5.aspx" onclick="pageTracker._trackPageview('/outgoing/www.lostechies.com/blogs/jimmy_bogard/archive/2008/07/17/separation-of-concerns-by-example-part-5.aspx?referer=');">creating classes with a separation of concerns</a>. In the conclusion is my favorite part:</p>
<blockquote><p>Now we have many more classes (4 vs. 1) and interfaces (3 vs. 0).&#160; For those who don&#8217;t like more classes, GET OVER IT.</p>
</blockquote>
<p>That is an excellent point. Why should you be afraid of creating more classes and interfaces? It&#8217;s really not more code to write, in fact, it&#8217;s often less. Refactoring tools remove many of the obstacles of maintaining the interface, class, and method structure </p>
<p>When someone looks at your code and you have 4 classes instead of 1, and those classes are very specific and short enough to process by our tiny brains, it will be much easier to maintain and modify (or even better, extend).</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/342501463" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/programming-for-someone-with-blinders.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Locking sessions for multi-threaded access</title>
		<link>http://www.ytechie.com/2008/07/locking-sessions-for-multi-threaded-access.html</link>
		<comments>http://www.ytechie.com/2008/07/locking-sessions-for-multi-threaded-access.html#comments</comments>
		<pubDate>Thu, 10 Jul 2008 16:49:48 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[asp.net]]></category>

		<category><![CDATA[c#]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/locking-sessions-for-multi-threaded-access.html</guid>
		<description><![CDATA[I recently ran into a situation where I needed to upload some small files from a Flex client application to an ASP.NET web server. I decided to store the uploaded files in the users session while they were in the checkout process. Once the user confirms their order, the images are read from the session [...]]]></description>
			<content:encoded><![CDATA[<p>I recently ran into a situation where I needed to upload some small files from a Flex client application to an ASP.NET web server. I decided to store the uploaded files in the users session while they were in the checkout process. Once the user confirms their order, the images are read from the session and stored to the database.</p>
<p>Here is the original code from the page that accepts each uploaded file, and adds it to a Dictionary in the collection:</p>
<pre class="c#" name="code">if (Session[SESSION_ORDER_FILES] == null)
{
	//Our dictionary hasn&#8217;t been created, so we do it now
	files = new Dictionary&lt;string, byte[]&gt;();
	Session[SESSION_ORDER_FILES] = files;
}
else
{
	//The dictionary has already been created, just load it
	files = (Dictionary&lt;string , byte[]&gt;) Session[SESSION_ORDER_FILES];
}

//If we have the &quot;_clearPrevious&quot; flag, that means all
//of the files should be removed from this users session
if (_clearPrevious)
	files.Clear();

//If the file name is the same, replace it
if (files.ContainsKey(_fileName))
	files.Remove(_fileName);

files.Add(_fileName, bytes);</pre>
<p>The problem is that we ended up with missing images. The client was sending them, but when the user confirmed their order they were missing images in the session. Since ASP.NET will process page requests in multiple threads, <strong>the session can be accessed in multiple threads</strong>!</p>
<p>Now, we need to find a way to lock them. I questioned whether ASP.NET would give me the same session object each time, or a new instance representing the same session. I whipped up this code in a test page. It saves the previous session reference to the session. I know it&#8217;s a little strange, but since no serialization happens with the session, it gave me a good way to know if the previous session object and the current session object were <strong>the same instance</strong>.</p>
<pre class="c#" name="code">const string SESS_SESS = &quot;test&quot;;
var currSessionObj = Session[SESS_SESS];

if(currSessionObj == null)
	//First page load
	Session[SESS_SESS] = Session;
else
	lblText.Text = (Session[SESS_SESS] == Session).ToString();</pre>
<p>The result of this page was <strong>false</strong>. That means you most certainly do <strong>get a new session instance each time</strong>. Keep in mind that I&#8217;m not saying it&#8217;s a different session, the object you&#8217;re accessing the session with simply changes.</p>
<p><strong>What does this mean?</strong></p>
<p>This means that you have to be careful when there is a chance that you&#8217;re working with session objects in multiple pages, or in a page that could be accessed multiple times simultaneously. Thankfully, there are only a few real-world scenarios where this would be a large concern.</p>
<p>As with any other kind of multi-threaded code, be careful if you&#8217;re checking the session, and then performing an action based on the result. In that case, you&#8217;ll need to lock a global object that is available to all threads that could access that code. Here is an example:</p>
<pre class="c#" name="code">lock(Global.SessionLock)
{
	if(Session[&quot;foo&quot;] == null)
		Session[&quot;foo&quot;] = new Bar();
}</pre>
<p>In your Global class, you&#8217;ll need this field: </p>
<pre class="c#" name="code">static object SessionLock = new object();</pre>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/331879367" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/locking-sessions-for-multi-threaded-access.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Using objects or repository interface in constructor</title>
		<link>http://www.ytechie.com/2008/07/using-objects-or-repository-interface-in-constructor.html</link>
		<comments>http://www.ytechie.com/2008/07/using-objects-or-repository-interface-in-constructor.html#comments</comments>
		<pubDate>Tue, 08 Jul 2008 18:48:33 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[c#]]></category>

		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/using-objects-or-repository-interface-in-constructor.html</guid>
		<description><![CDATA[I&#8217;ve been really trying to use the Single Responsibility Pattern in all of the classes I design. Recently, I needed to create code to query a list of holidays from the database, and then create a method that allows you to get the number of holidays between two given dates.
Here was my first stab at [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been really trying to use the <a href="http://www.ytechie.com/2008/06/agile-patterns-practices-and-the-developer-divide.html" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/2008/06/agile-patterns-practices-and-the-developer-divide.html?referer=');">Single Responsibility Pattern</a> in all of the classes I design. Recently, I needed to create code to query a list of holidays from the database, and then create a method that allows you to get the number of holidays between two given dates.</p>
<p>Here was my first stab at the constructor:</p>
<pre class="c#" name="code">public HolidayCalculator(IEnumerable&lt;DateTime&gt; holidays)</pre>
<p>It&#8217;s simple and easy to understand. Then I started thinking about some of the dependency injected examples I&#8217;ve seen. For example, <a href="http://www.springframework.net/doc-latest/reference/html/quickstarts.html" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.springframework.net/doc-latest/reference/html/quickstarts.html?referer=');">one of the Spring.NET IoC quickstarts</a> has a similar example, except that they&#8217;re trying to list movies. In their example, they use an IMovieFinder interface. That interface has a single method that retrieves a list of movies. Using this concept, my constructor would look like (and what I ultimately changed it to):</p>
<pre class="c#" name="code">public HolidayCalculator(IHolidayRepository holidayRepository)</pre>
<p>That example originally seemed unnecessarily complex to me. Why separate something so simple and disconnected into an interface? Well, it turns out there are a couple of good reasons that you might want to do this.</p>
<p><strong>Delay loading</strong></p>
<p>With my original constructor, I had to load all of the holidays from the repository (ultimately a database in the production environment) to even create an instance of this class. This is certainly less than ideal when I want to use this class as a singleton that may get created early in the application.</p>
<p><strong>Single Responsibility</strong></p>
<p>In my original design, I was accepting in a list that would get cached in my holiday calculator. My class now has two responsibilities. It has to calculate holidays, and it has to cache the holiday list. What if I wanted to change how the list was cached? I would have to change the class, which is not ideal.</p>
<p><a href="http://www.ytechie.com/post-images/2008/07/holiday-calculator-design.gif" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/post-images/2008/07/holiday-calculator-design.gif?referer=');"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="97" alt="Holiday-Calculator-Design" src="http://www.ytechie.com/post-images/2008/07/holiday-calculator-design-thumb.gif" width="361" border="0" /></a></p>
<p>Ideally, this class would load the holiday list each time it needs to perform a calculation. The implementation passed into the constructor would be responsible for caching. In fact, we can now easily separate out the caching feature, and the holiday loading feature. Both classes would implement the IHolidayRepository interface and would be chained together. The caching class would take an IHolidayRepository.</p>
<p><strong>Incremental Coding</strong></p>
<p>Following the Agile philosophy, I can now deliver code faster. I don&#8217;t <em>need</em> to add a caching layer. I can have a working application in less time, and then later evaluate if I need to cache the holiday data.</p>
<p><strong>Conclusion</strong></p>
<p>Overall, this design is a little more work, but I think the benefits outweigh the extra classes and interface I needed to create. This design makes it easy to test, and each class has almost no code in it. Reading it and understanding it is extremely simple.</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/330054578" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/using-objects-or-repository-interface-in-constructor.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>What every manager needs to ask and know</title>
		<link>http://www.ytechie.com/2008/07/what-every-manager-needs-to-ask-and-know.html</link>
		<comments>http://www.ytechie.com/2008/07/what-every-manager-needs-to-ask-and-know.html#comments</comments>
		<pubDate>Thu, 03 Jul 2008 13:57:00 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/what-every-manager-needs-to-ask-and-know.html</guid>
		<description><![CDATA[I&#8217;ve read books about what makes employees happy. If you manage people, I recommend reading the book First, Break all the rules - What the world&#8217;s greatest managers do differently. In that book, they surveyed tends of thousands of the best managers and employees. In their extensive research, they were able to come up with [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve read books about what makes employees happy. If you manage people, I recommend reading the book <a href="http://www.amazon.com/exec/obidos/ASIN/0684852861/ytechie-20" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/exec/obidos/ASIN/0684852861/ytechie-20?referer=');">First, Break all the rules - What the world&#8217;s greatest managers do differently</a>. In that book, they surveyed tends of thousands of the best managers and employees. In their extensive research, they were able to come up with the 12 most important factors that make employees happy, increase productivity, and decrease turn-over.</p>
<p align="center"><a href="http://www.amazon.com/exec/obidos/ASIN/0684852861/ytechie-20" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/exec/obidos/ASIN/0684852861/ytechie-20?referer=');"><img alt="First, break all the files, what the world&#39;s greatest managers do differently" src="http://images.amazon.com/images/P/0684852861.01.MZZZZZZZ.jpg" /></a> </p>
<ol>
<li>Do I know what is expected of me at work? </li>
<li>Do I have the materials and equipment I need to do my work right? </li>
<li>At work, do I have the opportunity to do what I do best every day? </li>
<li>In the last seven days, have I received recognition or praise for good work? </li>
<li>Does my supervisor, or someone at work, seem to care about me as a person? </li>
<li>Is there someone at work who encourages my development? </li>
<li>At work, do my opinions seem to count? </li>
<li>Does the mission/purpose of my company make me feel like my work is important? </li>
<li>Are my co-workers committed to doing quality work? </li>
<li>Do I have a best friend at work? </li>
<li>In the last six months, have I talked with someone about my progress? </li>
<li>At work, have I had the opportunities to learn and grow? </li>
</ol>
<p>A major point of the book is that managers are able to read employees, and treat each of them in a way that makes them happy and productive. That may mean that one person gets 5 monitors, and another gets an <a href="http://www.artlebedev.com/everything/optimus/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.artlebedev.com/everything/optimus/?referer=');">Optimus keyboard</a>. Another employee may have to move into the basement, and give up their red stapler.</p>
<p>My opinion is that <strong>managers work for their employees</strong>. It&#8217;s the managers job to make sure the employees are productive, and to provide the right environment. If they can&#8217;t do that, they shouldn&#8217;t be a manager.</p>
<p>Lately, I&#8217;ve began wondering why managers don&#8217;t ask each employee this simple question:</p>
<p><strong>&quot;What do you need from me?&quot;</strong></p>
<p>If you&#8217;re manager doesn&#8217;t ask this, are they just guessing? In some cases the answers may not be incredibly useful, but in most cases you could learn a lot from the answer. For example, someone might say they need it to be quiet, and another might say they need a lot of background noise. A person might say that they need flexible hours or more desk space.</p>
<p>If you don&#8217;t ask that question, you may never know the answer. If you&#8217;re lucky, you&#8217;ll eventually be able to figure it out, but can you afford to take that chance?</p>
<p>If your manager doesn&#8217;t ask this question, why don&#8217;t you answer it anyway? Even if it doesn&#8217;t help your manager, it will certainly help you understand what you need to accomplish your goals. You may be able to find more creative ways to help your manager understand what you need to get your job done.</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/325807814" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/what-every-manager-needs-to-ask-and-know.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>New Backup Solution - JungleDisk + Amazon S3</title>
		<link>http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html</link>
		<comments>http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html#comments</comments>
		<pubDate>Wed, 02 Jul 2008 15:26:49 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html</guid>
		<description><![CDATA[I&#8217;ve settled on a new backup solution. I&#8217;m going to be using Amazon&#8217;s persistent storage solution called S3. Amazon provides a virtually infinite, scalable storage cloud that allows you to store files indefinitely. You pay a small fee to get the data there ($.10/gig), a fee to store the data ($.15/gig/month), and a fee to [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve settled on a new backup solution. I&#8217;m going to be using <a href="http://www.amazon.com/gp/browse.html?node=16427261" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/gp/browse.html?node=16427261&amp;referer=');">Amazon&#8217;s persistent storage solution called S3</a>. Amazon provides a <strong>virtually infinite, scalable storage</strong> cloud that allows you to store files indefinitely. You pay a small fee to get the data there ($.10/gig), a fee to store the data ($.15/gig/month), and a fee to retrieve the data ($.17/gig).</p>
<p>Features I was looking for:</p>
<ul>
<li>Reasonably Priced</li>
<li>Automatic</li>
<li>Reliable</li>
<li>Scalable</li>
<li>Well performing</li>
<li>Easy</li>
</ul>
<p><strong>Price</strong></p>
<p>To automate my backups, I&#8217;m using a product called <a href="http://www.jungledisk.com/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.jungledisk.com/?referer=');">JungleDisk</a>. You can purchase it for $20, and you get free upgrades for life. I love products that have free upgrades for life, since I don&#8217;t have to worry about <em>when</em> buy it. They also allow you to use it on unlimited computers, which I definitely need.</p>
<p>JungleDisk by default talks directly with S3, so they don&#8217;t need to run any servers. You&#8217;re counting 100% on the reliable storage provided by S3.</p>
<p><strong>Organization</strong></p>
<p>Amazon stores your files in &quot;buckets&quot;, which you can think of as a single level folder/directory structure. JungleDisk can easily connect to multiple buckets at the same time. You configure each bucket independently. JungleDisk can automatically detect all of your buckets, and you can easily create new ones.</p>
<p><img height="309" alt="image" src="http://www.ytechie.com/post-images/2008/07/image1.png" width="209" border="0" /> </p>
<p>I highly recommend creating buckets for each logical group of files you want to back up. Try to avoid sharing a bucket between computers when possible. If you tell JungleDisk that a bucket is only used on one computer, it doesn&#8217;t have to query S3 to determine what needs to be synchronized. The default is set to <strong>multiple computers</strong>. This setting is under the &quot;Bucket Settings&quot; for each bucket.</p>
<p><img height="173" alt="image" src="http://www.ytechie.com/post-images/2008/07/image2.png" width="427" border="0" /> </p>
<p>Each bucket also lets you choose what to back up. Of course there are extensive options for backing up subfolders, excluding files, etc.</p>
<p><img height="125" alt="image" src="http://www.ytechie.com/post-images/2008/07/image3.png" width="479" border="0" /></p>
<p>You can even set up how your local folders get mapped to the remote folders. This lets you do multiple folders in one bucket. On my laptop, I have a couple of folders that get backed up to a single bucket, but are organized into different folders so that I could easily restore them independently.</p>
<p><img height="94" alt="image" src="http://www.ytechie.com/post-images/2008/07/image4.png" width="322" border="0" />&#160; </p>
<p><strong>Scheduling</strong></p>
<p>Setting up a schedule is very easy. For example, on my laptop, I have it set to synchronize my files every hour. It uses the timestamp&#8217;s of the files to determine if there are any new, changed, or deleted files. Since I&#8217;m not sharing this particular bucket between machines, it can <em>instantly</em> determine if anything needs backed up.</p>
<p><img height="111" alt="image" src="http://www.ytechie.com/post-images/2008/07/image5.png" width="199" border="0" /> </p>
<p>&#160;<img height="71" alt="image" src="http://www.ytechie.com/post-images/2008/07/image6.png" width="327" border="0" /> </p>
<p><strong>Security</strong></p>
<p>JungleDisk has all the security options you would expect. You can communicate with Amazon over port 80 unencrypted, or use SSL. I actually turn off the SSL option, because I use the JungleDisk encryption. I don&#8217;t see a reason to do double encryption.</p>
<p><img height="75" alt="image" src="http://www.ytechie.com/post-images/2008/07/image7.png" width="401" border="0" /></p>
<p>When you create the bucket, you can specify a custom key that encrypts your data. I like this option because I am the only one that has access to the data. Even Amazon can&#8217;t tell what I&#8217;m storing on there.</p>
<p><img height="91" alt="image" src="http://www.ytechie.com/post-images/2008/07/image8.png" width="500" border="0" /> </p>
<p><strong>Performance</strong></p>
<p>Since Amazon is providing the storage, they&#8217;re able to scale indefinitely. You can be confident that they can handle whatever you throw at them. They had no problem letting me upload at over 56,000 kbits/sec from my dedicated host. I backed up 4 gigs in about 10 minutes.</p>
<p><img height="322" alt="Fast Upload" src="http://www.ytechie.com/post-images/2008/07/fast-upload.png" width="408" border="0" /> </p>
<p><strong>Other Features</strong></p>
<ul>
<li><strong>Bandwidth limiting</strong> - If you don&#8217;t want to use up all of your upstream or downstream bandwidth, you can limit it, and even schedule when it&#8217;s limited. This could be useful for limiting the connection during the day. However, I much prefer a QoS solution since it will maximize the amount of bandwidth I can use.</li>
<li><strong>Previous versions</strong> - There are extensive options for storing previous versions of changed or deleted files. This option is very impressive, and great for documents.</li>
<li><strong>Network drive</strong> - You can make a bucket show up as a drive on your computer, which allows you to drag and drop files to and from the bucket.</li>
<li><strong>Jungle Disk Plus</strong> - For $1/month extra, you can get JungleDisk Plus. They use an Amazon EC2 server to proxy your data to S3. This allows you to resume large file uploads, and also lets you send just the differences. If you&#8217;re backing up large files and/or files that may have sections change frequently, this could end up saving you money.</li>
</ul>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/324970969" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/new-backup-solution-jungledisk-amazon-s3.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Google officially indexing flash sites - good news?</title>
		<link>http://www.ytechie.com/2008/07/google-officially-indexing-flash-sites-good-news.html</link>
		<comments>http://www.ytechie.com/2008/07/google-officially-indexing-flash-sites-good-news.html#comments</comments>
		<pubDate>Tue, 01 Jul 2008 14:47:40 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[flex]]></category>

		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/07/google-officially-indexing-flash-sites-good-news.html</guid>
		<description><![CDATA[According to the official Google blog, they&#8217;re now officially indexing flash content. According to my SEO expert, they&#8217;ve been doing this for some time. However, I wonder if making this official is a good news.
 
One of the big arguments against heavily using flash on your site was that it certainly wouldn&#8217;t help you in [...]]]></description>
			<content:encoded><![CDATA[<p>According to the official Google blog, they&#8217;re now <a href="http://googleblog.blogspot.com/2008/06/google-learns-to-crawl-flash.html" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/googleblog.blogspot.com/2008/06/google-learns-to-crawl-flash.html?referer=');">officially indexing flash content</a>. According to my SEO expert, they&#8217;ve been doing this for some time. However, I wonder if making this official is a good news.</p>
<p align="center"><img height="151" alt="image" src="http://www.ytechie.com/post-images/2008/07/image.png" width="151" border="0" /> </p>
<p>One of the big arguments against heavily using flash on your site was that it certainly wouldn&#8217;t help you in Google. Now, many will see that argument as being gone. We can now look forward to more annoying flash content, and <em>maybe</em> even some flash that is used correctly.</p>
<blockquote><p>With great power comes great responsibility</p>
<p>-Stan Lee</p>
</blockquote>
<p>If you think you can now cheat and use flash content instead of HTML, you&#8217;re probably wrong. There are many questions that have now been raised (<a href="http://googlewebmastercentral.blogspot.com/2008/06/improved-flash-indexing.html" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/googlewebmastercentral.blogspot.com/2008/06/improved-flash-indexing.html?referer=');">some have been answered</a>):</p>
<ul>
<li>Does each flash file count as a page?</li>
<li>Do links to and from flash content count for PageRank?</li>
<li>Do you really want ALL of the text in your flash files indexed?</li>
<li>Does the SWF get executed in any way, so that the <em>generated</em> text can be indexed?</li>
</ul>
<p>It&#8217;s going to take a while before Google gets good at indexing flash files. It&#8217;s also going to take some time for people to really understand how the process is working. I wouldn&#8217;t be too quick to convert something to flash just because Google can see it now.</p>
<p>Only use flash when it makes sense to your users. For example, <a href="http://www.choiceshirts.com/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.choiceshirts.com/?referer=');">Choice Shirts</a> has an HTML website, but their <a href="http://www.choiceshirts.com/design_your_own/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.choiceshirts.com/design_your_own/?referer=');">shirt designer</a> is flash (<a href="http://www.adobe.com/products/flex/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.adobe.com/products/flex/?referer=');">Flex</a> actually). If their designer doesn&#8217;t get indexed, it&#8217;s not a big deal. The designer is there for usability, not for the search engines.</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/324096504" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/07/google-officially-indexing-flash-sites-good-news.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Consolidating - Subversion virtual machine moved</title>
		<link>http://www.ytechie.com/2008/06/consolidating-subversion-virtual-machine-moved.html</link>
		<comments>http://www.ytechie.com/2008/06/consolidating-subversion-virtual-machine-moved.html#comments</comments>
		<pubDate>Thu, 26 Jun 2008 16:46:55 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[software development]]></category>

		<category><![CDATA[virtualization]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/06/consolidating-subversion-virtual-machine-moved.html</guid>
		<description><![CDATA[As I mentioned before, I&#8217;m trying to consolidate the number of websites that I have to maintain. My young-technologies.com domain was badly out of date, and didn&#8217;t really have any useful information. I decided to redirect all of it&#8217;s pages to this site.
 
The only page that was getting real traffic on that site was [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ytechie.com/2008/05/focus-is-the-key-to-success.html" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/2008/05/focus-is-the-key-to-success.html?referer=');">As I mentioned before</a>, I&#8217;m trying to consolidate the number of websites that I have to maintain. My young-technologies.com domain was badly out of date, and didn&#8217;t really have any useful information. I decided to redirect all of it&#8217;s pages to this site.</p>
<p align="center"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="176" alt="Moving Boxes" src="http://www.ytechie.com/post-images/2008/06/moving-boxes.jpg" width="264" border="0" /> </p>
<p>The only page that was getting real traffic on that site was the <a href="http://www.ytechie.com/svn-vm" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/svn-vm?referer=');">Subversion virtual machine appliance</a>, which I created a long time ago. I decided to move that page to this domain. That means that I have only one page to manage instead of an entire domain.</p>
<p>If you haven&#8217;t seen that virtual appliance, <a href="http://www.ytechie.com/svn-vm" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/svn-vm?referer=');">it&#8217;s worth checking out</a>. It&#8217;s basically a fully functional Subversion install on <a href="http://www.ubuntu.com/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.ubuntu.com/?referer=');">Ubuntu linux</a>, with <a href="http://websvn.tigris.org/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/websvn.tigris.org/?referer=');">WebSVN</a> installed to view it in a web browser. It&#8217;s been downloaded over a thousand times, and it&#8217;s now being hosted using <a href="http://www.amazon.com/gp/browse.html?node=16427261" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.amazon.com/gp/browse.html?node=16427261&amp;referer=');">Amazon&#8217;s S3 service</a>.</p>
<p>While the appliance has <a href="http://www.ytechie.com/svn-vm" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.ytechie.com/svn-vm?referer=');">found a new home</a>, I&#8217;m not sure if an when it&#8217;s going to be updated. If there are any future announcements about it, they&#8217;ll be made on this blog.</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/320652681" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/06/consolidating-subversion-virtual-machine-moved.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Using "var" to simplify code and avoid redundancy</title>
		<link>http://www.ytechie.com/2008/06/using-var-to-simplify-code-and-avoid-redundancy.html</link>
		<comments>http://www.ytechie.com/2008/06/using-var-to-simplify-code-and-avoid-redundancy.html#comments</comments>
		<pubDate>Wed, 25 Jun 2008 15:01:51 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[c#]]></category>

		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/06/using-var-to-simplify-code-and-avoid-redundancy.html</guid>
		<description><![CDATA[You&#8217;ve probably already heard of the new &#34;var&#34; keyword that you can use to declare variables in your .NET code. I wanted to clear up some quick myths and give a quick overview of when it&#8217;s most valuable.
If you haven&#8217;t heard of it, you can now use this syntax:
var c = new Cat();
Instead of this:
Cat [...]]]></description>
			<content:encoded><![CDATA[<p>You&#8217;ve probably already heard of the new &quot;var&quot; keyword that you can use to declare variables in your .NET code. I wanted to clear up some quick myths and give a quick overview of when it&#8217;s most valuable.</p>
<p>If you haven&#8217;t heard of it, you can now use this syntax:</p>
<pre class="c-sharp" name="code">var c = new Cat();</pre>
<p>Instead of this:</p>
<pre class="c-sharp" name="code">Cat c = new Cat();</pre>
<p>As Jeff Atwood mentioned, it&#8217;s a <a href="http://www.codinghorror.com/blog/archives/001136.html" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.codinghorror.com/blog/archives/001136.html?referer=');">great way to avoid redundancy</a>. It&#8217;s obvious that you&#8217;re creating a &quot;Cat&quot; object, why do you have to say it twice?</p>
<p>The most important thing to realize, is that it&#8217;s NOT a var like in JavaScript or other languages (<a href="http://www.hanselman.com/blog/BackToBasicsVarDim.aspx" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.hanselman.com/blog/BackToBasicsVarDim.aspx?referer=');">DIM in VB</a>). It really is 100% a &quot;Cat&quot; object, complete with intellisense. The generated IL would be no different than specifying the type when you declare it. <strong>It&#8217;s simply a compiler trick</strong>.</p>
<p>Another important thing to remember is that you the assignment must be combined with the declaration. If that wasn&#8217;t the case, readability would be very poor.</p>
<pre class="c-sharp" name="code">var myName = &quot;Jason&quot;; //Allowed
var yourName; //Not allowed
yourName = &quot;Bob&quot;; //Glad you can't do this</pre>
<p>What are some really good examples of when it ideally should be used:</p>
<pre class="c-sharp" name="code">List&lt;Dictionary&lt;int, string&gt;&gt; customers = new List&lt;Dictionary&lt;int, string&gt;&gt;(); //Yuck!
var customers = new List&lt;Dictionary&lt;int, string&gt;&gt;(); //Yay!

OrderRepository orderRepo = (OrderRepository)ctx.GetObject(&quot;orderRepository&quot;); //Yuck!
var orderRepo = (OrderRepository)ctx.GetObject(&quot;orderRepository&quot;); //Yay!

string name = &quot;Jason Young&quot;; //Kinda yucky
var name = &quot;Jason Young&quot;; //Kinda better</pre>
<p>As you can see, those examples have obvious redundancy. Using the &quot;var&quot; keyword increases readability, and makes it easier to change if needed.</p>
<p>There are certainly times when its use is questionable. In the following example, I&#8217;m calling a function that returns some data. Since I&#8217;m not explicitly defining the type that is being returned from that function, I have to do some digging to figure out the type being returned. In this case, you&#8217;ll have to define the correct way to handle it in your coding standards.</p>
<pre class="c-sharp" name="code">var data = GetData();</pre>
<p>Another potential readability issue comes up in the following case. You might not want to use the &quot;Circle&quot; specific methods (Circle inherits from Shape).</p>
<pre class="c-sharp" name="code">Shape s = GetCircle(); //I see what you're doing
var s = GetCircle(); //Do you want a shape, or a circle?</pre>
<p>Aside from a couple of decisions that need to be made in your organization, I think this is a great addition, and should make our lives as developers a little bit easier. It&#8217;s just another tool for our toolbelt. With great power comes great responsibility</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/319768399" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/06/using-var-to-simplify-code-and-avoid-redundancy.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Using an army and luck to reach critical mass</title>
		<link>http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html</link>
		<comments>http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html#comments</comments>
		<pubDate>Tue, 24 Jun 2008 13:21:48 +0000</pubDate>
		<dc:creator>superjason</dc:creator>
		
		<category><![CDATA[ecommerce]]></category>

		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html</guid>
		<description><![CDATA[This post is going to explain the importance of your product reaching critical mass. When I say &#34;product&#34;, I mean an actual product your selling, or simply a website or blog. When I&#8217;m talking about critical mass, I&#8217;m describing the point at which your product becomes viral, sometimes known as the network effect. This should [...]]]></description>
			<content:encoded><![CDATA[<p>This post is going to explain the importance of your product reaching critical mass. When I say &quot;product&quot;, I mean an actual product your selling, or simply a website or blog. When I&#8217;m talking about critical mass, I&#8217;m describing the point at which your product becomes viral, sometimes known as the <a href="http://en.wikipedia.org/wiki/Network_effect" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Network_effect?referer=');">network effect</a>. This should be a lesson to anyone thinking of creating their own product or service.</p>
<p><img height="169" alt="image" src="http://www.ytechie.com/post-images/2008/06/image4.png" width="476" border="0" /> </p>
<p>Above, you&#8217;ll see the typical <a href="http://en.wikipedia.org/wiki/Technology_Adoption_LifeCycle" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/en.wikipedia.org/wiki/Technology_Adoption_LifeCycle?referer=');">technology adoption bell curve</a>. What you need to realize is that you&#8217;re starting on the left, and you&#8217;re trying to get up the hill. Do you think it&#8217;s easy? Well, judging by Youtube, twitter, <a href="http://www.milliondollarhomepage.com/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.milliondollarhomepage.com/?referer=');">milliondollarhomepage</a>, Digg, or myspace, it must be easy!</p>
<p>The truth is, you should have a path to success. Here are just a couple of paths that have worked for other products:</p>
<ul>
<li>Create a product that is leaps and bounds better than anything your potential customers have ever seen - An example is Google, which was originally created by students in college. The brilliance of the algorithm and its implementation were the start of a massive company. </li>
<li>Have an army of followers that listen to your advice - A great example is Steve Jobs. Before he even makes a new product announcement, people line up at Apple stores. People trust that he&#8217;ll make cool stuff, so they listen to whatever he says. You can bet that if Steve Jobs mentioned your product, you would people lining up at your door to buy it.</li>
<li>Get lucky - It happens time and time again. Multiple products are released at the same time, all with similar features and price. Sometimes one of them gets lucky, and the others die. An example is the VHS vs Betamax format war. VHS was considered the inferior product, yet it went on to become the de facto standard. </li>
<li>Create a product that is viral by nature - Twitter and Myspace come to mind. Once one person joins, they&#8217;re begging their friends to use if. If they don&#8217;t, the service is useless. The result is that you get an army of free advertisers talk to your key demographic.</li>
<li>Spend a ridiculous amount of cash to bombard users with advertising - infomercial&#8217;s and those annoying &quot;<a href="http://www.poop-freeze.com" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.poop-freeze.com?referer=');">we&#8217;ll double the offer</a>&quot; commercials come to mind.</li>
</ul>
<p>Hopefully I&#8217;m making the situation look difficult. I couldn&#8217;t find any concrete numbers, but you can be sure that more than half of online businesses fail within the first couple of years. That includes well-funded businesses. If you expect to start the next <a href="http://www.fogcreek.com/" rel="nofollow" onclick="pageTracker._trackPageview('/outgoing/www.fogcreek.com/?referer=');">Fog Creek Software</a> while working part time in the evenings, you need to have a plan.</p>
<p>The best advice I can give you is to do whatever it takes to get your product into the hands of as many people as possible. It might mean making partnerships with someone of influence, or it might mean creating a viral marketing campaign. It might also mean that you&#8217;ll have to give your product away for free, build up your army of followers, and then invent another great product. If you already have a product with a good user base, you&#8217;re probably already in good shape. If you are just starting out, don&#8217;t think that people will magically find you, unless you&#8217;re counting on the &quot;lucky&quot; path I described.</p>
<img src="http://feeds.feedburner.com/~r/Ytechie/~4/318885478" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.ytechie.com/2008/06/using-an-army-and-luck-to-reach-critical-mass.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
