Put your hard drive in the freezer to fix it?

When my hard drive died a few weeks ago, a part of me died too? Seriously, I had some important images and files that that I really needed wanted but didn’t have the foresight (or common sense) to backup. What happened was I left my machine on overnight and when I woke to wish my pc a good morning, I heard a strange ticking sound from within the tower and screen read something along the lines of “Corrupt or Invalid boot partition”. I didn’t start panicking until at least the fifth reboot with the same result. Logically I opened the tower to find that the ticking was coming from the drive. To me it sounded like the head was trying to move into position but was stuck. Every time I rebooted, the ticking started and lasted for 10 seconds before giving up and the drive stopped spinning altogether.

 

So I ran the diagnostics and it came back with an error stating that it can’t find a hard drive to diagnose. Not good.

 

The next step was to call HP as my machine was still under warranty. I was on the phone with someone in India for an hour pretty much duplicating the tests I had just run.

“Ok, you determined my hard drive is dead*. Ok, so you’ll send me a new drive and when I receive it, I’ll send you the dead one. But what about my data? How do I get all my data back? Oh ok, you have a “data transfer”** service and it’s not guaranteed to get all the data but you’ll charge me $50 if any data is found. That’s not too bad. Wait what’s that? In order to do that, I need to send you the entire tower??? But why? To ensure that the issue is with the drive and now with some other component of the machine? How long will it take to get my machine back? 5 TO 7 WEEKS???!!! Forget it, just send me the replacement drive.”

 

Now on to what this blog title entailed. The replacement drive was due to arrive in 2 days. Then I had 3 days to return the old drive in order to get it to HP in time and not incur a charge. Before then, I had to get to my data. My first thought was to use a data recovery service. I called around and for a mechanical failure, they charge anywhere $995 to $1500. I’m not sure if I wanted my pictures and files that badly. There must another way. One of my co-workers heard that if you put the drive in the freezer, you’ll be able to get it working just long enough to extract the data. I called BS and did some research on it. To my amazement, there are many articles and forum threads detailing this process. You can find some of them here, here, and here. Some posts even described the same ticking sound I experienced. According to the articles, the cold affects the metallics in the drive allowing for easier transference of electricity and sometimes moving the metals just enough to allow proper movement (in my case, the head). Worth a try right?

 

That night, I put the drive in two Ziploc bags and tried to remove as much air as possible to reduce condensation. Waited 3 hours and hooked up. Same ticking. Same result. Remembered that a forum post said to tap it gently to try to know the pieces in place. Tried that. Same result. Tapped it more aggressively this time but that didn’t help. Hmmmm. Didn’t I read somewhere that someone left the drive in the freezer for 24 hours and it worked for them. Back in the Ziplocs and back in the freezer the drive goes.

 

24 hours later, tried again but no joy. Disheartened and feeling stupid with a freezing cold hard drive in my hand, I finally gave up. It was time to let it defrost*** and pack it up to ship to HP. I’m not saying the freezer trick doesn’t work, it just didn’t work for me. Oh well. I learned a hard lesson this time and still feel I lost a part of myself in the process.

 

And by the way HP, thank you sooooo much for sending me a newly
REFERBISHED drive. I’m going back to Dell for my next pc.

 

*Wow! Really?!

**Not “data recovery”. So this sounds like they can only get the data if actual drive still works.

***Didn’t want any trace of my activities found when HP got the drive.

UPDATE: In case anyone is wondering what my drive sounded like, go here and click on Head Damage 1.

And if you need a visual…

Advertisements

WordPress on IIS 7

I just installed WordPress 2.8.4 on Windows 2008 and IIS 7. There were several components that needed to be installed before the famous WordPress 5 minute installation could commence. These included the PHP server, MySQL, phpMySQL, and URL Rewrite for IIS 7. Dave Lawlor wrote a great series of articles on how to properly install and configure everything specifically for WordPress. Go to http://www.trainsignaltraining.com/installing-wordpress-on-iis7/2008-10-06/ to check it out. While installing all these, I only had to restart the server once and that was optional URL Rewrite extension. After all prereqs were installed, it was a breeze. I guess this open source stuff isn’t that bad after all.

WebDAV and recurring events in Exchange 2003

I’m in the process of building a web app to pull calendar events from Exchange 2003 and display them on a page. With some research and a lot of trial and error, I was able to put together bit and pieces of examples on the web and get most of it done. The only problem is that recurring events were not being pulled. It turns out that if a recurring event is schedule to recur ad infinitum, the WebDAV query will not retrieve the event unless a start date and end date is specified. Below is part of the code.

public void Authenticate(string authUri, string destinationUri, string username, string password)

{

// Create the web request body:

string body = string.Format(“destination={0}&username={1}&password={2}”, destinationUri, username, password);

byte[] bytes = Encoding.UTF8.GetBytes(body);

// Create the web request:

HttpWebRequest request = (HttpWebRequest)System.Net.WebRequest.Create(authUri);

request.Method = “POST”;

request.ContentType = “application/x-www-form-urlencoded”;

request.CookieContainer = new CookieContainer();

request.ContentLength = bytes.Length;

// Create the web request content stream:

using (Stream stream = request.GetRequestStream())

{

stream.Write(bytes, 0, bytes.Length);

stream.Close();

}

// Get the response & store the authentication cookies:

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

if (response.Cookies.Count < 2)

throw new AuthenticationException(“Login failed. Is the login / password correct?”);

cookies = new CookieContainer();

foreach (Cookie myCookie in response.Cookies)

{

cookies.Add(myCookie);

}

response.Close();

}

