<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUAAQnc8fip7ImA9WhRbF0g.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208</id><updated>2012-02-08T21:22:23.976-06:00</updated><category term="Numeric" /><category term="electric" /><category term="Corruption" /><category term="shelf" /><category term="Visual Studio" /><category term="RAID5" /><category term="kball" /><category term="Microsoft" /><category term="monogram" /><category term="Hash" /><category term="adodb" /><category term="MS Access" /><category term="Email" /><category term="SHA1" /><category term="passwords" /><category term="RAID" /><category term="adodb.parameter" /><category term="currie" /><category term="VB.NET" /><category term="Brother-PE" /><category term="Windows" /><category term="embroidery design" /><category term="Checksum" /><category term="NAS" /><category term="Access 97" /><category term="Aperture Laboratories" /><category term="neverwinter nights" /><category term="forum" /><category term="workspace" /><category term="Programming" /><category term="CRC32" /><category term="Gigabit" /><category term="Redundancy" /><category term="Valve" /><category term="SHA2" /><category term="Access" /><category term="NaN" /><category term="bicycle" /><category term="Network adapter" /><category term="Access 2000" /><category term="embird" /><category term="portal" /><category term="Communication" /><category term="Storage" /><category term="MD5" /><category term="Cryptology" /><category term="review" /><category term="sewing" /><category term="bioware" /><category term="x64" /><category term="ADO" /><category term="DAO" /><category term="Windows 7" /><category term="hack" /><category term="ebike electric bicycle" /><category term="Images" /><category term="brother" /><category term="Realtek" /><category term="JET" /><category term="24v" /><category term="motor" /><category term="Invader Zim" /><category term="game" /><category term="font" /><category term="GIR" /><category term="electric bike" /><category term="adodb.command" /><category term="XL-400" /><category term="Adaptec" /><category term="embroidery" /><category term="RAID10" /><category term="DEFAULT database" /><category term="Multi-User" /><category term="sewing machine" /><category term="Garage" /><category term="rainbow table" /><category term="Database" /><category term="se-400" /><category term="RAID6" /><category term="Pictures" /><category term="JavaScript" /><category term="RAID0" /><category term="singer" /><category term="ebike" /><category term="LB6800PRW" /><category term="Access 2002" /><title>Evadman's Random Blog</title><subtitle type="html">Sometimes Witty, Always Informative</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://evadman.blogspot.com/" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/EvadmansRandomBlog" /><feedburner:info uri="evadmansrandomblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEMEQnc7fyp7ImA9WhRXGU8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-5628373280690274198</id><published>2011-12-26T12:00:00.000-06:00</published><updated>2011-12-26T12:00:03.907-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-26T12:00:03.907-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="sewing" /><category scheme="http://www.blogger.com/atom/ns#" term="brother" /><category scheme="http://www.blogger.com/atom/ns#" term="sewing machine" /><title>Update on LB6800PRW Embroidery machine</title><content type="html">Update on LB6800PRW.&lt;br /&gt;
&lt;br /&gt;
Now that I have had this machine for about a year, I can add some more to &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;what I said earlier&lt;/a&gt;. My LB6800PRW is starting to show it's age. I use it all the time, it is just too much fun making stuff! I can't figure out how to check the stitch count, but back of the envelope math on how much stabilizer &amp; thread I have used says I am somewhere between 20 and 30 million, with only a few minor problems along the way.&lt;br /&gt;
&lt;br /&gt;
I do swap out needles often, since they are &lt;a href="http://www.amazon.com/gp/product/B002U0K8H8/ref=oh_o01_s00_i00_details"&gt;only about a dime&lt;/a&gt; when you get a hundred at a time. I have used about 75 or so. There is no reason not to swap them out often, besides that it is somewhat of a pain to do it if you have larger fingers like I do. I have managed to break a few needles, most of the time it is due to the thread wrapping around the spool pin when unwinding. It happens maybe once a month, so it isn't too bad. I used to wind my own bobbins for embroidery, but that takes until forever, so I switched to prewound ones. I really like the ones from &lt;a href="http://www.amazon.com/gp/product/B003T9EHLW/ref=oh_o03_s00_i00_details"&gt;World Weidner&lt;/a&gt; on Amazon, they have constant tension, and unspool well. Several other brands I have tried have winding knots in them, and will jam the machine. I have never had that problem with World Weidner's, and I went though 2 gross of them so far.&lt;br /&gt;
&lt;br /&gt;
One of the problems that I had was that the needle threader stopped working. When I pressed it, it would stick at the bottom, and not try to 'wrap' the needle. I took the needle threader apart, and used a drop of sewing machine lubricant on it, and gently worked it a few times. The needle threader then worked again. I have had to do this twice in the last year.&lt;br /&gt;
&lt;br /&gt;
The embroidery foot itself actually wore out as well. The foot moves up and down with each stitch, and the guide pin actually elongated the hole of the presser foot. This made the foot move enough so that it would block the needle threader, and too much more wear would have allowed the needle to hit the presser foot. I looked all over for a replacement, and couldn't find one anywhere.  finally, I ordered one &lt;a href="http://www.brothermall.com/Accessories/AccessoryDetail.aspx?AccessID=XD0474151"&gt;direct from Brother&lt;/a&gt; for about $10. It is part number XD0474151, and fits both the SE400, and the LB6800PRW. 20 million stitches sounds more than fair.&lt;br /&gt;
&lt;br /&gt;
Besides those 2 things, the machine has been flawless. I need to clean the lint out of it and wipe it down, but those are both normal maintenance things. It runs like champ both when doing embroidery and regular sewing. All in all, I highly recommend this machine. I even bought another (though the SE400 instead because I didn't need a case) to give as a Christmas present. It is very quiet, and can sew circles around any machine I have used in the past. &lt;br /&gt;
&lt;br /&gt;
As a note again, the LB6800PRW &amp; SE-400 combination machines are basically the same, see my &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;past posts&lt;/a&gt; for an overview.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-5628373280690274198?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/RM_rGYwJjMMFdIYSIyh8noZKtus/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RM_rGYwJjMMFdIYSIyh8noZKtus/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/RM_rGYwJjMMFdIYSIyh8noZKtus/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/RM_rGYwJjMMFdIYSIyh8noZKtus/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/SoenSlf7ytA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/5628373280690274198/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/12/update-on-lb6800prw-embroidery-machine.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/5628373280690274198?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/5628373280690274198?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/SoenSlf7ytA/update-on-lb6800prw-embroidery-machine.html" title="Update on LB6800PRW Embroidery machine" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/12/update-on-lb6800prw-embroidery-machine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMARHs4eyp7ImA9WhRXFUU.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-3749909503896617042</id><published>2011-12-22T12:00:00.001-06:00</published><updated>2011-12-22T13:34:05.533-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T13:34:05.533-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="sewing" /><category scheme="http://www.blogger.com/atom/ns#" term="singer" /><category scheme="http://www.blogger.com/atom/ns#" term="XL-400" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Singer XL-400 Futura Sewing &amp; Embroidery Machine Review</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-lu-B4WXVk0Y/TvOF1wNj-nI/AAAAAAAAAHc/91Z65H4BWeQ/s1600/unnamed.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="220" width="220" src="http://4.bp.blogspot.com/-lu-B4WXVk0Y/TvOF1wNj-nI/AAAAAAAAAHc/91Z65H4BWeQ/s320/unnamed.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Research:&lt;/b&gt;&lt;br /&gt;
I really wanted to get an embroidery machine that had a bigger embroidery field than my &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt;.  I did a bunch of looking around (literally a month of research) and finally decided to get the XL-400 Futura by Singer.  There were a decent amount of negative reviews out there that I saw, but most looked like they were from people new to sewing or embroidery where the issue was user related, not machine related.   Besides those reviews and comments, the machine had the features I most wanted.  &lt;br /&gt;
&lt;br /&gt;
The XL-400 brings a bigger embroidery area of 10 inches by 6 inches and the option to go to 20 inches by 12 inches by multi-hooping, using some nifty alignment tools that are built into the hoop and machine.  I have tried to do manual alignment, and I can't even get close, no matter how long I try.  The alignment tools allow you to shift the placement of the design using the machine instead of physically rehooping.  This sounded like an awesome way to go. The SL-400 also has a deep throat, allowing bigger items to be rolled up under the machine.  The &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt; isn't anywhere near as deep, so it is hard to sew shirts or embroider them.  There is also a speed controller, so that the speed at which the embroidery id done can be slowed down from maximum speed.  I wanted something like this for doing delicate fabric, as I felt that going at 350 stitches per minute was too fast for some fabric.&lt;br /&gt;
&lt;br /&gt;
The XL-400 has some features that didn't matter much to me, but they sounded nifty, such as the quick threading of the machine, and the auto-tension.  The feet and needles are also interchangeable with the &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt; that I already had, so that was a plus too.&lt;br /&gt;
&lt;br /&gt;
The things I didn't like about the machine specs before I used is that there is not an LCD screen or anything like it on the machine.  The stitch selector area has a bunch of LED's over each stitch, and in embroidery mode, the LED's act as a big indicator for things.  This seemed like a bad idea, as an LCD nowadays would only cost about $5.  One like the &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt; has would probably cost about $15, but either one looked like it would have been better than the LED grid above the different stitches.  The machine also has to be hooked to your computer 100% of the time while stitching.  With the &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt;, you only need to connect it to transfer the design at the beginning, but for the XL-400, it needs to be connected at all times.  The software on the PC controls the machine, instead of the machine controlling the machine.  &lt;br /&gt;
&lt;br /&gt;
Some things I didn't like at all were that there is not an automatic thread cutter on the XL-400.  That seems like a really big oversight on a machine that costs $800, when my $100 machine has one.  I never realized how necessary a thread cutter was for embroidery until I didn't have one.&lt;br /&gt;
&lt;br /&gt;
The biggest factor on why I got this machine was the price. As an engineer, I know there is almost no difference between making a machine that can do a 4" field or a 10" field besides the stepper motors, some extra reinforcement on the machine and the hoops.  The cost between them should be very marginal (maybe $50 besides some engineering cost).  Brother goes from $400 for 4", to $600 for 7" to about $12k for 12".  Granted, each step has more features, like color LCD's and the like, but I don't need that, I just want a bigger field. The mechanics are basically the same for 4" or 12".  The Singer is still overpriced for what I know it cost to make, but it was the cheapest option at about $800.  I expect companies to make money, but the markup on these must be crazy.  They could make so much more money by gettinga  ton of machines out there and making bank on accessories.  Kind of like how the console gaming industry works.  Sell the console cheaply to build the base, and make tons on accessories.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Using the machine&lt;/b&gt;&lt;br /&gt;
When I unboxed it the first thing I noticed was how heavy it was.  Thankfully, I have a steel and oak table for this, as this machine is very heavy, it did not feel chintzy at all. Easily 4 times heavier than my &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt;.  The embroidery module attached easily and was sturdy.  My computer recognized it easily after installing the software.  I would say it was about 30 minutes from when I got the box to when I was ready to do the first design.  Sadly, this is where I started to dislike this machine.&lt;br /&gt;
&lt;br /&gt;
When I pulled out the hoop, the first thing I noticed was how weak it was.  The ones for my Brother machines can probably take a good hundred pounds of force before deforming, they feel extremely sturdy.  The 2 singer ones felt like they were made out of very elastic plastic.  I could easily bend the hoop using only my hand.  For embroidery, stability is everything, and this didn't look good. No matter what I did, the large hoop did not hold fabric or stabilizer tightly.  Works fine for 1 color, but subsequent colors don't line up.  The machine has a cool basting feature, where the entire design is outlined with a basting stitch, sewing the fabric and stabilizer together. However, all this helped me do was figure out just how much the embroidery function on this machine sucked. The basting could be done after any color, so once I figured out that the hoop was utter garbage, I used the basting option between each color to see just how far the material was moving.  In some instances, it was moving up to 1/2 of an inch between colors.  It was abhorrent!  I have tried using no stabilizer, 1 sheet of 1.5 oz, 1 sheet of 2 oz, 2 sheets of 2 oz, 3 sheets of 2 oz, and every combination I could think of both in tearaway, cutaway and different brands.  Nothing seems to matter, there is just plain an engineering failure with the hoop.  I was unable to find any aftermarket hoops that may solve the problem that would fit this machine, so right there, it was end game for this machine as it would not work for what I got it for, multi-color embroidery.  1 color was mostly fine, and regular sewing was fine, but more than 1 color? Forget it.&lt;br /&gt;
&lt;br /&gt;
It took me a good few weeks of experimenting, trying to figure out a way to make the machine work for me, and during that time I learned a lot more about it, none of which went in the machine's favor sadly.&lt;br /&gt;
&lt;br /&gt;
The needle threader is very difficult to use, and takes a ton of times.  It will often pull 1 ply of the thread though the needle and not the other, and jam the eye.  I gave up after a good 500 attempts, and inspecting the way the needle threader actually worked.  After looking at it, I can see it would only work if the thread is perfectly aligned.  After I figured that out, and held the thread instead of using the alignment guide, I could get it to work about 30% of the time, but it was still faster to manually thread the needle.&lt;br /&gt;
&lt;br /&gt;
The machine puts down 6 to 8 extra stitches at the end of a color. It appears to be right at the start point for the next color.  These stitches are not in the design, but the machine adds them, and I have to cut them off or pull them out.  The machine/software does this with all designs, even ones I made personally.  Even the 'baste in hoop' option adds a few stitches dead center in the middle of the hoop.  This makes absolutely no sense.  The manual and help for the software made no mention of this, or an option to turn it off.  I'm not sure why anyone would EVER want that option anyway.&lt;br /&gt;
&lt;br /&gt;
The machine is very 'jerky' when pulling thread off the spool, and constantly jams thread by wrapping it around the spool holder. This happens with both the regular thread holder or the vertical auxiliary thread holder, and happens approximately every 1000 stitches. I think this is because the 'easy threading' process eliminates the part of the machine that equalizes the thread tension as the needle descends into the fabric. If I slowed the machine down to about 1/4th speed, this didn't happen.&lt;br /&gt;
&lt;br /&gt;
The machine generally stops when the top thread breaks, but not it never stopped when the bobbin thread breaks or runs out.  I can't count the number of times the top thread broke, and the bobbin thread broke way too often. On my &lt;a href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html"&gt;LB6800PRW&lt;/a&gt;, I can't remember the bobbin thread EVER breaking.  The machine would also never catch when the bobbin thread ran out, it would keep going in it's merry way with no bobbin thread.&lt;br /&gt;
&lt;br /&gt;
The machine literally fell apart.  The plastic tip lever for the needle threader came off while the machine was embroidering, and came off frequently.  It is a friction fit, because that part of the machine is made to be removed, so I couldn't just glue it on.  I solved this by only having the lever on when I needed to thread the needle.&lt;br /&gt;
&lt;br /&gt;
Towards the end, The bobbin case rotated in the machine, causing the needle to jam the case, and break.  It also ruined what I was embroidering.  In 20 years, I have NEVER seen this happen.  It didn't cause any damage to the machine besides the needle though, so this wasn't that big a deal.&lt;br /&gt;
&lt;br /&gt;
The top thread turns into a birds nest under the design.  Sometimes this stooped the machine, sometimes not. The auto-tension just didn't cut it.  When I switched to manual tension, it was a little better, but it still happened. The top thread switches between being correct, then being too lose for a few hundred stitches (and you get giant 1/4" to 1/2" loops on the top) to being correct, then back again.  When it happens the machine doesn't stop.  I have tried catching it when it happens, but even re-threading the machine entirely (top and bottom thread) did not help.  The machine will continue to sew lose for a few hundred to a thousand stitches, then the tension will fix itself.  There is something majorly wrong with the auto-tensioner.  Probably related, the machine will stop saying there is a jam, but there isn't a jam. if I rotate the needle by hand 2 times, the machine will resume.&lt;br /&gt;
&lt;br /&gt;
The machine/software skips stitches.  Not skip as in the top thread doesn't pick up the bottom bobbin thread, but skip as in the machine/software doesn't even try to sew them.  It took me a while to figure out that this was a software issue and not the more common skipped stitch issue.  I thought this was a tension problem until I actually watched exactly what the machine was doing compared to that same point in the embroidery file.&lt;br /&gt;
&lt;br /&gt;
Last but not least, the XL-400 is loud, and unbalanced.  It shakes my entire house.  If I put it on my steel table upstairs, I can feel it shaking the floor downstairs.  For me, this isn't a problem, but it may be for some other folks.  Putting this machine on a weak table will easily shake the table apart.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Singer &amp; the Vendor&lt;/b&gt;&lt;br /&gt;
The worst part of this process was the support I got from Singer.  And by support, I mean I got no support.  All contact went unanswered.  It was a total joke.  I was trying to figure out if the machine was just broken, or if what I was experiencing was normal behavior.  To this day, I still don't know, as I could get a response from no one. My emails were more detailed than this post as I was trying to explain that I wasn't 'new' to this, and it most likely wasn't user error.  &lt;a href="www.sewingmachinesplus.com"&gt;Even the vendor&lt;/a&gt; I bought it from was horrible.  I tried calling &amp; emailing them after I could not get a response from Singer, but they were no better.  On top of that, when I bought the machine, it showed in stock, but it didn't ship for almost 4 weeks.  I kept asking about it, and was always told it would ship the next day.  Towards the very end of the wait, I found out it was on backorder since the beginning.  But even that day, and every day until I stopped checking, their site showed it was in stock.  I wasn't in a hurry so it didn't matter to me besides the fact that they didn't have the decency to tell me that it was on backorder.  This would be a non-issue, except for the fact that I got horrible service form them after the sale too.&lt;br /&gt;
&lt;br /&gt;
After trying for about a month (2 months after purchase) I started trying to return it.  Then I finally got a response to call the vendor's service department.  The guy stopped listening to me after about 5 minues, and said he would call me back.  I never got another call back, and my future calls went unanswered and unreturned.  I had to issue a chargeback to get my money back, and Is hipepd the machine back to them at my expense. I lost about a hundred bucks doing that because I couldn't get a hold of them to get a prepaid label (or even a label I would pay for on their account, since they have a cheaper UPS rate than I did).  So yeah, complete failure of the machine, complete failure of the vendor, and complete failure of Singer.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Overall&lt;/b&gt;&lt;br /&gt;
So overall, the XL-400 promises a lot, but delivers on none of it. In my humble opinion, it is a waste of money, and Singer is not winning any business with non-existant customer support.  I recommend staying FAR away from not only the XL-400, but any Singer machine.  The other reviews and blurbs warning of this machine being junk are right on the money.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-3749909503896617042?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/APnr--rfzyJkDTEccoNh3R8qsCc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/APnr--rfzyJkDTEccoNh3R8qsCc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/APnr--rfzyJkDTEccoNh3R8qsCc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/APnr--rfzyJkDTEccoNh3R8qsCc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/046nq6jtlRw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/3749909503896617042/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/12/singer-xl-400-futura-sewing-embroidery.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/3749909503896617042?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/3749909503896617042?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/046nq6jtlRw/singer-xl-400-futura-sewing-embroidery.html" title="Singer XL-400 Futura Sewing &amp; Embroidery Machine Review" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-lu-B4WXVk0Y/TvOF1wNj-nI/AAAAAAAAAHc/91Z65H4BWeQ/s72-c/unnamed.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/12/singer-xl-400-futura-sewing-embroidery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8ERHs5fCp7ImA9WhdXEUw.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4878017766633460134</id><published>2011-08-23T12:00:00.000-05:00</published><updated>2011-08-23T12:00:05.524-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-23T12:00:05.524-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="DEFAULT database" /><category scheme="http://www.blogger.com/atom/ns#" term="ADO" /><category scheme="http://www.blogger.com/atom/ns#" term="adodb" /><category scheme="http://www.blogger.com/atom/ns#" term="adodb.parameter" /><category scheme="http://www.blogger.com/atom/ns#" term="adodb.command" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>Bug in ADODB.Command Parameters</title><content type="html">Great, I found a bug in Microsoft's ADODB.Command parameters object, and I was unable to find any information on it anywhere on the interweb.  The error message is "Incorrect Syntax near the keyword 'default'". On the surface, this is the SQL parsing engine complaining about the SQL using the reserved keyword 'default'.  &lt;br /&gt;
&lt;br /&gt;
It gets interesting when the SQL statement doesn't have the word 'default' in it.  So what is causing the error message?  It's actually an issue with the ADODB.Parameter.  when a new ADODB.Parameter is created, the default value for the parameter appears to be DEFAULT.  On top of that, if the ADODB.Parameter value is set to an empty string (''), then the value is changed internally to DEFAULT.  In either case, ADODB is replacing the parameter placeholder with DEFAULT int he SQL statement, which fails parsing on SQL Server.&lt;br /&gt;
&lt;br /&gt;
That's a really stupid bug, as an empty string is data.  I want to be able to pass an empty string sometimes, as a empty string is not null or a space.  What the heck Microsoft?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4878017766633460134?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Pm-NtOEt9LJ9d2tXrQDShVgJ5Ck/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Pm-NtOEt9LJ9d2tXrQDShVgJ5Ck/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Pm-NtOEt9LJ9d2tXrQDShVgJ5Ck/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Pm-NtOEt9LJ9d2tXrQDShVgJ5Ck/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/j0px6didVto" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4878017766633460134/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/08/bug-in-adodbcommand-parameters.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4878017766633460134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4878017766633460134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/j0px6didVto/bug-in-adodbcommand-parameters.html" title="Bug in ADODB.Command Parameters" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/08/bug-in-adodbcommand-parameters.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4BQHg4fSp7ImA9WhZaF04.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4840781790827801529</id><published>2011-07-02T19:00:00.000-05:00</published><updated>2011-07-03T19:05:51.635-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-03T19:05:51.635-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery design" /><category scheme="http://www.blogger.com/atom/ns#" term="kball" /><title>Kball's Wedding Anniversary Embroidery</title><content type="html">Kball's Wedding Anniversary was about a month ago.  I decided to break out the embroidery machine and make a design that is based upon the runner from his wedding.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-IOzM9PGLr4I/ThED0DQZQuI/AAAAAAAAAHU/WfEHIqerx4Q/s1600/towel.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://1.bp.blogspot.com/-IOzM9PGLr4I/ThED0DQZQuI/AAAAAAAAAHU/WfEHIqerx4Q/s320/towel.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4840781790827801529?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FwYBAMcX_r39xL9WUL-bGEEx1-Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FwYBAMcX_r39xL9WUL-bGEEx1-Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FwYBAMcX_r39xL9WUL-bGEEx1-Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FwYBAMcX_r39xL9WUL-bGEEx1-Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/yJFpGLTBlHE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4840781790827801529/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/07/kballs-wedding-anniversary-embroidery.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4840781790827801529?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4840781790827801529?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/yJFpGLTBlHE/kballs-wedding-anniversary-embroidery.html" title="Kball's Wedding Anniversary Embroidery" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-IOzM9PGLr4I/ThED0DQZQuI/AAAAAAAAAHU/WfEHIqerx4Q/s72-c/towel.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/07/kballs-wedding-anniversary-embroidery.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUBRXg5fyp7ImA9WhZbGU8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-589370449346545384</id><published>2011-06-23T07:30:00.002-05:00</published><updated>2011-06-24T10:10:54.627-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-24T10:10:54.627-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="bioware" /><category scheme="http://www.blogger.com/atom/ns#" term="forum" /><category scheme="http://www.blogger.com/atom/ns#" term="neverwinter nights" /><category scheme="http://www.blogger.com/atom/ns#" term="hack" /><title>Bioware Hacked</title><content type="html">According to Bioware, one of Bioware's sites was hacked.  I'm not sure on when the hack occurred, but some Bioware user accounts had their user names, encrypted email addresses, mailing addresses, names, phone numbers, CD keys and birth dates compromised though the Neverwinter Nights Bioware forum.&lt;br /&gt;
&lt;br /&gt;
If you have a Bioware account, I suggest you reset your password if Bioware hasn't done it already.&lt;br /&gt;
&lt;br /&gt;
Here's the email from Bioware:&lt;br /&gt;
----------&lt;br /&gt;
&lt;i&gt;We recently learned that hackers gained unauthorized access to the decade-old BioWare server system supporting the Neverwinter Nights forums. We immediately took appropriate steps to protect our consumers' data and launched a thorough ongoing evaluation of the breach.&lt;br /&gt;
&lt;br /&gt;
We have determined that no credit card data was compromised from the servers, nor did we ever have or store sensitive data like social security numbers. Our investigation shows that information such as user names, encrypted passwords, email addresses, mailing addresses, names, phone numbers, CD keys and birth dates from these forum accounts on the system may have been compromised, as well as other information (if any) that you may have associated with your EA Account. In an abundance of caution, we have changed your password to ensure account security. Please... reset your password immediately.&lt;br /&gt;
&lt;br /&gt;
We take the security of your information very seriously and regret any inconvenience this may have caused you. If your username, email address and/or password on your EA account are similar to those you use on other sites, we recommend changing the password at those sites as well. We advise all of our fans to always be aware of any suspicious emails or account activity and report any suspicious emails and account activity to Customer Support at 1-877-357-6007.&lt;br /&gt;
&lt;br /&gt;
If you have questions, please visit our FAQ at http://support.ea.com/app/answers/detail/a_id/5367/ or contact Customer Support at the phone number above.&lt;br /&gt;
&lt;br /&gt;
Aaryn Flynn&lt;br /&gt;
Studio GM, BioWare Edmonton&lt;br /&gt;
VP, Electronic Arts &lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-589370449346545384?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Q1iibKEECnzP2x8P6uA9LRheQ0w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q1iibKEECnzP2x8P6uA9LRheQ0w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Q1iibKEECnzP2x8P6uA9LRheQ0w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Q1iibKEECnzP2x8P6uA9LRheQ0w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/ylTPtvDz3E0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/589370449346545384/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/06/bioware-hacked.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/589370449346545384?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/589370449346545384?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/ylTPtvDz3E0/bioware-hacked.html" title="Bioware Hacked" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/06/bioware-hacked.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcEQH8yfCp7ImA9WhZVEk0.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-111181297430118795</id><published>2011-05-23T22:00:00.000-05:00</published><updated>2011-05-23T22:00:01.194-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-23T22:00:01.194-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="motor" /><category scheme="http://www.blogger.com/atom/ns#" term="ebike electric bicycle" /><category scheme="http://www.blogger.com/atom/ns#" term="24v" /><category scheme="http://www.blogger.com/atom/ns#" term="currie" /><title>Ebike Update</title><content type="html">It has been about a week since I posted on my electric bicycle, and I have learned some more about the kit in that time.&lt;br /&gt;&lt;br /&gt;I am firmly within the 'best battery capacity' part of a SLA battery, so the highest range possible is going to be right now.  I set out yesterday to see exactly how far I could go on a single battery, with me assisting pedaling 100% of the time.  The route was over paved streets and flat bike paths.  There were a total of 11 starts from a dead stop.  I also had another battery in the rack (a total of 2) so this was a real world test of range. I was able to do 8.1 miles until the battery was dead.  That is with me pedaling 100% of the time at a comfortable pace, except on the starts, when I pedaled as hard as I could to gain speed.&lt;br /&gt;&lt;br /&gt;Just like before, there is a marked dropoff in power almost exactly at the 5 mile mark.  At this mark, the battery actually shows 100% charge.  At mile 7, I have to do about 80% of the work pedaling the bike to maintain top speed, and the battery shows 2/3rds full at this point, and 1/3rd full at about 7.5 miles.  Just before mile 8, the charge indicator shows red, and after about 500 more feet, the motor cuts off.  The charge indicator is definitely not calibrated correctly, but once you are used to riding the bike, the seat of your pants will do a much better job with estimating the battery life than the charge indicator will.&lt;br /&gt;&lt;br /&gt;During the week, I also found that 2 of the 4 bolts on the adjuster for rack length came out.  Both used plastic locking nuts to keep the nuts from coming off, but both came off anyway.  I replaced them with new bolts, lock washers, and thread locker.&lt;br /&gt;&lt;br /&gt;I also had a very crappy experience with a pothole.  It was about 4 inches across and 2 inches deep with the lip about 30 degrees off from the direction of travel; so it was very small.  When the rear wheel hit it, the pothole knocked the rear wheel out of alignment by about 1/2 inch at the top of the wheel.  This made the tire rub on the side of the battery 100% of the time when the bike was in motion.  I was worried something like this was going to happen at some point because there is very little spare clearance between the rack and the tire.  I pulled the battery on that side and put it on the other side then went home where I had my tools.&lt;br /&gt;&lt;br /&gt;Still, all in all, I like the kit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-111181297430118795?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sLDpZH5cIcCAzhubzjXgLlJjKGo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sLDpZH5cIcCAzhubzjXgLlJjKGo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sLDpZH5cIcCAzhubzjXgLlJjKGo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sLDpZH5cIcCAzhubzjXgLlJjKGo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/zN-uuiPTNnQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/111181297430118795/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/05/ebike-update.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/111181297430118795?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/111181297430118795?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/zN-uuiPTNnQ/ebike-update.html" title="Ebike Update" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/05/ebike-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUDQH0zeSp7ImA9WhZVGEU.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-3875146883519033808</id><published>2011-05-16T22:00:00.003-05:00</published><updated>2011-05-31T17:17:51.381-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-31T17:17:51.381-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="motor" /><category scheme="http://www.blogger.com/atom/ns#" term="electric" /><category scheme="http://www.blogger.com/atom/ns#" term="ebike" /><category scheme="http://www.blogger.com/atom/ns#" term="24v" /><category scheme="http://www.blogger.com/atom/ns#" term="bicycle" /><category scheme="http://www.blogger.com/atom/ns#" term="currie" /><category scheme="http://www.blogger.com/atom/ns#" term="electric bike" /><title>Electric Bicycle Conversion</title><content type="html">One of the things I miss is being able to ride a bike all over the place.  As a kid, I used to go everywhere on a bike.  The freedom to go as far as you wanted to pedal was liberating.  But now that I am older (and lazier) I tend to go everywhere in a car.  This gets expensive quickly, and isn't as much fun.  There's not really a chance to take in the scenery.&lt;br /&gt;
&lt;br /&gt;
Since I am a geek, and enjoy building my own solutions to problems, I was going to try building a motor powered bike.  However, when pricing out parts for a proposed solution, I came to an unfortunately very high price for something that wouldn't have a guaranteed chance of working.  While I am all for a challenge, I have enough of those right now.  To solve my problem, there are several kits out there that can give the satisfaction of building your own, while still being on the inexpensive side.  The kits range from a low of about $300 to well over $2k depending on lots of factors.&lt;br /&gt;
&lt;br /&gt;
I read lots of reviews and did a bunch of research before buying a kit. Since I was looking for more proof of concept than anything else, I decided upon the low end of the spectrum, a $300 kit from Currie.  This kit comes with a motor and rim combo, one 10 amp/hr 24v lead-acid battery, controller, and the associated hardware.  The kit is designed to be put on a non-suspension 26" mountain bike or a comfort/hybrid (front suspension only) bike.  The shipping weight is nearly 50 lbs, so it adds some serious weight to the bike.  It also puts out 450 watts, which is 3/5ths of a horsepower, and a published range of 11 miles.  A normal human can generate spikes of 1.2hp or sustain about 1/10th of a hp, so 3/5ths is a large gain.  This seemed like a kit that wouldn't go any faster than my maximum speed pedaling, and be able to help on those long trips at the expense of extra weight.  It seemed like a good tradeoff.&lt;br /&gt;
&lt;br /&gt;
I ordered the kit from Amazon.  It arrived looking like it was run over by the UPS truck.  The box was in shambles, and it looked like it had been repacked several times on it's journey.  But a quick glance inside appeared to show everything in working order.  I found out later that wasn't the case.&lt;br /&gt;
&lt;br /&gt;
After I laid out everything on my workbench, I started making an additional parts list.  The Currie kit requires you to use the 7 speed gear (freewheel), tube and tire from the existing bike that the kit is going on.  Personally, I think this is a big oversight by Currie as a freewheel is only about $10 while the tool to take off a freewheel is $8 plus a chain whip which is $11. The tools are not needed to put the flywheel back on.  So the difference to a consumer is actually $-9.  A freewheel should have been included instead of requiring one be taken off the donor rim.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-OoS8XGgEPuw/TeVo0-mEWuI/AAAAAAAAAG4/ijK090cZgDA/s1600/Hub.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-OoS8XGgEPuw/TeVo0-mEWuI/AAAAAAAAAG4/ijK090cZgDA/s320/Hub.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
I was planning on putting the kit on a full suspension mountain bike, which I knew would require some modifications.  I picked up the GMC Topkick mountain bike, but when I received it I found that the description and pics on Amazon is incorrect.  the Topkick has front and rear disks, not just front, so the Currie kit will not work.  I could have retrofitted rim brakes on the rear, but when pricing it out, it would have cost almost 1/2 of what another bike would cost.  Since I had already assembled the Topkick and tossed the shipping box, I decided against returning it, and would keep the Topkick as a regular bike.&lt;br /&gt;
&lt;br /&gt;
That left me without a suspension bike to put the kit on.  Since I was aiming for proof of concept, I decided to put the kit on my old Huffy mountain bike that I used in college.  That bike had seen more abuse than anything you could think of.  I rode it all over the place to get to/from class and around town.  This included going down stairs and off ledges that were a few feet tall.  The rims were beat to heck and bent, and the frame was very 'tweaked', but it still road decently, though steering was more of a suggestion than anything else.&lt;br /&gt;
&lt;br /&gt;
Since I knew this wasn't going to be the final bike the kit was going to be on, I decided against taking the freewheel, tube and tire off the huffy.  I ordered a 7 speed freewheel, chain whip and freewheel socket (the last 2 were 'just in case') from Amazon to put on the Currie kit, and a cheap tire and tube from a trip to Wal-Mart.  The freewheel spun on with no problem with no tool (the freewheel tightens when you ride, so it doesn’t have to be tightened with a tool) and the tire and tube were no problem.  Fitting the new rear wheel assembly on the huffy was no problem either, even though I went from a 5 speed freewheel (original on the huffy) to a 7 speed freewheel.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-eT-l6OhN34M/TeVo-N11OFI/AAAAAAAAAHA/mGX6xKLxMKA/s1600/freewheel.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://1.bp.blogspot.com/-eT-l6OhN34M/TeVo-N11OFI/AAAAAAAAAHA/mGX6xKLxMKA/s320/freewheel.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-KV18YFDiazg/TeVpCSAjVUI/AAAAAAAAAHI/cg-CWEfTmn4/s1600/freewheel%2Bon%2Bhub.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://4.bp.blogspot.com/-KV18YFDiazg/TeVpCSAjVUI/AAAAAAAAAHI/cg-CWEfTmn4/s320/freewheel%2Bon%2Bhub.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
When I went to start assembling the kit is when I ran into the first thing that Currie needs to improve.  The instructions are very bad, as in they are not complete.  They state to 'remove the old freewheel'.  Ok, how do I do that?  I had no idea what a freewheel was until I downloaded the instruction PDF before purchase and looked up a bunch of the terms online.  Then, I had to find instructions on how to remove the freewheel.  It was annoying.  Same thing with all the bolts and connections.  The instructions assume you know exactly what you are doing, and say things like 'bolt the rack to the bike' instead of what I would expect, such as, 'use the 10mm diameter 30mm long screws to attach the bike rack to the mounting points by the rear sprocket/freewheel'.  The instructions were ambiguous, and incomplete.  If you haven't worked on bikes for a long time, and done your own maintenance, expect the kit to take a while to assemble, or have a shop do it for you.&lt;br /&gt;
&lt;br /&gt;
When I put the rear wheel on the Huffy I ran into the first mechanical problem.  The Currie rim was bent. It was still usable, but it was off by a good 1/4 inch at one point.  This meant it rubbed on the brakes when the rim passed the brake shoe every revolution.  I would have to take it to a bike shop to be straightened after testing.  Once the wheel was on, I mounted the battery and controller holder, which takes the shape of a rear rack.  This is where I ran into another problem, though this time with the Huffy itself.  The rack mount holes in the Huffy were not tapped for bolts.  I tapped them for the bolts that came with the Currie kit using a Craftsman tap.  There was enough room to do this with the rear wheel still on the bike. Once those bolts were in, I attached the down bars to the rear frame under the seat, and the rack was now completed.&lt;br /&gt;
&lt;br /&gt;
the next step was to attach the throttle.  Here I ran into another problem, the throttle was also cracked.  It was obvious at this point that I would need some replacement parts from Amazon. I disassembled the throttle controller, and re-soldered on 2 of the 4 LED's that indicated the power level in the battery so I could still test, and fixed 2 broken traces on the cracked PCB.  I then mounted the controller to the right hand handlebar.  When routing the wire back tot he rear of the bike, I found that the lead wire is shorter than would be expected.  The wire loom needs to be at least 6 inches longer.  As it is, I had to route the throttle loom in a non-optimal location (the absolute shortest route possible) in order for the loom to have enough length to connect to the controller in the rear rack.&lt;br /&gt;
&lt;br /&gt;
The final step was to connect the power feed from the bottom of the rack to the top where the controller is.  This strikes me as a poor design.  Why have wires on the outside of the bike, especially 2 wires?  Why not use a common ground and 1 wire inside the frame of the rear rack?  That will keep the wires from being in the way, reduce cost (copper is expensive) and reduce assembly time.  &lt;br /&gt;
&lt;br /&gt;
Now that my bike was assembled, it was time to try it out.  Unfortunately, when putting the battery into the rack, I found that the case was cracked.  It wasn't leaking or anything, but the case is what held the battery on the bike.  I had some reservations about disassembling the case to try to fix it, so some duct tape held it together, just in case. I rode around a little without a battery to make sure that the brakes worked, and I wasn't going to run into a tree or something.  Once I was happy with the handling, I put in the battery and rode around without turning on the kit.  You could definitely feel the extra weight (the battery is about 17 lbs) but it wasn't as bad as I was expecting.  I would estimate it at about 10% more effort with the battery on the bike).&lt;br /&gt;
&lt;br /&gt;
Finally, I enabled the battery and used light power.  I was extremely surprised at the amount of power that the motor put out.  It accelerated only slightly slower than I could do manually.  It kept up that acceleration to the kits top speed, which was almost exactly the top speed that the Huffy and I could manage when peddling as fast as possible in the highest gear on flat ground.  I rode around the neighborhood for about 10 minutes, then headed back to check out connections, screws, and such.&lt;br /&gt;
&lt;br /&gt;
One of the issues I had in this brief ride is that nearly any bump (such as a large crack in the sidewalk, or going down a driveway into the street) would cause the battery to pop out of the rack by about 1/4".  This was enough to raise the battery off the contacts in the bottom of the rack.  There are 2 locks that hold the batteries in, which I thought were for security.  But they are actually required to keep the battery seated in the rack.  A quick turn of the key solved that problem.  At first, I thought this was an issue with the cracked case, but the replacement battery did it too.&lt;br /&gt;
&lt;br /&gt;
When I was checking the bolts, I found that the 2 bolts holding the rack to the bike down by the freewheel were starting to deform.  They were already deformed by about 1/4 their diameter, and were in the process of sheering off.  These were obviously crap bolts.  They were the only major failure of engineering that could have been VERY bad that I have found so far.  A quick trip to the hardware store and some grade 5 stainless bolts solved the problem permanently.  &lt;br /&gt;
&lt;br /&gt;
The next day I also contacted Amazon to see if they could send me some non-broken parts.  Unfortunately, they could only send me an entire new kit.  I pulled the battery, controller and rim out.  During this time I also was able to determine why my last kit had such a problem.  The box wasn't closed. The box is a clamshell type box, and there was no closing mechanism (tape, glue, staple or other means).  This box was not made to be shipped via a carrier, it was meant to go on a shipping pallet.  When I sent it back to Amazon, I taped the box closed.  Otherwise, they were probably only going to get parts of the kit back, with the rest lying on the floor of a fedex facility somewhere.&lt;br /&gt;
&lt;br /&gt;
For the next week, I kept testing the kit to see what it could do.  I rode all over on different surfaces to figure out how the kit acted.  From a power standpoint, it could handle pretty much everything I threw at it.  It could go up and down hills on dirt, grass or asphalt.  There is one hill near my home that has a 50' rise over about 250 horizontal feet that the kit couldn't do without pedaling help, but the kit made that so much easier that doing it manually.  As for range, I came up with about 5.4 miles on a nearly level gravel bike path with light pedal assistance from me.  After that, the speed drops off to the point where it is faster to walk.  The kit will still continue to assist when you pedal up to a total of about 7 miles though.  After 7 miles, the kit is just dead weight.  7 miles is about 63% of the advertised range.  I would have hoped the advertising would be closer to actual, but a 5 to 7 mile range isn't too bad. That works out to about $50 per mile for range for the kit price.&lt;br /&gt;
&lt;br /&gt;
Now that I had proved out the concept, I wanted to put the kit on a full suspension mountain bike.  The Huffy just wasn't going to survive, and I wanted the kit to have a suspension buffer between the road.  It proved difficult to find a suspension bike that was 21 speed, durable, strong enough to hold the kit weight and myself while not being insanely expensive.  In fact, I couldn't find one a bike that would work on Amazon at all.  I went to a few different stores, and finally settled on the best of the worst, a Magna Excitor Terrain Bike from Target.  &lt;br /&gt;
&lt;br /&gt;
The Magna Excitor Terrain Bike was about $80 on sale, and the reviews that I could find were absolutely horrible.  However, it had the correct dimensions that I was looking for, has a steel frame, and the majority of the reviews seemed to stem from poor assembly either at the factory or by the store.  The assembly I could correct, so I went to a Target and picked one up.  After getting it home, I agree that the assembly was horrible.  The handle bars were not on correct, the height of the handlebars was beyond the max limit by a huge amount, and the brakes were suggestions instead of brakes.  I fixed the handlebars and spent a good hour fixing the brakes.  When I got those working, I put some more air in the tires, and went out on the street for some testing.  After about 100 feet, the rear inner tube popped.  I found out this was because the steel bead actually separated from the tire itself. O_o. I went back to target and they exchanged the tire and inner tube.  To top it off, the inner tube they gave me had a hole in it.  Arrg.  So I bought a few extras.&lt;br /&gt;
&lt;br /&gt;
After I replaced the tire and tube again, I tested out the Magna Excitor Terrain Bike some more.  It seemed like I had found everything that was wrong with the bike, so I took off the rear wheel and put the powered one on.  Putting it on proved much more difficult than on the huffy.  The rear forks have almost no play side to side, so it is extremely difficult to get the wheel seated correctly.  After taking the wheel on and off about 5 times so far, I have it down to where it takes about 30 minutes to get back on.  That is way too long, but the price I pay for saving about $300 on the bike.&lt;br /&gt;
&lt;br /&gt;
Once the wheel was on, I attached the rear rack.  The down bars were exactly the correct length to attach to the seat post, so no problems there.  Cycling the suspension showed no binding.  I was expecting to have to fabricate some down bars, but so far, the stock ones have worked fine. The full suspension is much smoother than the Huffy.  Time will tell on the durability though.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-FG6rYOz9GJw/Td5qzaghWlI/AAAAAAAAAGc/6QWMRVAQFqU/s1600/Left%2BBattery.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://3.bp.blogspot.com/-FG6rYOz9GJw/Td5qzaghWlI/AAAAAAAAAGc/6QWMRVAQFqU/s320/Left%2BBattery.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-kizKHMb-Kvk/Td5q5nQTHtI/AAAAAAAAAGk/twXlMsFg4Q0/s1600/Right%2BBattery.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://2.bp.blogspot.com/-kizKHMb-Kvk/Td5q5nQTHtI/AAAAAAAAAGk/twXlMsFg4Q0/s320/Right%2BBattery.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-KLeJNkbRIdY/Td5rDrl_TxI/AAAAAAAAAGs/utma0YIUGI0/s1600/Throttle.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="240" width="320" src="http://2.bp.blogspot.com/-KLeJNkbRIdY/Td5rDrl_TxI/AAAAAAAAAGs/utma0YIUGI0/s320/Throttle.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All in all, I am happy with the performance of the kit.  The range is low, the instructions need a lot of improvement, and a freewheel should have been included.  But besides that, the kit is great.  I haven't put on a lot of miles so far, I will need to expand this when I put on a few hundred more miles. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Links to some of the products:&lt;br /&gt;
http://www.amazon.com/gp/product/B002RRBDIW - $300 - Currie Power Kit&lt;br /&gt;
http://www.amazon.com/gp/product/B002RR7RD2 - $120 - Extra battery&lt;br /&gt;
http://www.amazon.com/gp/product/B003B8JYPU - $10 - Freewheel&lt;br /&gt;
http://www.amazon.com/gp/product/B001B6RGXG - $7 Freewheel Socket&lt;br /&gt;
http://www.amazon.com/gp/product/B00165N6TA - $11 - Chain Whip&lt;br /&gt;
http://www.amazon.com/gp/product/B000BT4W2C - $210 Topkick bike&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-3875146883519033808?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2m-WEZWiMXGXgABclZBNoROX8dQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2m-WEZWiMXGXgABclZBNoROX8dQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2m-WEZWiMXGXgABclZBNoROX8dQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2m-WEZWiMXGXgABclZBNoROX8dQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/joILPlcOeH8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/3875146883519033808/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/05/electric-bicycle-conversion.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/3875146883519033808?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/3875146883519033808?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/joILPlcOeH8/electric-bicycle-conversion.html" title="Electric Bicycle Conversion" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-OoS8XGgEPuw/TeVo0-mEWuI/AAAAAAAAAG4/ijK090cZgDA/s72-c/Hub.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/05/electric-bicycle-conversion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIEQ34_eSp7ImA9WhZREE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-8762247949520266150</id><published>2011-04-05T01:10:00.001-05:00</published><updated>2011-04-05T13:18:22.041-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-05T13:18:22.041-05:00</app:edited><title>Epsilon Data Breach</title><content type="html">Epsilon suffered a data breach that may have released your email into the wild. Epsilon is a marketing company sends something like 40 billion emails every year on behalf of other companies.  So far, it appears that no financial info was compromised, but just having your email can be bad enough.  First, this means more spam is likely.  But far more dangerous are the phishing scams asking you to log into a site and verify your identity or some such nonsense.&lt;br /&gt;&lt;br /&gt;This is a good time to go over a reminder if basic internet security. First and foremost, don't open email or attachments from senders you don't know. If you don't know them, why are they sending you junk?  Delete it and move on.  As for other companies that you do business with, do not go though links in an email if at all possible.  Those links can be spoofed, so the actual address is different than the name.  A quick example is this link to &lt;a href="http://www.yahoo.com"&gt;www.google.com&lt;/a&gt; that actually goes to yahoo.  If an email is asking you for things that should never be asked (social security number, user id and password, mothers maiden name, etc) do not answer it and call customer service for the site you are trying to access to verify authenticity. Don't forget to look for telltales in an email, such as bad spelling or grammar.  Both are generally identifiers pointing to the message being spoofed or a scam.  If you think an email may be a scam, it is.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Current list of companies affected by the Epsilon data breach by the way:&lt;/span&gt;&lt;br /&gt;1-800-FLOWERS&lt;br /&gt;AbeBooks&lt;br /&gt;AIR MILES Reward Program&lt;br /&gt;Ameriprise&lt;br /&gt;Barclays Bank of Delaware&lt;br /&gt;Beachbody&lt;br /&gt;bebe&lt;br /&gt;Benefit Cosmetics&lt;br /&gt;Best Buy&lt;br /&gt;Best Buy Canada Reward Zone&lt;br /&gt;Brookstone&lt;br /&gt;Capital One&lt;br /&gt;Citi&lt;br /&gt;City Market&lt;br /&gt;College Board&lt;br /&gt;Dillons&lt;br /&gt;Disney Destinations&lt;br /&gt;Eddie Bauer Friends&lt;br /&gt;Eileen Fisher&lt;br /&gt;Ethan Allen&lt;br /&gt;Food 4 Less&lt;br /&gt;Fred Meyer&lt;br /&gt;Fry’s&lt;br /&gt;Hilton Honors&lt;br /&gt;Home Shopping Network (HSN)&lt;br /&gt;Jay C&lt;br /&gt;JPMorgan Chase&lt;br /&gt;King Soopers&lt;br /&gt;Kroger&lt;br /&gt;Lacoste&lt;br /&gt;Marriott Rewards&lt;br /&gt;McKinsey Quarterly&lt;br /&gt;MoneyGram&lt;br /&gt;New York &amp; Company&lt;br /&gt;QFC&lt;br /&gt;Ralphs&lt;br /&gt;Red Roof Inn&lt;br /&gt;Ritz-Carlton Rewards&lt;br /&gt;Robert Half International&lt;br /&gt;Smith Brands&lt;br /&gt;Target&lt;br /&gt;TD Ameritrade&lt;br /&gt;TiVo&lt;br /&gt;US Bank&lt;br /&gt;Visa&lt;br /&gt;Walgreens&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-8762247949520266150?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/id37Twgt6qHBd7xqPfa3KyuGfCs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/id37Twgt6qHBd7xqPfa3KyuGfCs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/id37Twgt6qHBd7xqPfa3KyuGfCs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/id37Twgt6qHBd7xqPfa3KyuGfCs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/kznxNAF4pWQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/8762247949520266150/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/04/epsilon-data-breach.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/8762247949520266150?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/8762247949520266150?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/kznxNAF4pWQ/epsilon-data-breach.html" title="Epsilon Data Breach" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/04/epsilon-data-breach.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8ERHk-eCp7ImA9Wx9aEkw.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4267460819971064917</id><published>2011-03-03T23:00:00.001-06:00</published><updated>2011-03-03T23:00:05.750-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T23:00:05.750-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rainbow table" /><category scheme="http://www.blogger.com/atom/ns#" term="passwords" /><category scheme="http://www.blogger.com/atom/ns#" term="Hash" /><category scheme="http://www.blogger.com/atom/ns#" term="MD5" /><category scheme="http://www.blogger.com/atom/ns#" term="Cryptology" /><title>Passwords, Hashes and Dictionary Attacks</title><content type="html">Cryptology has been a favorite topic of research for me over the past 10 years.  Ever since geometry class, I have been obsessed with mathematics, patterns, and number theory.  I enjoy turning one value into a totally different value and back again. That may sound like nonsense, but that is exactly how cryptology (and thus password systems) work. &lt;br /&gt;&lt;br /&gt;I am going to go into detail about one of the most popular password storage and verification processes in use on the internet, and in offline systems.  This method is called a hash, specifically an MD5 hash.  I will also outline 2 of the methods that hackers can use to compromise password.&lt;br /&gt;&lt;br /&gt;A big part of password security is never actually storing a password. A password is not stored by itself, meaning in plain text. If your password is ‘evadman’, ‘evadman’ is not stored in a database. Some other representation of the password is stored, and verified against when you log into an application or site.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MD5 Hashes&lt;/span&gt;&lt;br /&gt;For example, the defacto standard for passwords is called an MD5 hash. This is a 32 character representation of a string of numbers, letters or other characters. The length is always 32 hexadecimal (0-9 and A-F) characters no matter how long the input is, and the output hash is always the same for the same input. For example, the MD5 hash of an empty string (“”) is d41d8cd98f00b204e9800998ecf8427e. The MD5 hash of “The quick brown fox jumps over the lazy dog” is 9e107d9d372bb6826bd81d3542a419d6.  If any character is changed, such as an uppercase letter, extra space, or even a non-printable character such as a tab, the MD5 hash will change.  The only thing that won’t change is the length of the hash, which will always be 32 hexadecimal characters.&lt;br /&gt;&lt;br /&gt;The input into an MD5 hashing program can be a password (a small string of characters) or something as big as an entire hard drive. That is why sometimes when you go to a download site, they will tell you the hash for the file so you can verify that the file was transferred correctly. If you create a hash on your computer of the file and get a different answer, then the file was corrupted when it was downloaded. &lt;br /&gt;&lt;br /&gt;Since an MD5 hash is always the same length, it can be stored conveniently in a database. The database administrator or application owner doesn’t have to set a maximum password length, or store a field of random length, as the output is always exactly 32 characters. For all the program cares, the password can be a paragraph.  The output will always be 32 characters long.  That is a big ‘selling point’ of an MD5 hash.&lt;br /&gt;&lt;br /&gt;These password hashes used to be considered moderately safe for public view because they could not be reversed. For example, walking backwards from 9e107d9d372bb6826bd81d3542a419d6 to “The quick brown fox jumps over the lazy dog” was considered pretty much impossible, because it would take every computer on the planet working for decades to go backwards and turn the hash into the original password. That was a false assumption; methods were found to do that conversion quickly if the password is short enough.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Rainbow Tables&lt;/span&gt;&lt;br /&gt;The method is called a “pre-computed dictionary attack” and the data is stored in a device called a “rainbow table”. To GREATLY simplify, if you have a hash, you can look up the original password in the rainbow table. The limitations of this process are of the utmost importance to understand, as the limitations of a rainbow table will tell you what the minimum password length, and characters, should be to best mitigate the risk of your password being broken.&lt;br /&gt;&lt;br /&gt;First, a rainbow table is absolutely ginormous. A rainbow table that would work on passwords that are up to 7 numbers or lowercase characters is about 130 GB. Up to 9 numbers and lowercase letters is about 500 GB. The size grows quickly as additional characters are added. Adding a non-numeric character like "#" will expand that to more than 10 TB. That is one of the reasons that it is recommended that you use a non-numeric character in your passwords. The method used for generating the chains that make up a rainbow table takes a boatload of horsepower.  This can be decades of computer time, but once they are made, they never need to be made again.  Distributed computing can be used to reduce this to a few hours, if not less, for smaller tables.&lt;br /&gt;&lt;br /&gt;I will explain a real life example of this method. I was tasked with migrating users from one software platform to another many years ago. The original software used an MD5 hash for a password, and the new software used a different method. This meant that every user would have to reset their password, as the password hash that was stored could not be migrated directly to the new system. The application had more than a quarter million users, so this would stink for them. To mitigate this, I used a rainbow table to reverse the stored password and feed it into the new software.  Thus, generate the hash in the new software so the user would not notice a difference. The amazing thing was that I used a very small rainbow table, and was able to reverse more than 98% of the quarter million hashes back into the original password in less than 10 minutes. That points to a gigantic hole in how most users choose passwords, and in the MD5 process as a whole.&lt;br /&gt;&lt;br /&gt;On top of that, the passwords that could not be undone also had some interesting patterns. The hash of 32 characters itself means nothing, but when a bunch of the hashes are exactly the same, it means that folks are using the same password.  This is surprising considering users are separated by thousands of miles, and have likely never met. I also noticed that the hash from my personal password, which couldn't be undone by the rainbow table, was in use by a few hundred different users. This confused me, because I thought my password would have been secure and random enough. I'm a DBA, so I always pick strong passwords that are very long compared to what I would term a ‘normal’ user.&lt;br /&gt;&lt;br /&gt;It turns out that the cause was simpler than I expected. I was migrating an application that had a higher percentage of technical users than a general group. These users were also using strong passwords in greater numbers than a general population. However, a bunch of users were using a password that is fast to type on a keyboard, while also being long enough to deter a rainbow table attack. It appeared a bunch of us had the same cycling of passwords (use one, then change to another, then another, and so on) as I found that some of the other hashes were previous passwords I had used. &lt;br /&gt;&lt;br /&gt;That leads to the 2nd type of vulnerability that exists in ANY password system, not just a MD5 or other hash process. This is called a dictionary attack (sometimes referred to as Brute Force). A dictionary attack means using words in a dictionary and trying them as passwords. Basically, each word is typed (thousands a second if the system allows it) until one works. This wouldn't be a problem for most strong passwords, as they are not actual words in the dictionary. But, sequences of numbers can still be tried, and exist in ‘hacker’ password dictionaries. For example, "q2w3e4r" is the upper left of the keyboard. "753159" is a sequence on the numeric keypad. Neither of these are actual words, but a quick look showed both exist in dictionary attack password lists that hackers can use. I did this same rough password frequency analysis on 3 other systems that have many thousands of users, and came up with roughly the same surprising answers. Different users were using the same passwords across systems that had absolutely nothing to do with each other. It's freaky, but it points to the ACTUAL weak link in a password system: the user and their habits.&lt;br /&gt;&lt;br /&gt;Here is something that should make some folks change their passwords. There is almost a 30% chance that your password (yes, the person reading this) is in this list of 30: 123, 1234, 12345, 123456, 666666, 7777777, 12345678, 123456789, password, blogger, qwerty, letmein, test, trustno1, dragon, abc123, 111111, hello, monkey, master, killer, 123123, ncc1701, thx1138, qazwsx, ou812, 8675309. Do you have that as a password to your banking site? What about your email? Welcome to an emerging field called social engineering. Social engineering tactics were used very recently by hackers to destroy the credibility of a firm called HBGary.  In fact, HBGary’s CEO stepped down on Tuesday as a result of that attack.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Best Practices&lt;/span&gt;&lt;br /&gt;If you use the same password across systems, if one is broken, every system that has that password can also be broken into as well. So here are the rules I suggest you follow for passwords:&lt;br /&gt;&lt;br /&gt;• Use different passwords for each system. If you have trouble remembering passwords, at &lt;span style="font-style:italic;"&gt;minimum &lt;/span&gt;use a different one for your email than everything else.  If your email account is broken, that means a hacker can reset your password on almost any site that exists.  The new password will be sent to your email, so the hacker will have it.&lt;br /&gt;• Don't bother using an uppercase letter, as almost all rainbow tables include upper case in the table. Use a non-alphanumeric character instead. This means something like "&amp;", "(" or "$". Bonus points for ALT-0160 or something like it.&lt;br /&gt;• Use passwords that are 7 characters long or longer if at all possible. 10 is better, even if the last 3 are spaces or the same character repeated.  If remembering long passwords are a problem, repeat the password 2 or 3 times to extend the length.  That will defeat a rainbow table, and most dictionary attacks.&lt;br /&gt;• Don't use a password that is on this list.  Those are the first passwords a hacker will try.   Trying those 500 passwords, even on a site with a 15 minute timeout for every 5 attempts, will only take about a day.&lt;br /&gt;• When installing any software application or hardware, always change the default password to something else.  Change the password on your router or Access Point; same with database or other programs.  It is amazing how many are still the default password, which can be pulled off a support website.&lt;br /&gt;&lt;br /&gt;This was just the tip of the iceberg, but hopefully it will assist folks with choosing secure passwords.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4267460819971064917?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cB0q8Gy5hiu9s9BWFxYNVmNgCj0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cB0q8Gy5hiu9s9BWFxYNVmNgCj0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cB0q8Gy5hiu9s9BWFxYNVmNgCj0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cB0q8Gy5hiu9s9BWFxYNVmNgCj0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/KBa2-KSLVqg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4267460819971064917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/03/passwords-hashes-and-dictionary-attacks.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4267460819971064917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4267460819971064917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/KBa2-KSLVqg/passwords-hashes-and-dictionary-attacks.html" title="Passwords, Hashes and Dictionary Attacks" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/03/passwords-hashes-and-dictionary-attacks.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIAR3w4eyp7ImA9WhZbFEk.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-7044791632257732368</id><published>2011-02-06T15:05:00.004-06:00</published><updated>2011-06-18T20:55:46.233-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-18T20:55:46.233-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="embird" /><category scheme="http://www.blogger.com/atom/ns#" term="Aperture Laboratories" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="Valve" /><category scheme="http://www.blogger.com/atom/ns#" term="portal" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery design" /><category scheme="http://www.blogger.com/atom/ns#" term="game" /><title>Aperture Laboratories Embroidery Design</title><content type="html">As a fan of portal, I had to try my hand at an Aperture Laboratories embroidery design that would go on a shirt as I was unable to find one anywhere.  This took roughly 4 hours to make and looks pretty good.&lt;br /&gt;
&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU8NmQX0OtI/AAAAAAAAAFo/vwrBLnMOnp0/s1600/ap%2Bscience.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 108px;" src="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU8NmQX0OtI/AAAAAAAAAFo/vwrBLnMOnp0/s320/ap%2Bscience.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5570686214961642194" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Obviously, you can use whatever thread color you want, but I think it looks good in black on a lighter colored shirt.  I recommend trimming the jump between the last letter in 'Aperture' once the 'E' is sewn so that the 'Laboratories' won't sew over the jump.&lt;br /&gt;
&lt;br /&gt;
You can download the &lt;a href="http://www.mediafire.com/?o7t8thlrgq8qzf7"&gt;embroidery file here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-7044791632257732368?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Rq5n0QrkXI4r7rrlpGJepuvEuys/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rq5n0QrkXI4r7rrlpGJepuvEuys/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Rq5n0QrkXI4r7rrlpGJepuvEuys/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Rq5n0QrkXI4r7rrlpGJepuvEuys/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/YefVO8Vpwdo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/7044791632257732368/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/02/aperture-laboratories-embroidery-design.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/7044791632257732368?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/7044791632257732368?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/YefVO8Vpwdo/aperture-laboratories-embroidery-design.html" title="Aperture Laboratories Embroidery Design" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU8NmQX0OtI/AAAAAAAAAFo/vwrBLnMOnp0/s72-c/ap%2Bscience.JPG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/02/aperture-laboratories-embroidery-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIAQnYyeCp7ImA9Wx9UEE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-143196120541298501</id><published>2011-02-05T12:00:00.000-06:00</published><updated>2011-02-06T14:35:43.890-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T14:35:43.890-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GIR" /><category scheme="http://www.blogger.com/atom/ns#" term="embird" /><category scheme="http://www.blogger.com/atom/ns#" term="se-400" /><category scheme="http://www.blogger.com/atom/ns#" term="LB6800PRW" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="sewing" /><category scheme="http://www.blogger.com/atom/ns#" term="Invader Zim" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery design" /><title>Invader Zim embroidery design - GIR in disguise</title><content type="html">Here is another design that I created of GIR from Invader Zim in disguise.  I am learning to get around the limitations in the Embird design software, but it still took about 5 hours to do this simple design. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_QVTrdrf9ls4/TU8FnY72iKI/AAAAAAAAAFg/mlCTX12o3YE/s1600/gir_dog.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_QVTrdrf9ls4/TU8FnY72iKI/AAAAAAAAAFg/mlCTX12o3YE/s320/gir_dog.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5570677438347118754" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;As you can see, I also did not compensate enough for the amount the cheap fabric would pull in the direction of the stitches.  You can see a little of the fabric in the lower left of GIR's left eye and under his tongue.  This appears to be more of an issue with the fabric.  I fixed the design, and the 2nd one came out fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-143196120541298501?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/QUPuUyvLQ87fTjXL7HaNlmq8G-w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QUPuUyvLQ87fTjXL7HaNlmq8G-w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/QUPuUyvLQ87fTjXL7HaNlmq8G-w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/QUPuUyvLQ87fTjXL7HaNlmq8G-w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/RFu9OHIbq2s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/143196120541298501/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/02/invader-zim-embroidery-design-gir-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/143196120541298501?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/143196120541298501?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/RFu9OHIbq2s/invader-zim-embroidery-design-gir-in.html" title="Invader Zim embroidery design - GIR in disguise" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_QVTrdrf9ls4/TU8FnY72iKI/AAAAAAAAAFg/mlCTX12o3YE/s72-c/gir_dog.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/02/invader-zim-embroidery-design-gir-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkINQH44fip7ImA9Wx9UEE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4674453120714315981</id><published>2011-02-04T12:00:00.001-06:00</published><updated>2011-02-06T14:36:31.036-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T14:36:31.036-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GIR" /><category scheme="http://www.blogger.com/atom/ns#" term="embird" /><category scheme="http://www.blogger.com/atom/ns#" term="Brother-PE" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="Invader Zim" /><category scheme="http://www.blogger.com/atom/ns#" term="brother" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery design" /><title>Invader Zim embroidery design - GIR</title><content type="html">2 friends of mine is really into Invader Zim, so I wanted to embroider GIR onto something for them.  Suprisingly, there are not that many designs out there.  I found 2 at &lt;a href="http://www.needlework.ru/shop/UID_1024.html"&gt;Needle&lt;/a&gt;&lt;a href="http://www.needlework.ru/shop/UID_1020.html"&gt;work&lt;/a&gt;, but the site design worries me.  So I decided to make my own design from scratch in Embird.&lt;br /&gt;&lt;br /&gt;I had been playing with fonts in Embird, so I decided to try the digitizing software.  It is nothing like I expected.  I was expecting the digitizing software to import a design, and get 80% of the way to done automatically.  I can even think of how the algorithm would work in my head, so I didn't even think that there was another option on how the software worked.&lt;br /&gt;&lt;br /&gt;The software doesn't work anything like that.  The steps to digitize a design are (at a high level) these:  &lt;br /&gt;1. Import a picture or design as a background image.  &lt;br /&gt;2. Draw objects on top of the background image.&lt;br /&gt;3. Switch colors at strategic points.&lt;br /&gt;4. Draw objects in next color&lt;br /&gt;5. Draw the outline&lt;br /&gt;6. Test the design using the sewing emulator&lt;br /&gt;7. Save as whatever format your machine takes&lt;br /&gt;8. Embroider on your machine.&lt;br /&gt;&lt;br /&gt;There is absolutely no help in actually digitizing the design to stitches in the software, you have to draw it manually.  There are different types of objects (circles, columns, fill patterns, etc) that help, so you are not controlling each stitch manually (though you can), but it is not fast to do. Again, the actual software itself is extremely esoteric and slows you down substantially.&lt;br /&gt;&lt;br /&gt;It took roughly 8 hours to do the first design that I tried.  It worked out pretty well and I learned a ton.  The fact it took so darn long kind of explains why designs are so expensive.  If this was a business and it takes 8 hours to do a design, then I need to sell at least 40 of the design itself at $5 to make up for the time spent making the design.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU7x6TFuFDI/AAAAAAAAAFY/1Lu3mBC7za4/s1600/gir%2Brobot.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU7x6TFuFDI/AAAAAAAAAFY/1Lu3mBC7za4/s320/gir%2Brobot.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5570655772962853938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One of the big learnings is that the pull of the thread is substantial in the direction of the stitch.  Looks to be roughly 0.5mm or so in the fabric I was using.  This means the fill areas must be expanded to make up for the difference so you don't get unfilled areas.  That can be compensated for in the design as long as you think ahead.&lt;br /&gt;&lt;br /&gt;The other big learning (that I already knew really) is that the software doesn't do nearly as much as I would expect, especially for $450.  I'm glad I am using the demo version.  The Brother-PE software isn't much better, though it will do 1 color automatic digitizing.  There is a ton of room for new players in the embroidery software space, mayhaps I will make my own open-source version that is much more user friendly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4674453120714315981?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/C30kkAuD-2-Sl-1iaMbG_b3j8q8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C30kkAuD-2-Sl-1iaMbG_b3j8q8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/C30kkAuD-2-Sl-1iaMbG_b3j8q8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/C30kkAuD-2-Sl-1iaMbG_b3j8q8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/tmxeZtGrGE0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4674453120714315981/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/02/invader-zim-embroidery-design-using.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4674453120714315981?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4674453120714315981?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/tmxeZtGrGE0/invader-zim-embroidery-design-using.html" title="Invader Zim embroidery design - GIR" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU7x6TFuFDI/AAAAAAAAAFY/1Lu3mBC7za4/s72-c/gir%2Brobot.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/02/invader-zim-embroidery-design-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4AR3Y7cCp7ImA9Wx9UEE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-7950914746896092618</id><published>2011-01-30T22:00:00.000-06:00</published><updated>2011-02-06T13:35:46.808-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T13:35:46.808-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="embird" /><category scheme="http://www.blogger.com/atom/ns#" term="se-400" /><category scheme="http://www.blogger.com/atom/ns#" term="LB6800PRW" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="sewing" /><category scheme="http://www.blogger.com/atom/ns#" term="monogram" /><category scheme="http://www.blogger.com/atom/ns#" term="font" /><category scheme="http://www.blogger.com/atom/ns#" term="brother" /><title>Monogramming in Embird</title><content type="html">About 2 weeks ago, I picked up a Brother sewing machine that does embroidery.  Unfortunately, the built in fonts left much to be desired around lock stitches so that the thread doesn't unravel.  I also wanted to do some of my own designs.&lt;br /&gt;&lt;br /&gt;As for monogramming, I needed to do a bib for a baby shower.  The mom hasn't decided on a name yet, so the group picked D'artagnan to refer to the baby.  Before I got the machine, I decided to do a bib with D'artagnan on it.  Can't get more cute than that. &lt;br /&gt;&lt;br /&gt;However, since the fonts on the machine stunk out loud, I needed to do my own.  So I looked around for software to build designs, and found &lt;a href="http://www.embird.com/"&gt;Embird&lt;/a&gt;. There aren't really that many options in software, likely because the audience is so small.  Embird works out to about $450 with the font engine; thankfully they have a demo version because the sewing machine was less than that.&lt;br /&gt;&lt;br /&gt;The font engine works pretty well, but it has a pretty steep learning curve.  It took me about 6 hours to make the first design I was happy with; something that I would think should take about 10 minutes.  The tool is not designed with the user in mind, the program is very esoteric. The help actually takes over the program and shows you what to click to do certain things, but it takes forever to run.&lt;br /&gt;&lt;br /&gt;What I was happy with is that the program allows you to simulate sewing, so you can see each stitch and where the jumps and locks will end up being.  his allowed me to see (slowly) where I needed to modify the design without testing it on fabric.&lt;br /&gt;&lt;br /&gt;After lots of tweaking and attempts, I ended up with a design that has 2,159 stitches.  I hooked up the usb and transferred the design to the sewing machine, put in some thread, and let the machine so the work.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU7rfW_ye-I/AAAAAAAAAFQ/Osu0HwIFd9I/s1600/bib.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU7rfW_ye-I/AAAAAAAAAFQ/Osu0HwIFd9I/s320/bib.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5570648713085484002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Not too shabby; I would consider it a success.  Despite the shortcomings in Embird, the software gets the job done.  The bad part is the insane price.  If it was about $100, I would consider buying it, but at more than the machine, it isn't going to happen; demo it is.  If I was doing this as a business, I would probably get it, but that isn't going to happen at this price.  Embird should have 2 license options, one for personal and 1 for commercial, like lots of other programs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-7950914746896092618?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lLvd3JSbAjkfXYIcqqQ5_O3OnAc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lLvd3JSbAjkfXYIcqqQ5_O3OnAc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lLvd3JSbAjkfXYIcqqQ5_O3OnAc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lLvd3JSbAjkfXYIcqqQ5_O3OnAc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/BWTqZxcUWRo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/7950914746896092618/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/02/monogramming-in-embird.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/7950914746896092618?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/7950914746896092618?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/BWTqZxcUWRo/monogramming-in-embird.html" title="Monogramming in Embird" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU7rfW_ye-I/AAAAAAAAAFQ/Osu0HwIFd9I/s72-c/bib.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/02/monogramming-in-embird.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQXc7eyp7ImA9Wx9UEUw.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-7510415129802644808</id><published>2011-01-23T12:00:00.001-06:00</published><updated>2011-02-07T15:48:40.903-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-07T15:48:40.903-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="se-400" /><category scheme="http://www.blogger.com/atom/ns#" term="LB6800PRW" /><category scheme="http://www.blogger.com/atom/ns#" term="embroidery" /><category scheme="http://www.blogger.com/atom/ns#" term="sewing" /><category scheme="http://www.blogger.com/atom/ns#" term="brother" /><title>Brother LB6800PRW &amp; SE400 Sewing Machine</title><content type="html">One of the things I needed to pick up for my new place was a sewing machine.  Yes, I do some sewing every once and a while, such as some Adventure Time Finn hats, or a Ice King costume. Previously, I always borrowed some elses machine.  Now that I have some room, I wanted to get my own.&lt;br /&gt;&lt;br /&gt;I looked around for a while, and decided to get a Brother machine.  I was going to get a regular sewing machine, but it was only about $50 extra for one that could also do embroidery.  The machine I decided to get was the Brother LB6800PRW.  This is exactly the same as the SE-400, except it comes with a carry-cart for portability, and has some 'project runway' branding on it.  Both have a 100mm by 100mm embroidery field (4 inches by 4 inches). The LB6800PRW was only a few dollars more than the SE-400, and the bag will at least keep the dust off the machine once I get bored with it.  Both the SE-400 and the machine i got have 512k of memory that can be accessed though USB, so you can make and load embroidery patterns from a computer.  I don't understand why that is even optional, all embroidery machines should allow USB connectivity, there is more than just letters to embroider.  Software to make your own embroidery is another matter, as nothing comes with the machine.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU43VPPCV1I/AAAAAAAAAE4/yh9X7ICxCb4/s1600/NewSewingMachine.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU43VPPCV1I/AAAAAAAAAE4/yh9X7ICxCb4/s320/NewSewingMachine.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5570450627110262610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The machine has a touch screen for choosing stitches and built in patterns, which I like.  I don't like that the default stitch is one that I will never use (left stitch instead of centered in the foot), but I got used to always changing it pretty quickly.   The auto-threader is awesome as well, threading the needle was usually a pain, especially with thicker thread.  No issues on this one.&lt;br /&gt;&lt;br /&gt;The first thing I did was make some curtains for a small half-moon window in my bedroom.  There is an annoying streetlight right on the other side, so it definitely needed a curtain.  Trimming one from the store to 24" ling solved the problem nicely.  The machine did great, though it was only about 40 inches of sewing.  No issues to speak of.&lt;br /&gt;&lt;br /&gt;Once that was completed (and I mounted the curtains), I wanted to try out the embroidery functions.  There were 2 main projects I wanted to use the machine for (and what drove me to pay $50 extra for an embroidery machine).  Those were a custom shirt for someone at work, and a baby bib for a friend who is having a baby.  the first thing I tried was putting my name on a towel.  That failed miserably because I did not use a stabilizer.  The instructions said it was 'recommended' to use one, but it is actually pretty much required. &lt;br /&gt;&lt;br /&gt;I tried putting my name on a napkin with the built in embroidery font.  It looked fine when I took it out of the machine, but as i started to trim the jumps between letters, the thread started unraveling.  I put it back in the machine and embroidered my name right over the existing one again, and paid more attention to what the machine was doing.  Sure enough, the machine was not locking the thread at the beginning and end of each letter (backing up and going over the thread again to keep it from unraveling).  That's a pretty big oversight in the programming.  I was able to get around it by manually going over the end of each letter.  Still, a giant PITA, and the results didn't look as good as I would have liked.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU431-aDLSI/AAAAAAAAAFA/Px0vhEL3PcI/s1600/NapkinEvad.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU431-aDLSI/AAAAAAAAAFA/Px0vhEL3PcI/s320/NapkinEvad.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5570451189528735010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I also broke a needle by following the instructions.  They state to gently hold the tread for the first few stiches, so the thread doesn't pull out of the needle.  Well, gentle is actually 'not at all' as the needle can take a very small amount of force before bending enough (about 1 mm) to hit the foot and break.  So I swapped out the needle, and made my first accessory purchase, a pack of 100 needles (about $20, not bad).&lt;br /&gt;&lt;br /&gt;I did try some graphical embroidery as well.  I looked around for some patterns (besides the ones on the machine) and found that they almost all cost a decent amount of money.  I saw a Disney set of 10 designs for $20, that's crazy high for non-commercial use.  The designs must take a long time to create, or something is driving prices way up (low supply?).  I found a free dragon finally, and put it on a wash towel using some thread I had laying around.  It actually looked pretty good, and the design had the lock stitches built into it correctly.  It was actually a surprising amount of stitches, more than 10,000 if I remember correctly.  It took about 20 minutes for the machine to sew it, so the machine averaged a little over 300 stitches per minute.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU44Gnt5JEI/AAAAAAAAAFI/WwEimMvq9V0/s1600/TowelDragonClose.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_QVTrdrf9ls4/TU44Gnt5JEI/AAAAAAAAAFI/WwEimMvq9V0/s320/TowelDragonClose.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5570451475495724098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All in all, the LB6800PRW machine is worth the $400 it cost, I recommend it.  You can save about $10 if you get the SE-400 instead, as it will not have the bag/cart to store it in.  Besides that, the machines are the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-7510415129802644808?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/VY4rQvlUFgyyUWwxWYjW1-FDpN4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VY4rQvlUFgyyUWwxWYjW1-FDpN4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/VY4rQvlUFgyyUWwxWYjW1-FDpN4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/VY4rQvlUFgyyUWwxWYjW1-FDpN4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/qU_0PJeKfnY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/7510415129802644808/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/7510415129802644808?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/7510415129802644808?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/qU_0PJeKfnY/brother-lb6800prw-se400-sewing-machine.html" title="Brother LB6800PRW &amp; SE400 Sewing Machine" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_QVTrdrf9ls4/TU43VPPCV1I/AAAAAAAAAE4/yh9X7ICxCb4/s72-c/NewSewingMachine.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2011/01/brother-lb6800prw-se400-sewing-machine.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIDR389eCp7ImA9Wx5SGEQ.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4644585346298806583</id><published>2010-08-15T13:16:00.000-05:00</published><updated>2010-08-15T13:22:56.160-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-15T13:22:56.160-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="x64" /><category scheme="http://www.blogger.com/atom/ns#" term="Realtek" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows 7" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Gigabit" /><category scheme="http://www.blogger.com/atom/ns#" term="Network adapter" /><title>Installing Linksys EG1032 V3 Gigabit Network card on Windows 7 x64</title><content type="html">It figures that Linksys doesn't make a x64 driver for their EG1032 V3 gigabit card that I got many years ago.  I kinda figured that Windows 7 would be able to find a driver for it anyway, but no such luck.&lt;br /&gt;&lt;br /&gt;Well, after some research (and trial and error) I figured out a solution.  The EG1032 is built upon a realtek chipset, so why not just use their driver?  It turns out that works perfectly.  Here are the steps to install a driver:&lt;br /&gt;&lt;br /&gt;1. In Windows Device Manager, open the network adapter that doesn't have the driver installed and click on Update Driver Software.&lt;br /&gt;&lt;br /&gt;2. Choose Browse My Computer&lt;br /&gt;&lt;br /&gt;3. Choose Let me Pick&lt;br /&gt;&lt;br /&gt;4. Choose Network Adapters&lt;br /&gt;&lt;br /&gt;5. Wait for the list to populate, then choose 'Realtek' in the left column and '8169/8110 Family' in the right column&lt;br /&gt;&lt;br /&gt;6.  A popup will come up warning you that this is not recommended because windows can't verify the hardware and driver are comparable. Click OK.&lt;br /&gt;&lt;br /&gt;7.  Driver will install, and will now work.  Hooray.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4644585346298806583?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/y9ZkM5xD221olqvAH6kQp2uBHxA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y9ZkM5xD221olqvAH6kQp2uBHxA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/y9ZkM5xD221olqvAH6kQp2uBHxA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/y9ZkM5xD221olqvAH6kQp2uBHxA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/8hhC0D4TRvg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4644585346298806583/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2010/08/installing-linksys-eg1032-v3-gigabit.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4644585346298806583?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4644585346298806583?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/8hhC0D4TRvg/installing-linksys-eg1032-v3-gigabit.html" title="Installing Linksys EG1032 V3 Gigabit Network card on Windows 7 x64" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2010/08/installing-linksys-eg1032-v3-gigabit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcEQH84cSp7ImA9Wx5SF0s.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4209516940417844019</id><published>2010-08-14T00:00:00.000-05:00</published><updated>2010-08-14T00:00:01.139-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-14T00:00:01.139-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RAID5" /><category scheme="http://www.blogger.com/atom/ns#" term="RAID10" /><category scheme="http://www.blogger.com/atom/ns#" term="Storage" /><category scheme="http://www.blogger.com/atom/ns#" term="Redundancy" /><category scheme="http://www.blogger.com/atom/ns#" term="RAID" /><category scheme="http://www.blogger.com/atom/ns#" term="NAS" /><category scheme="http://www.blogger.com/atom/ns#" term="RAID0" /><category scheme="http://www.blogger.com/atom/ns#" term="RAID6" /><category scheme="http://www.blogger.com/atom/ns#" term="Adaptec" /><title>RAID array failure probabilities</title><content type="html">I wrote up something on a forum to give an idea of failure rates for different RAID array types, and it ended up being a pretty good summary.&lt;br /&gt;&lt;br /&gt;Question: The storage guys seem to say to avoid RAID5 due to the huge storages sizes now and the high chance of errors during rebuilds&lt;br /&gt;&lt;br /&gt;The reason there would be an error when rebuilding a RAID5 array (leading to data loss) is if a 2nd disk failed (or a sector failed, etc) and that would be catastrophic to data. The most harrowing time (when you don't have backups) is during a rebuild of any single redundancy array (raid 1, 2, 3 4 or 5) because a 2nd disk failure will lead to data loss. On bigger disks, the rebuild time is longer, so the window for complete data loss is larger. On a hardware raid controller, this window is (best case) roughly equivalent to the sequential read speed (or write, whichever is lower) divided by disk capacity of a single disk in the array (assuming 50 MB/sec a RAID5 array will take 40,000 seconds or about 11.1 hours.) The NV+ takes roughly 20 hours (I know from experience)&lt;br /&gt;&lt;br /&gt;There are ways to mitigate this risk (besides backups, which are always required) by using different raid levels. For example, RAID6 is becoming the 'new' RAID5. RAID6 uses 2 different parity calculations, and stores both. This allows for 2 disks to fail without data loss. The trade-off is that you need another disk to make up for the data loss. the NV+ doesn't support RAID6 natively, but other products in the line do (They are the pro series from netgear that have 6 disks instead of 4, and cost about $1200 and are x86 based instead of SPARC). It should be technically feasible to write an add-in for the NV+ that will support RAID6 (since the minimum disks for RAID6 is 4, and the NV+ has 4) But RAID6 is usually for larger disk count arrays. Also, with a 4 disk count, RAID 10 will give the same amount of usable space, but me much faster in a software RAID environment with only slightly less fault tolerance. (RAID 10 can support 2 disk failures if they are the 'right' disks, but if the wrong 2 fail, you can still lose data)&lt;br /&gt;&lt;br /&gt;RAID5 is going to be slightly faster than RAID6 for the same size disk array because there are 2 parity calculations for RAID6 while RAID5 only has 1.&lt;br /&gt;&lt;br /&gt;RAID5 is way better than RAID0 from a safety standpoint, and gives more space than RAID1. Lets use a hypothetical situation (since I don't want to look up the actuals, but I will be pretty close. I will also simplify some of the math since we don't have to be perfect, just decently close.). The situation is that you have four 2 TB disks with a MTBF of 1M hours and a read/write speed of 50 MB/sec. (enterprise disks are usually 1.2M hours, and home user disks are usually around 800k hours, so 1M is a nice average, and allows for quicker math I can do in my head). Using those 4 disks, let's calculate some failure rates, data storage and speeds. We must also assume 'life of disks' to determine the possibility of data loss over the life of the array. Let's assume 3 years since that is most manufacturer's warranty period. Please also note that we are only calculating disk failures and not including things like hardware or software failure which can also destroy an array, even without a disk failure. For example, bad RAM can cause garbage to be written to an array. We will also only calculate this for 4 of the major RAID levels: 0, 5, 6, and 10.&lt;br /&gt;&lt;br /&gt;RAID0 - Total space is the sum of the disk sizes (2TB*4 or 8 TB). Speed will also be the sum of the disks (50 MB/sec * 4 or 200 MB/sec). The possibility of data loss during any given hour will be the MTBF of the disks divided by 4 since in RAID0 if any disk fails all data is lost. 3 years works out to be 365 * 24 * 4 * 3 hours of disk up time, which is 105120 hours total. With a MTBF of 1M hours, you end up with the possibility of data loss during the life of the array of 1M/105120 or 10.5&amp;#37;. That's very high at 1 in 10.&lt;br /&gt;&lt;br /&gt;RAID10 - Total space is the sum of the disk sizes divided by 2 (2TB*4/2 or 4 TB). Speed will be the speed of 2 disks (50 MB/sec * 2 or 100 MB/sec) Data will only be lost if the 'wrong' disk fails during a rebuild. That means we have to calculate the rebuild time (which we did above at 11 hours, but let's call it 10 for 'Evad is lazy' sake). So for 10 hours, there is a 1 in 1M chance per hour of a disk failure, and a further 50&amp;#37; probability the wrong disk fails. That works out to a 5 in 1M chance during the rebuild time. But you need to know how many times any disk will fail and cause a rebuild. That was calculated above at 10.5&amp;#37; over the life of 4 disks. So you end up with 10.5&amp;#37; chance of rebuild, and a 5 in 1M chance (0.0005%) of failure during that rebuild, or 0.105 * 0.000005 = 0.000000525 or 0.0000525%. Many orders of magnitude better better than RAID0. The trade off is that you lose 1/2 of the space.&lt;br /&gt;&lt;br /&gt;RAID5 - Total space is the sum of the disk sizes - 1 for parity or 6 TB. Speed will be the speed of 3 disks (50 MB/sec * 3 or 150 MB/sec) Data will only be lost if a 2nd disk fails during the rebuild. That means we have to calculate the rebuild time. So for 10 hours, there is a 1 in 1M chance per hour of a disk failure. That works out to a 10 in 1M chance during the rebuild time. But you need to know how many times any disk will fail and cause a rebuild. That was calculated above at 10.5% over the life of 4 disks. So you end up with 10.5% chance of rebuild, and a 10 in 1M chance (0.001%) of failure during that rebuild, or 0.105 * 0.000010 = 0.00000105 or 0.000105%. Many orders of magnitude better better than RAID0 but worse than RAID10. The trade off is that you have 25% less space than RAID0 and 50% more space than RAID10.&lt;br /&gt;&lt;br /&gt;RAID6 - Total space is the sum of the disk sizes - 2 for parity or 4 TB (Same as RAID10). Speed will be the speed of 2 disks (50 MB/sec * 2 or 100 MB/sec) Data will only be lost if a 3rd disk fails during the rebuild. That means we have to calculate the rebuild time, which is harder to do than RAId5. So for 10 hours, there is a 1 in 1M chance per hour of a single disk failure, but 2 more need to fail to lose data. That works out to 1/1M * 1/1M during the rebuild time (0.000001 * 0.000001 = 0.000000000001) But you need to know how many times any disk will fail and cause a rebuild. That was calculated above at 10.5% over the life of 4 disks. So you end up with 10.5% chance of rebuild, and a 0.0000000001% chance of another 2 disks failing during that rebuild, or 0.105 * 0.000000000001 = 0.0000000000000105 or 0.00000000000105%. Many orders of magnitude better better than RAID0, RAID10 and RAID5. The trade off is that you spend 2 disks to store parity information, so you have 50% of the actual space usable. RAID6 is also not supported on all devices.&lt;br /&gt;&lt;br /&gt;In terms of space, here is a summary:&lt;br /&gt;RAID0 - 8 TB&lt;br /&gt;RAID5 - 6 TB&lt;br /&gt;RAID6 - 4 TB&lt;br /&gt;RAID10 - 4 TB&lt;br /&gt;&lt;br /&gt;In terms of probability of failure over the life of the array (3 years):&lt;br /&gt;RAID0 - 10.5%&lt;br /&gt;RAID5 - 0.000105%&lt;br /&gt;RAID10 - 0.0000525%&lt;br /&gt;RAID6 - 0.00000000000105%&lt;br /&gt;&lt;br /&gt;In terms of speed:&lt;br /&gt;RAID0 - 200 MB/Sec&lt;br /&gt;RAID5 - 150 MB/sec&lt;br /&gt;RAID10 - 100MB/sec&lt;br /&gt;RAID6 - 100MB/sec&lt;br /&gt;&lt;br /&gt;In terms of dollars per usable TB (assume $100 per 2 TB hard drive)&lt;br /&gt;RAID0 - 8 TB / $400 = $50 per TB&lt;br /&gt;RAID5 - 6 TB / $400 = $67 per TB ($17 more than RAID0 to drop the rate from 10.5% to 0.000105%)&lt;br /&gt;RAID6 - 4 TB / $400 = $100 per TB ($33 more than RAID5 to drop the rate from 0.000105% to 0.00000000000105%)&lt;br /&gt;RAID10 - 4 TB / $400= $100 per TB (usually only chosen if small random writes are an issue such as a database or controller doesn't support RAID6, and RAID5 is too high risk.)&lt;br /&gt;&lt;br /&gt;Very long story short is that there are trade offs with each RAID level. You need to chose the one that is right for you based on your specific needs, budget and risk tolerance. For the majority of home users who use a NAS, RAID5 provides a good balance of fault tolerances and space per dollar spent in a 4 disk NAS. If we were to redo this with 6 or more bays, then RAID6 becomes a more attractive choice because the probability of a disk failure is higher the more disks exist in the array, and the cost starts approaching RAID5 levels. For example the cost per TB between a 20 disk RAID5 and RAID6 array using 2 TB disks is $52.6 vs $55.5.&lt;br /&gt;&lt;br /&gt;There are way more things to consider in different environments such as stripe size (which can waste space and affect speed) load on the array (high disk count parity arrays are bad for random writes because of the write-hole, such as databases while for media streaming parity arrays are fine) options on the controller (such as OCE or ORM and having a dedicated XOR processor). We also can't forget the fabled 'sympathy failure' of disks which may or may not increase the odds of concurrent disk failures if you 'believe' in them. The write-hole in RAID5 can also be solved by using something like RAID-Z.&lt;br /&gt;&lt;br /&gt;Clifs:&lt;br /&gt;RAID5 is fine for home users and way better than a bunch of single disks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4209516940417844019?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/o_konjGnnI-ufCsYLXqlGoMS_tY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o_konjGnnI-ufCsYLXqlGoMS_tY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/o_konjGnnI-ufCsYLXqlGoMS_tY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/o_konjGnnI-ufCsYLXqlGoMS_tY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/_hUPXJRZT5o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4209516940417844019/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2010/08/raid-array-failure-probabilities.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4209516940417844019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4209516940417844019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/_hUPXJRZT5o/raid-array-failure-probabilities.html" title="RAID array failure probabilities" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://evadman.blogspot.com/2010/08/raid-array-failure-probabilities.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cCSHk8fSp7ImA9WxFSEE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-2063453455277749373</id><published>2010-04-11T17:28:00.001-05:00</published><updated>2010-04-11T18:37:49.775-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-11T18:37:49.775-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Storage" /><category scheme="http://www.blogger.com/atom/ns#" term="shelf" /><category scheme="http://www.blogger.com/atom/ns#" term="Garage" /><category scheme="http://www.blogger.com/atom/ns#" term="workspace" /><title>House Update - Garage Storage</title><content type="html">For those of you that don't know, I bought a townhouse recently.  Now, I can work on improving the house instead of responding to email.&lt;br /&gt;&lt;br /&gt;I enjoy doing work with my hands when I have time; meaning woodworking, automotive, metalworking, building computers, anything really.  Pretty much all of those require a good workspace.  For me, that means the garage.  So naturally, the first area I picked to upgrade was the garage. &lt;br /&gt;&lt;br /&gt;I knew I wanted a workbench and lots of storage space.  In addition, I wanted to be able to disassemble whatever I used so I could move it to a new house if required.  Tack onto that a requirement that the company and design be around for a little while so I could add more space if I needed to without having to worry about matching designs.&lt;br /&gt;&lt;br /&gt;That left me a few options.  I decided to go with &lt;a href="http://www.gorillarack.com/"&gt;Gorilla Rack&lt;/a&gt;, which has been around for a while.  Their base design also hasn't changed, so it should be around if I want to add more matching space.  I chose to go with 17" wide rack that was 72" tall.  It sounds small, but I wanted to be able to fit most of the rack in the garage without encroaching on the garage door clear space. I could have went with the 96" tall, but one of the posts on each side would have had to have been cut to clear the beam over the garage.  I decided to stick with 72" tall for now.&lt;br /&gt;&lt;br /&gt;Gorilla Rack is purchased by the part, so you can design whatever you want. I decided to go with two 6' sections and one 4' section on each side. (they make 4', 6' and 8')  Three 6' sections would have been about 1" too long when you factor in the space required for the garage door safety eyes and the width of the uprights.  I decided to get three 4' shelves and nine 6' shelves.  The workbench area would require an additional 6' and 4' shelf for the work space.&lt;br /&gt;&lt;br /&gt;Then, I had to choose what I wanted for shelves.  Gorilla rack sells precut pieces, but they were $3 for a 2' section, and you would need 3 of them for a 6' shelf.  This is way too much when you can get the exact same thing in a 4x8 sheet for about 1/3rd the price.  I decided to go with a water resistant OSB that was 3/4" thick and cut it up.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Total Shelf Materials: $544.60&lt;/span&gt;&lt;br /&gt;17" x 72" uprights: 6 @ 24.99 Each&lt;br /&gt;17" x 36" uprights: 2 @ 15.49 Each&lt;br /&gt;72" rack beam (one side of a shelf): 20 @ 12.49 Each&lt;br /&gt;48" rack beam (one side of a shelf): 8 @ 8.79 Each&lt;br /&gt;48" x 96" 3/4" OSB: 4 @10.89 Each&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Assembling the Rack&lt;/span&gt;&lt;br /&gt;Assembly was a snap, just slide the beams into the uprights at the correct slot.  The 6' beams required a tie in the middle that was assembled with a screwdriver and 10mm socket.  The only 'gotcha' is that if your floor isn't level, it will be difficult to slide the beams together.  I used scrap OSB under the legs to make up the height difference.  Later, I will weld up some spacers out of some mild steel.&lt;br /&gt;&lt;br /&gt;I planned out the shelving material when I was working on the layout of the garage. A 4'x8' piece was the cheapest, and gave me the least amount of waste with three 6' shelves and one 4' shelf per 4'x8' OSB sheet.  I cut 15 3/16" off of one of the 4' ends of the sheet for a 4' shelf, then cut the remainder into three 6' shelves at 71 3/4" long by 15 3/16" wide.  That left a 3"x96" and a 48"x9" piece of scrap per sheet of OSB.  Using 4 complete sheets would give me four 4' shelves and twelve 6' shelves, which was 2 more than I needed.  I decided to cut them anyway, and save them in case I decided to add more shelves later.  In order to cut the sheets, I used an old craftsman circular saw, a drywall t-square to draw the liens and a 2x4x8 to space the OSB off the floor for when I was cutting it.  I also used a 30' retractable extension cord that I bought specifically for my new garage about a year ago.  I also picked up some safety glasses, as most of mine were getting pretty scratched up.    Couldn't forget a broom to clean up the sawdust either.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Extra Planning Materials: $53.47&lt;/span&gt;&lt;br /&gt;2x4x8: 1 @ 2.18 Each&lt;br /&gt;7 1/4" 24 tooth sawblade 1 @ 14.38 Each Pack (3 pack)&lt;br /&gt;x-lens safety glasses: 1 @ 8.97 Each&lt;br /&gt;18" smooth surface broom: 1@ 9.96 - $4 rebate&lt;br /&gt;Dustpan and dustpan broom: 1 @ 17.99&lt;br /&gt;Folding Chair: 1 @ 5.99 - $2 rebate&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Stuff: &lt;/span&gt;&lt;br /&gt;Pen&lt;br /&gt;Drywall T-Square&lt;br /&gt;Circular saw&lt;br /&gt;Measuring tape&lt;br /&gt;Extension cord&lt;br /&gt;#2 Philips screwdriver&lt;br /&gt;10mm socket and wrench&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Before and after shots:&lt;/span&gt;&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&amp;hl=en_US&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FEvadman%3Falt%3Drss%26kind%3Dphoto%26access%3Dpublic%26psc%3DF%26q%26uname%3DEvadman" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-2063453455277749373?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rZTd7HVo_mmkI-R_zjMJULRcsu8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rZTd7HVo_mmkI-R_zjMJULRcsu8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rZTd7HVo_mmkI-R_zjMJULRcsu8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rZTd7HVo_mmkI-R_zjMJULRcsu8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/JKt8ljOk5J4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/2063453455277749373/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2010/04/house-update-garage-storage.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/2063453455277749373?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/2063453455277749373?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/JKt8ljOk5J4/house-update-garage-storage.html" title="House Update - Garage Storage" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2010/04/house-update-garage-storage.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEcEQHY4eip7ImA9WxNSFU8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-5484701236837873156</id><published>2009-08-29T00:00:00.000-05:00</published><updated>2009-08-29T00:00:01.832-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-29T00:00:01.832-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Email" /><category scheme="http://www.blogger.com/atom/ns#" term="Communication" /><title>A Ramble on Email</title><content type="html">Just how much of our current communication goes though a communication channel that is not face to face?  This is a question I was thinking about today when I was asked about my email inbox status. How many of us take for granted our email?  We can communicate with others on the other side of the earth in minutes instead of weeks for a paper letter.&lt;br /&gt;&lt;br /&gt;Having said that, how many of us use email incorrectly?  I know I do.&lt;br /&gt;&lt;br /&gt;I usually tell people to email me instead of call me.  The reasoning for this is because if I have the information in email, I can't lose it between cracks in the desk or delete a voice mail on accident.  But that opens up a new issue of having to track all that email.  It can also make the conversation take longer than a phone call or to have a detached feel.  However, on the upside, it allows me to have the conversation at my pace and at my time, instead of the caller's pace and time.&lt;br /&gt;&lt;br /&gt;So far, I have gotten 306 emails today that were not moved to a another folder by the rules I have created.  Of these 306, I only needed to reply to 39 of them, and a total of 97 were 'useful' to me in some fashion.  The rest were notifications of unrelated project status, something I was copied on and didn't need to action, or something I didn't even need to see.  That puts the 'usefulness' percentage of email to about 32% for me today.  The other 68% wasn't spam, but it wasn't required from my point of view.&lt;br /&gt;&lt;br /&gt;Like most, I use folders to organize the emails I get into projects or people or something like that.  I also have 37 rules that sort my inbound email into different folders so I can review the most important emails first.  Without those rules, I would be drowning in a sea of electronic paper.  As a side note, The spam filter used here at work also has to be one of the best on the planet; I have gotten exactly 2 spam emails in the last 7 years or so.  That has to be a record or some sort.&lt;br /&gt;&lt;br /&gt;Remember the 306 emails I mentioned earlier?  Let's put some time behind that number.  Assuming it takes me 20 seconds to read an email and 30 seconds to craft a response, those 306 emails took up 122 minutes of my day today.  A full 2 hours doing nothing but responding to email.  What is the likelihood that those 2 hours were spent doing the most productive thing I could be doing?&lt;br /&gt;&lt;br /&gt;What are the total stats on my email inbox?  If you really must know, here you go.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_QVTrdrf9ls4/SphgAHSl13I/AAAAAAAAABg/6pFYooqU1Og/s800/Full%20Folder.jpg"&gt;&lt;br /&gt;&lt;br /&gt;My full inbox accounts for 16.9 gigabytes, and most of those emails don't have attachments since I have a process that moves attachments from email and stores them in the file system once the email hits a certain age.  Picking one folder (inbox) at 26 MB which contains 1149 emails, the average size of an email that I don't delete is about 22Kb.  That means my total email count is around 750,000.  A full three quarters of a million.  I have had this account for about 7 years, so on average I have kept about 290 emails per day.  Assuming a 10 hour workday, that is one email every 148 seconds.  That also means I have spent 4166 hours in the last 7 years just reading email at 20 seconds per email.  There are only 2080 hours in a standard year of work.&lt;br /&gt;&lt;br /&gt;So here I sit, writing an article about reading and writing too many emails.  What has the world come to?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-5484701236837873156?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/BZUcIx6mEy8boKrZ4WaHY-tB6aM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BZUcIx6mEy8boKrZ4WaHY-tB6aM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/BZUcIx6mEy8boKrZ4WaHY-tB6aM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/BZUcIx6mEy8boKrZ4WaHY-tB6aM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/iN8dZ9uy6rg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/5484701236837873156/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2009/08/ramble-on-email.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/5484701236837873156?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/5484701236837873156?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/iN8dZ9uy6rg/ramble-on-email.html" title="A Ramble on Email" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_QVTrdrf9ls4/SphgAHSl13I/AAAAAAAAABg/6pFYooqU1Og/s72-c/Full%20Folder.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://evadman.blogspot.com/2009/08/ramble-on-email.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEACQHozeCp7ImA9Wx9UEE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4685472212349671998</id><published>2008-07-10T22:00:00.000-05:00</published><updated>2011-02-06T15:12:41.480-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T15:12:41.480-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="NaN" /><category scheme="http://www.blogger.com/atom/ns#" term="Numeric" /><title>Javascript and Numbers</title><content type="html">Today I was working on improving a javascript function that sorts an HTML table that I originally wrote about 5 years ago.&lt;br /&gt;&lt;br /&gt;The problem that I have is that I am a novice in javascript.  Well, novice is probably overestimating my capabilities in actuality.  But anyway, I still needed to improve this function, and learn along the way.&lt;br /&gt;&lt;br /&gt;The function checks the first cell in the first row of a table in an attempt to determine the data type of the column.  This is important when looking at numbers and dates.  For example numerically, these numbers (1, 3, 2, 4, 30 , 10) would expect to be sorted as (1, 2, 3, 4, 10, 30).  However if sorted as text, you end up with (1, 10, 2, 3, 30, 4). That is not what I was trying to do, but that is what my code kept throwing out.  Same with any decimal numbers, especially when the decimal point was in different spots (Different precision).&lt;br /&gt;&lt;br /&gt;Previously, I was using a regular expression to match numeric values.  I was using the expression /^[\d\s]+$/ which leaves a lot to be desired.  Besides the overhead of using an regular expression to begin with.  &lt;br /&gt;&lt;br /&gt;My first thought was to use a string parser and just look for the numbers 0-9 and the +- and decimal characters.  However that would attempt to sort a value of '++0124.543.56.4-8;' as a number.  I could have written in a check to see if there was exactly one + or - and exactly 1 decimal point, but that would have been a messy bit of code.  It may have worked but it would look bad and be low on performance.&lt;br /&gt;&lt;br /&gt;Then I thought about some of my VB experience and decided to apply it to the problem.  Why try to see if the number is a number? why not just try to convert it and let the javascript engine handle it.  Odds are the javascript engine programmers are way smarter than I will ever be.&lt;br /&gt;&lt;br /&gt;With that in mind, I wrote a quick function.  And by quick I mean one line.  Here it is.&lt;br /&gt;&lt;br /&gt;function IsNumeric(checkStr){return checkStr.length &gt; 0 &amp;&amp; (checkStr - 0) == checkStr;}&lt;br /&gt;&lt;br /&gt;The function IsNumeric takes one input string.  The function does 2 comparisons to that string, and both must return true in order for the fucntion to return true. First, the input string must have a non-zero length.  This is done because a string of length zero should not be considered a number.  The second check is a little more complicated.&lt;br /&gt;&lt;br /&gt;First, javascript doesn't have explicit type conversion.  Meaning I can't cast a variable as a double.  But we can force the javascript engine to use the string as a number by trying to subtract a zero from it.  If the conversion to a number fails, the javascript engine will return a NaN, meaning Not a Number.  Finally, the now numeric checkStr is compared to the input string to see if they are equal.  If they are, true will be returned.&lt;br /&gt;&lt;br /&gt;I was unable to find a number that returns false or a string that returns true, so this seems pretty solid.  If you have a better solution, I would love to hear about it.  Please post it in the comments section.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4685472212349671998?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/uj-SqF6-Qmh1gXQMnDJ4wNiobPU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uj-SqF6-Qmh1gXQMnDJ4wNiobPU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/uj-SqF6-Qmh1gXQMnDJ4wNiobPU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/uj-SqF6-Qmh1gXQMnDJ4wNiobPU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/FGNrd1SANGI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4685472212349671998/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2009/07/javascript-and-numbers.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4685472212349671998?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4685472212349671998?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/FGNrd1SANGI/javascript-and-numbers.html" title="Javascript and Numbers" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2009/07/javascript-and-numbers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAARX0yeCp7ImA9Wx9UEE8.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-8132344501411014897</id><published>2007-06-18T21:00:00.000-05:00</published><updated>2011-02-06T15:12:24.390-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-06T15:12:24.390-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="VB.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Images" /><category scheme="http://www.blogger.com/atom/ns#" term="Cryptology" /><category scheme="http://www.blogger.com/atom/ns#" term="Checksum" /><category scheme="http://www.blogger.com/atom/ns#" term="Pictures" /><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Hash" /><category scheme="http://www.blogger.com/atom/ns#" term="SHA1" /><category scheme="http://www.blogger.com/atom/ns#" term="SHA2" /><category scheme="http://www.blogger.com/atom/ns#" term="MD5" /><category scheme="http://www.blogger.com/atom/ns#" term="Database" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><category scheme="http://www.blogger.com/atom/ns#" term="CRC32" /><title>Duplciate Images &amp; MD5/SHA Hashes</title><content type="html">I was in the middle of backing up some family photos when I discovered that I had multiple copies of the same image in different folders.  Not only is this a waste of space, but it can also lead to images getting deleted on accident when you &lt;i&gt;believe&lt;/i&gt; you have a copy in another folder, but actually do not. &lt;br /&gt;&lt;br /&gt;That begs the question, how in the world do you sort though thousands of photos making sure that you keep one, and only one copy of each?  If you haven't renamed the files, you may be able to use the file name to weed though the duplicates, but what if you renamed some of the files, or have duplicate names on files?  Now it starts getting a lot more complicated.&lt;br /&gt;&lt;br /&gt;There are some commercial products you can buy that will do some of this image verification, but I had much bigger plans.  In addition to just removing duplicates, I wanted to be able to add tags to images, verify that images that were backed up did not become corrupted, and a host of other things that I will write about later.  To start off with, I just wanted to remove duplicates.  I decided to do that though creating a checksum for the file.&lt;br /&gt;&lt;br /&gt;Think of a checksum as verification that the file is exactly as it is supposed to be.  You will often find checksums on files that are being downloaded so that you can verify that the file received was not corrupted during the transfer, or by a cracker who decided to implant a virus in your download.&lt;br /&gt;&lt;br /&gt;There are lots of different types of checksums, 3 of the most popular are &lt;a href="http://en.wikipedia.org/wiki/Cyclic_redundancy_check"&gt;CRC32&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/MD5"&gt;MD5,&lt;/a&gt; and the different &lt;a href="http://en.wikipedia.org/wiki/SHA_hash_functions"&gt;SHA&lt;/a&gt; functions.  The issue with CRC32 is that collisions are very frequent compared to md5 or the SHA hashes.  In the way I am using hashes, a collision is when 2 different files create the same hash at the end.  Since I will be removing any files with the same hash, a collision would result in the deletion of a file that isn't actually a duplicate.  &lt;br /&gt;&lt;br /&gt;That leaves out CRC32, but what about MD5 and the SHA functions?  MD5 hashes have been used for years (and still used) to store data like passwords for web sites for a bunch of reasons.  However, this is bad because MD5 hashes of passwords can be broken using several techniques like plain old brute forcing or though rainbow tables.  But how will an MD5 or SHA1 hash do on finding duplicate files?  Actually, very well in fact.  The probability of a collision for a given MD5 or SHA1 hash is extremely low, however it is not impossible.  &lt;a href="http://www.mscs.dal.ca/~selinger/md5collision/"&gt;Here&lt;/a&gt; is a great article on the subject.  However, generating MD5 or SHA1 hashes of files is a pretty quick operation, so both are viable options.&lt;br /&gt;&lt;br /&gt;When you get down to it though, I don't like living with an error rate that I can describe without using decimal notation.  So since both MD5 and SHA1 checksums can be generated in a second or two, even on a slow machine, why not generate both for each file?  The odds of both a MD5 and SHA1 hash returning identical values for different files is roughly the same as every atom in your body deciding to &lt;a href="http://en.wikipedia.org/wiki/Uncertainty_principle"&gt;rearange itself on Mars&lt;/a&gt;.  That is an error rate I can live with.&lt;br /&gt;&lt;br /&gt;Generating all these hashes manually is a crazy proposition.  Thankfully, Visual Studio has methods for creating hashes of the most popular types of data though the System.Security.Cryptography namespace.  using this, I was able to create a quick function that would generate an MD% or any of the SHA hashes for a given file.  That way, I could create a quick script to loop though all the image files and save their critical data to a database. (File location, name, and hashes)  Then, it is a simple matter to write a query that returns only unique files, and save those off somewhere while removing the duplicates.&lt;br /&gt;&lt;br /&gt;The below VB.NET function called GetHashForFile takes a file location and an enum that represents the hash type to generate.  In order to generate both MD5 and SHA1 hashes, just call it twice with different enums.  I added the different SHA2 hashes to the function in case someone wishes to generate SHA2 hashes.&lt;br /&gt;&lt;br /&gt;The function needs 3 namespaces for references in order to function.  These 3 must be added if you have not referenced them already. Add this to the top of your module or code page.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.IO&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Text&lt;br /&gt;&lt;span class="kwrd"&gt;Imports&lt;/span&gt; System.Security.Cryptography&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In order to make the function as reusable as possible, an enum was created so that you can't forget which hash types can be created.  Add this enum to your code page or module.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;Enum&lt;/span&gt; HashType&lt;br /&gt;     MD5 = 1&lt;br /&gt;     SHA1 = 2&lt;br /&gt;     SHA256 = 3&lt;br /&gt;     SHA384 = 4&lt;br /&gt;     SHA512 = 5&lt;br /&gt; &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Enum&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Then, add the function itself.  the way this is currently written, if there is an error on generating the hash for a file (like trying to hash a file that doesn't exist), an empty string will be returned instead of an error being raised.  If you want to raise an error that can be handled in the calling code, uncomment the lines that start with "Err.Raise".&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;Public&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt; GetHashForFile(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; Filepath &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; DataHashStandard &lt;span class="kwrd"&gt;As&lt;/span&gt; HashType) &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;&lt;br /&gt;     &lt;span class="rem"&gt;'function that can create the most popular hashes.&lt;/span&gt;&lt;br /&gt;     &lt;span class="rem"&gt;'check that file exists.&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; My.Computer.FileSystem.FileExists(Filepath) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;br /&gt;         &lt;span class="rem"&gt;' Err.Raise(vbObjectError + 13131, , "File " &amp;amp; Filepath &amp;amp; " does not exist") 'uncomment this line if you want to raise an error instead of return empty string&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     &lt;span class="rem"&gt;'declarations&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;Dim&lt;/span&gt; sb &lt;span class="kwrd"&gt;As&lt;/span&gt; StringBuilder = &lt;span class="kwrd"&gt;New&lt;/span&gt; StringBuilder                     &lt;span class="rem"&gt;'stringbuilder to build the result.&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;Dim&lt;/span&gt; fs &lt;span class="kwrd"&gt;As&lt;/span&gt; FileStream = &lt;span class="kwrd"&gt;New&lt;/span&gt; FileStream(Filepath, FileMode.Open)  &lt;span class="rem"&gt;'open file&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;Dim&lt;/span&gt; HashProvider &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;         &lt;span class="rem"&gt;'set the hash type&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;If&lt;/span&gt; DataHashStandard = HashType.MD5 &lt;span class="kwrd"&gt;Then&lt;/span&gt;               &lt;span class="rem"&gt;'md5 hash&lt;/span&gt;&lt;br /&gt;             HashProvider = &lt;span class="kwrd"&gt;New&lt;/span&gt; MD5CryptoServiceProvider&lt;br /&gt;         &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; DataHashStandard = HashType.SHA1 &lt;span class="kwrd"&gt;Then&lt;/span&gt;          &lt;span class="rem"&gt;'sha128 (sha1) hash&lt;/span&gt;&lt;br /&gt;             HashProvider = &lt;span class="kwrd"&gt;New&lt;/span&gt; SHA1CryptoServiceProvider&lt;br /&gt;         &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; DataHashStandard = HashType.SHA256 &lt;span class="kwrd"&gt;Then&lt;/span&gt;        &lt;span class="rem"&gt;'sha256 (sha2 256 bit) hash&lt;/span&gt;&lt;br /&gt;             HashProvider = &lt;span class="kwrd"&gt;New&lt;/span&gt; SHA256CryptoServiceProvider&lt;br /&gt;         &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; DataHashStandard = HashType.SHA384 &lt;span class="kwrd"&gt;Then&lt;/span&gt;        &lt;span class="rem"&gt;'sha384 (sha2 384 bit) hash&lt;/span&gt;&lt;br /&gt;             HashProvider = &lt;span class="kwrd"&gt;New&lt;/span&gt; SHA384CryptoServiceProvider&lt;br /&gt;         &lt;span class="kwrd"&gt;ElseIf&lt;/span&gt; DataHashStandard = HashType.SHA512 &lt;span class="kwrd"&gt;Then&lt;/span&gt;        &lt;span class="rem"&gt;'sha512 (sha2 512 bit) hash&lt;/span&gt;&lt;br /&gt;             HashProvider = &lt;span class="kwrd"&gt;New&lt;/span&gt; SHA512CryptoServiceProvider&lt;br /&gt;         &lt;span class="kwrd"&gt;Else&lt;/span&gt;&lt;br /&gt;             &lt;span class="rem"&gt;'close the file opened earlier&lt;/span&gt;&lt;br /&gt;             fs.Close()&lt;br /&gt;             fs.Dispose()&lt;br /&gt;             &lt;span class="rem"&gt;' Err.Raise(vbObjectError + 13132, , "Data HAsh Standard " &amp;amp; DataHashStandard.tostring &amp;amp; " is not valid") 'uncomment this line if you want to raise an error instead of return empty string&lt;/span&gt;&lt;br /&gt;             &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;&lt;br /&gt;             &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;br /&gt;         &lt;span class="rem"&gt;'compute the hash&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;Dim&lt;/span&gt; hash() &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; = HashProvider.ComputeHash(fs)&lt;br /&gt;&lt;br /&gt;         &lt;span class="rem"&gt;'done with the file, close it.&lt;/span&gt;&lt;br /&gt;         fs.Close()&lt;br /&gt;         fs.Dispose()&lt;br /&gt;&lt;br /&gt;         &lt;span class="rem"&gt;' turn the byte array into a string&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;For&lt;/span&gt; &lt;span class="kwrd"&gt;Each&lt;/span&gt; hex &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Byte&lt;/span&gt; &lt;span class="kwrd"&gt;In&lt;/span&gt; hash&lt;br /&gt;             sb.Append(hex.ToString(&lt;span class="str"&gt;"x2"&lt;/span&gt;))&lt;br /&gt;         &lt;span class="kwrd"&gt;Next&lt;/span&gt;&lt;br /&gt;         &lt;span class="rem"&gt;'return the result&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;Return&lt;/span&gt; sb.ToString&lt;br /&gt;     &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception&lt;br /&gt;         &lt;span class="rem"&gt;'close the file opened earlier&lt;/span&gt;&lt;br /&gt;         fs.Close()&lt;br /&gt;         fs.Dispose()&lt;br /&gt;         &lt;span class="rem"&gt;'Err.Raise(vbObjectError + 13133, , "Data Encryption failed with error " &amp;amp; ex.Message) 'uncomment this line if you want to raise an error instead of return empty string&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;Return&lt;/span&gt; &lt;span class="str"&gt;""&lt;/span&gt;       &lt;span class="rem"&gt;' return empty string on error instead of returning error.&lt;/span&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;Exit&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Function&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Once all 3 sections are in a code page or module, you can use the function like this.  Replace 'c:\config.sys' with the file name you want to hash.&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;msgbox(GetHashForFile(&lt;span class="str"&gt;"c:\config.sys"&lt;/span&gt;, HashType.MD5)) &lt;span class="rem"&gt;'pop messagebox with md5 hash&lt;/span&gt;&lt;br /&gt;msgbox(GetHashForFile(&lt;span class="str"&gt;"c:\config.sys"&lt;/span&gt;, HashType.SHA1)) &lt;span class="rem"&gt;'pop messagebox with SHA1 hash&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;                &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-8132344501411014897?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8ivR2dCX48Q8PwTvimgywCC3-Aw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ivR2dCX48Q8PwTvimgywCC3-Aw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8ivR2dCX48Q8PwTvimgywCC3-Aw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8ivR2dCX48Q8PwTvimgywCC3-Aw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/lKz0vLkByE4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/8132344501411014897/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2009/06/remove-duplciate-images-with-md5sha.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/8132344501411014897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/8132344501411014897?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/lKz0vLkByE4/remove-duplciate-images-with-md5sha.html" title="Duplciate Images &amp; MD5/SHA Hashes" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2009/06/remove-duplciate-images-with-md5sha.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkADSHo_fyp7ImA9Wx9bE08.&quot;"><id>tag:blogger.com,1999:blog-3507869318314992208.post-4491761933802971311</id><published>2003-02-07T23:00:00.000-06:00</published><updated>2011-02-21T14:39:39.447-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-21T14:39:39.447-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DAO" /><category scheme="http://www.blogger.com/atom/ns#" term="Access" /><category scheme="http://www.blogger.com/atom/ns#" term="Access 2000" /><category scheme="http://www.blogger.com/atom/ns#" term="Multi-User" /><category scheme="http://www.blogger.com/atom/ns#" term="Corruption" /><category scheme="http://www.blogger.com/atom/ns#" term="MS Access" /><category scheme="http://www.blogger.com/atom/ns#" term="Access 97" /><category scheme="http://www.blogger.com/atom/ns#" term="ADO" /><category scheme="http://www.blogger.com/atom/ns#" term="Database" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><category scheme="http://www.blogger.com/atom/ns#" term="JET" /><category scheme="http://www.blogger.com/atom/ns#" term="Access 2002" /><title>Microsoft Access Corruption</title><content type="html">I had a great question come up today on Microsoft Access Databases and corruption.   Why does an access database become corrupted, how do you fix it, and how do you prevent the issue from happening in the future?&lt;br /&gt;&lt;br /&gt;In order to answer these questions, first there needs to be an explanation of how MS Access works.  MS Access at its core is a single user database with lots of features for reporting, form design, and automation.  However, the database is still just a file, and not an application. That means there are very few checks in the JET Database Engine that keep users from running over each other when more than one user is using the same database.  This makes Access cheaper to purchase (&lt;$200) than something like MS SQL Server for the backend and Visual Studio for a front end (&gt;$2000).  MS Access is also much more user friendly, and has a great IDE for designing forms, and linking the form to underlying data.  These all make the cost of entry into making an application in MS Access very low, which is why MS Access is so prolific in some environments.&lt;br /&gt;&lt;br /&gt;Long story short, MS Access is a great tool for doing adhoc reporting, short term data recording, or in some instances huge applications where only 1 user is using the application at a time. The ugly corruption issue appears when lots of folks are using MS Access in ways that work, but where a multi-user database application is the better solution.  In other words, if more than 1 person is using the database at a given time, MS Access is not the correct solution.&lt;br /&gt;&lt;br /&gt;If you already have an MS access application that keeps getting corrupted, you can do some things to remediate the database itself in the short term. Access databases corrupt in 3 major ways, though some happen more often than others.  All the below examples assume that it is imperative that the database stop corrupting, and the correct solution (a multi-user application) is not yet available.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Most Often: Index Corruption&lt;/b&gt;&lt;br /&gt;The most often corruption cause is when 2 machines try rebuilding the same index (clustered or not) at the same time. This breaks the index for that table in access, and the table becomes unreadable. The way to tell if this is the root cause is when the database becomes corrupt, you can recover all data, forms, &amp; modules except for 1 table. This can be solved by eliminating all indexes on the table, and limiting the indexes to only one for the primary key. This will obviously slow the database down, but it will be able to support many users over a network on the same table. Composite keys are the 'best' candidates for becoming corrupted and destroying a table.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2nd Most Often: System Table Corruption&lt;/b&gt;&lt;br /&gt;The next most often is when the system tables become corrupted. Objects (tables, forms, modules, reports) are stored in system tables in the access database. Sometimes the indexes or data in those tables can become corrupted and unreadable. You can tell if this happens because all objects after a certain alphanumeric point are unrecoverable. For example, all tables that start with 'H' or a later letter are unrecoverable. To remediate this, split the database between the data (tables) and 'non-data' (queries, modules, forms, reports, etc). Use links from the 'non-data' to the 'data' database. If corruption of this type still occurs, split the 'data' database further into pieces. If you have to, the 'data' database can be split so that there is only 1 table in each 'data' database, where the 'non-data' database links to multiple 'data' databases.&lt;br /&gt;&lt;br /&gt;As part of this solution, each user should have a separate Access database on their machine that contains the queries, forms, reports and modules that links to the 'data' database(s).  That way multiple people are not trying to open and modify the data in the system tables.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3rd Most Often: Row Corruption&lt;/b&gt;&lt;br /&gt;The last type of corruption is when a single data page gets corrupted. This is manifested where 1 table has a few rows that can not be accessed, 'phantom' rows that have blank primary keys, or a table that shows '#error' in every cell. This is caused by 2 users trying to update the same row at the same time, and the JET engine not keeping the 2 users separate. This one takes a lot more work to solve, and it is much better to just move to some other solution besides access. Solving this requires large changes to how data is written to the tables that the JET engine can't handle. I ran into the problem several years ago with a application that was being used by about 70 people simultaneously. Solved this by writing an 'intent' log similar to how any multi-user databases work. &lt;br /&gt;&lt;br /&gt;First, the forms were divorced from the underlying data. The form the user is working with is populated entirely though DAO calls.  I used DAO because DAO is actually faster when utilizing the JET database Engine, which is what MS Access runs on. It is about the only thing DAO does better than ADO. &lt;br /&gt;&lt;br /&gt;Then, the user tells an Access form that a row needs an update or addition though a save button or the like.  That command is then processed though a module and a row added to a flat transaction file that is kept on the network somewhere.  That row in the transaction log states that a user wants to update or add a row in the database table. The user's system waits 250ms and checks the flat file again to make sure no one else is trying to update the same data. If all is ok, the row is written. If there is a contention, then the client that asks last removes the intent and retries it 500ms later.  The reason 250ms was chosen as the wait time is because the network latency was about 25ms, and I wanted to be darn sure that network latency wasn't an issue.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Recap&lt;/b&gt;&lt;br /&gt;Obviously a better solution is to use a multi-user database if more than 1 user will be in a database at a time, and the system is being created or there is time for a rewrite. But using the above methods, I was able to almost entirely eliminate MS Access database corruption on a 70 concurrent user application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3507869318314992208-4491761933802971311?l=evadman.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/n1jQiTGxE1SCHmIAAM6uKf0pNVE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n1jQiTGxE1SCHmIAAM6uKf0pNVE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/n1jQiTGxE1SCHmIAAM6uKf0pNVE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/n1jQiTGxE1SCHmIAAM6uKf0pNVE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/EvadmansRandomBlog/~4/QIqMHJ8KaEk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://evadman.blogspot.com/feeds/4491761933802971311/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://evadman.blogspot.com/2003/02/microsoft-access-corruption.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4491761933802971311?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3507869318314992208/posts/default/4491761933802971311?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EvadmansRandomBlog/~3/QIqMHJ8KaEk/microsoft-access-corruption.html" title="Microsoft Access Corruption" /><author><name>Evadman</name><uri>http://www.blogger.com/profile/03588697189829812977</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://evadman.blogspot.com/2003/02/microsoft-access-corruption.html</feedburner:origLink></entry></feed>