public List<CalendarEvent> GetCalendar(string uri, DateTime startDate, DateTime endDate)

{

List<CalendarEvent> eventList = new List<CalendarEvent>();

HttpWebRequest request;

WebResponse response;

byte[] bytes;

// Note that deep traversals don’t work on public folders. In other words, if you

// need to dig deeper you’ll need to split your query into multiple requests.

string format =

@”<?xml version=””1.0″”?>” +

@”<D:searchrequest xmlns:D = “”DAV:””>” +

@”<D:sql>” +

@”SELECT “”urn:schemas:calendar:dtstart””, ” +

@”””urn:schemas:calendar:dtend””, ” +

@”””urn:schemas:calendar:location””, ” +

@”””urn:schemas:httpmail:subject””, ” +

@”””urn:schemas:httpmail:htmldescription””, ” +

@”””urn:schemas:httpmail:to””, ” +

@”””urn:schemas:calendar:organizer””, ” +

@”””DAV:parentname”” ” +

@”FROM ” +

@”Scope(‘SHALLOW TRAVERSAL OF “”{0}””‘) ” +

@”WHERE ” +

@”NOT “”urn:schemas:calendar:instancetype”” = 1 ” +

@”AND “”DAV:contentclass”” = ‘urn:content-classes:appointment’ ” +

@”AND “”urn:schemas:calendar:dtstart”” &gt;= ‘{1}’ ” +

@”AND “”urn:schemas:calendar:dtend”” &lt;= ‘{2}’ ” +

@”</D:sql>” +

@”</D:searchrequest>”;

string fullQuery = String.Format(format, uri, DateTime.Now.AddYears(-1).ToString(“yyyy/MM/dd”), DateTime.Now.AddYears(1).ToString(“yyyy/MM/dd”));

bytes = Encoding.UTF8.GetBytes(String.Format(fullQuery, uri, startDate, endDate));

// Use the authorization cookies we stored in the authentication method.

request = (HttpWebRequest)HttpWebRequest.Create(uri);

request.CookieContainer = cookies;

request.Method = “SEARCH”;

request.ContentLength = bytes.Length;

request.ContentType = “text/xml”;

using (Stream requestStream = request.GetRequestStream())

{

requestStream.Write(bytes, 0, bytes.Length);

requestStream.Close();

}

response = (HttpWebResponse)request.GetResponse();

using (Stream responseStream = response.GetResponseStream())

{

// Parse the XML response to find the data we need.

XmlDocument document = new XmlDocument();

document.Load(responseStream);

XmlNodeList subjectNodes = document.GetElementsByTagName(“e:subject”);

XmlNodeList startTimeNodes = document.GetElementsByTagName(“d:dtstart”);

XmlNodeList endTimeNodes = document.GetElementsByTagName(“d:dtend”);

XmlNodeList organizerNodes = document.GetElementsByTagName(“d:organizer”);

XmlNodeList bodyNodes = document.GetElementsByTagName(“e:htmldescription”);

XmlNodeList locationNodes = document.GetElementsByTagName(“d:location”);

XmlNodeList toNodes = document.GetElementsByTagName(“e:to”);

string bodyStart = “<!– Converted from text/rtf format –>\r\n\r\n”;

string bodyEnd = “\r\n\r\n</BODY”;

for (int index = 0; index < subjectNodes.Count; index++)

{

string subject = subjectNodes[index].InnerText;

string organizer = HttpContext.Current.Server.HtmlEncode(organizerNodes[index].InnerText.Replace(“\””, “”).Replace(“<“, “(“).Replace(“>”, “)”));

DateTime startTime = DateTime.Parse(startTimeNodes[index].InnerText);

DateTime endTime = DateTime.Parse(endTimeNodes[index].InnerText);

string body = bodyNodes[index].InnerText;

string location = locationNodes[index].InnerText;

//CalendarEvent is my custom class

CalendarEvent ev = new CalendarEvent();

ev.StartTime = startTime;

ev.EndTime = endTime;

ev.Subject = subject;

ev.Organizer = organizer;

ev.Body = body;

ev.Location = location;

eventList.Add(ev);

}

}

response.Close();

return eventList;

}

What is up with Windows and Flash?

I had a total hard drive failure this weekend which of course sucked because I hadn’t done a real backup in months*. If there was any bright sides to it, it would be that now I get to install Windows 7 RTM. I had RC1 installed before the crash and it really impressed me. Almost everything ran better than I had hoped. A trip to Fry’s, two 320GB hard drives**, and a day later, I was up and running. After a few hours of playing with the system, I was in a sour mood again. Ahhh, well played MS. The old bait and switch. RTM is a TOTAL DOWNGRADE compared to RC1. Why do app install just fine in RC1 but not in RTM? Why can I install my McAfee 8.5i problem free in RC1 but RTM won’t even let me pass the Incompatibility screen? How is it possible I can installed the drivers for my MICROSOFT wireless keyboard on RC1 but the RTM Incompatibilty Troll won’t let me cross the bridge to Wireless Land? Not even if I answer those riddle three? And what is up with Flash movies on a site??? Yes I have a 64-bit system. Yes, I’ve read that the Flash player is not supported on these. But c’mon. REALLY!? I know this is not completely MS’s fault but 64-bit technology has been around for so long***. Why has there not been a fix for this? Someone told me today, that I have to run the 32-bit version of Firefox. Turns out, FF only comes in 32-bit. Even IE8 freezes up on me. All I want to do is play Karoshi Suicide Salaryman. Won’t someone please let me play???

*Luckily, I have TFS on another box and have most of my projects.
**Learned my lesson. It’s all about redundancy.
***Relatively speaking.