<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9236822</id><updated>2011-09-28T22:52:04.438-04:00</updated><category term='linux'/><category term='debug'/><category term='photography'/><category term='php'/><category term='gentoo'/><category term='vmware'/><category term='development'/><category term='com'/><category term='alltel'/><category term='panographic'/><category term='misc'/><category term='C#'/><category term='sql2005'/><category term='firefox'/><category term='vb6'/><category term='pdt'/><category term='xps'/><category term='evdo'/><category term='eclipse'/><category term='symfony'/><category term='virtual machines'/><category term='zend'/><category term='vista'/><category term='computer &quot;eye strain&quot; &quot;repetative stress&quot;'/><category term='svn'/><title type='text'>YooperGeek</title><subtitle type='html'>Geekery, Homebrew...and Whatever Else Comes to Mind</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>62</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9236822.post-7676508819814013770</id><published>2011-03-10T10:21:00.001-05:00</published><updated>2011-04-13T14:49:34.732-04:00</updated><title type='text'>Windows 7 SP1 Introduces Breaking Changes to MDAC</title><content type='html'>Wow, this one really took our office by surprise.  A few of us here have updated to Windows 7 SP1.  Some of the developers are also charged with maintaining some legacy VB6 applications that used ADODB to work with MS SQL Server databases. &lt;br /&gt;&lt;br /&gt;If you compile this legacy code on Win7SP1, it will work *only* on Win7SP1 - any down stream OS versions will get some bad-juju runtime errors. &lt;br /&gt;&lt;br /&gt;The issue is discussed in length at &lt;a href="http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13"&gt;http://social.msdn.microsoft.com/Forums/en/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In short, it sounds like they made some changes to MDAC to make it play more friendly with x64 compilations, but in the process busted it for all older OSes.  There's some work-arounds being discussed in the above post, but they have catches, like, if you update your legacy code (not that that's always a possibility,) you loose the ability to compile that code on non-Win7SP1 machines. &amp;nbsp;The only surefire fix right now to not compile your legacy code on Win7SP1 - uninstall SP1 for now until an update is released.&lt;br /&gt;&lt;br /&gt;Useful tidbits I gleaned:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13/#97470aa6-1291-4d6a-bad2-90dc7ce52740"&gt;http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13/#97470aa6-1291-4d6a-bad2-90dc7ce52740&lt;/a&gt;&amp;nbsp;: LONG vs LONGLONG...heh.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13/#1a89662b-f91f-4aef-a706-8fb4d762956d"&gt;http://social.msdn.microsoft.com/Forums/en-US/windowsgeneraldevelopmentissues/thread/3a4ce946-effa-4f77-98a6-34f11c6b5a13/#1a89662b-f91f-4aef-a706-8fb4d762956d&lt;/a&gt;&amp;nbsp;: Problem fully acknowledge, 'high priority'.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;Update &lt;/b&gt;2011-Apr-13:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/646313/ado-programs-no-longer-work-on-customer-computers-after-recompiled-on-a-windows-7-sp1-machine"&gt;http://connect.microsoft.com/VisualStudio/feedback/details/646313/ado-programs-no-longer-work-on-customer-computers-after-recompiled-on-a-windows-7-sp1-machine&lt;/a&gt;&amp;nbsp;Official bug report to MS about the issue - chime in if you're having the same problem!&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7676508819814013770?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7676508819814013770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7676508819814013770' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7676508819814013770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7676508819814013770'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2011/03/windows-7-sp1-introduces-breaking.html' title='Windows 7 SP1 Introduces Breaking Changes to MDAC'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-5906381207240707773</id><published>2008-12-11T16:21:00.001-05:00</published><updated>2008-12-11T16:27:03.193-05:00</updated><title type='text'>Delayed Event Handlers and System.Threading.SynchronizationContext</title><content type='html'>&lt;p&gt;I've found myself in situations where I'm on the receiving end of an API that for whatever reason will raise events in (relative) rapid succession.&amp;#160; It just so happens that I need to execute some code when that event is raised, but not with &lt;em&gt;every&lt;/em&gt; event raise.&amp;#160; &lt;/p&gt;  &lt;p&gt;For example, imagine you have a graphical mapping API.&amp;#160; Suppose that when the user pans the map, a &amp;quot;&lt;em&gt;Panned&lt;/em&gt;&amp;quot; event is raised.&amp;#160; It turns out to be quite common that a user will pan the map over and over before they finish panning. The processing I need to perform on that &lt;em&gt;Panned&lt;/em&gt;&amp;#160; event isn't terribly intensive, but it's not without cost; a cost that is too expensive to incur on every &lt;em&gt;Panned&lt;/em&gt; event, to say nothing of the worthlessness of performing this processing before user has finished panning.&amp;#160; &lt;/p&gt;  &lt;p&gt;A simple answer to that is some form of delayed event processing.&amp;#160; Due to different circumstances at different times I've found myself using two different types of delayed event handlers:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Once the event is raised, it waits for a period of time, and then executes. &lt;/li&gt;    &lt;li&gt;Once the event is raised, it waits for a period of time to elapse in which no more of the events have been raised. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;The first one is analogous to a timed-delay on a camera, or System.Windows.Forms.Timer, or System.Thread.Timer.&amp;#160; The second is more of &amp;quot;I'll wait for you to finish talking before I start talking&amp;quot; kind of thing. Basic implementation entails firing off an asynchronous method that performs the appropriate type of waiting, and once it's finished, the actual processing takes place.&amp;#160; &lt;/p&gt;  &lt;p&gt;Before getting into the details of this implementation, let's talk about UI-thread synchronization.&amp;#160; If you've ever taken advantage of some thready goodness in order to fork off work, then you may have found out that you are not able to update the UI from the non-UI/main thread.&amp;#160; If you try to touch the UI thread, the Framework will throw an InvalidOperationException telling you: &lt;em&gt;&amp;quot;Cross-thread operation not valid: Control 'TheTextBox' accessed from a thread other than the thread it was created on.&amp;quot;&lt;/em&gt; If you've run into this, you've probably googled-up just &lt;a href="http://www.codeproject.com/KB/recipes/AccessControlFromThread.aspx" target="_blank"&gt;a&lt;/a&gt;&amp;#160;&lt;a href="http://www.shabdar.org/cross-thread-operation-not-valid.html" target="_blank"&gt;few&lt;/a&gt;&amp;#160;&lt;a href="http://bytes.com/groups/net-vb/389328-cross-thread-operation-not-valid" target="_blank"&gt;pages&lt;/a&gt;&amp;#160;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/2b7621ad-462e-4b6b-a004-0f0110ef6ddb/" target="_blank"&gt;about&lt;/a&gt;&amp;#160;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/507f5d4b-d33e-40e0-8802-05fe46519658/" target="_blank"&gt;this&lt;/a&gt; exception, and as such, I will not rehash the details here. In short, &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.isynchronizeinvoke.aspx" target="_blank"&gt;ISynchronizeInvoke is your answer.&lt;/a&gt;&amp;#160; Lucky for almost all cases, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.control.aspx" target="_blank"&gt;System.Windows.Forms.Control&lt;/a&gt; implements ISynchronizeInvoke. It's common enough that in some of my code you'll see a &amp;quot;DoOnUIThread&amp;quot; method that I use in my non-UI-threaded code.&amp;#160; It's pretty simple, take a look:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #0600ff"&gt;void&lt;/span&gt; DoOnUIThread&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;ThreadStart&lt;/span&gt; method&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;this.&lt;span style="color: #0000ff"&gt;InvokeRequired&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.&lt;span style="color: #0000ff"&gt;Invoke&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;method, &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt; &lt;span style="color: #0600ff"&gt;else&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; method&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Where &amp;quot;&lt;em&gt;this&lt;/em&gt;&amp;quot; is a Control-derived control, such as a System.Windows.Forms.Form. It's pretty easy to modify this to match whatever delegate you need, and I can only assume there's a simple generic implementation that could accept any delegate type, I just haven't done that yet.&amp;#160; It's easy enough to use:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;DoOnUIThread&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// My UI-bound code goes here, for example:&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; _TextBox.&lt;span style="color: #0000ff"&gt;Text&lt;/span&gt; &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #666666"&gt;&amp;quot;Hello There.&amp;quot;&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Unfortunately, there are cases where you're writing something that doesn't have access to a Control-based object.&amp;#160; For example, imagine you're implementing a class library that needs to do threaded operations.&amp;#160; In your unit tests everything seems to run great - your business objects instantiate, thread, calculate and populate.&amp;#160; But unless you also include tests that bind those objects to the UI, you may miss that you can easily get the &amp;quot;&lt;em&gt;Cross-thread operation not valid:&lt;/em&gt;&amp;quot; InvalidOperationException only when you bind your business object to the UI. These situations are usually easily remedies by making your objects require an ISynchronizeInvoke object upon instantiation.&amp;#160; That ISynchronieInvoke object can be used to use a &lt;em&gt;DoOnUIThread&lt;/em&gt; style method to make sure you don't run into that Cross-thread exception. &lt;/p&gt;  &lt;p&gt;Even more unfortunate, there are cases where maybe your business objects are so entrenched, or it's simply impractical to require an ISynchronizeInvoke object to be specified upon instantiation. In these cases you're really at a loss for what to do when you need to do some work on a different thread that will eventually need to touch the UI thread.&amp;#160; If you can safely make the assumption that the object will normally be executing in the scope of the UI thread, then you can get your worker-threads back into the context of the UI thread by using System.Threading.SynchronizationContext.&amp;#160; If you make sure to grab a hold System.Threading.SychronizationContext.Current &lt;em&gt;before&lt;/em&gt; forking off your worker thread, the worker thread will be able to get back to the UI thread to execute any UI-bound code. &lt;/p&gt;  &lt;p&gt;Now let's look at an example of this in my implementation of a simple &amp;quot;timer&amp;quot; delayed event handler:&lt;/p&gt;  &lt;div class="csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;ThreadStart&lt;/span&gt; _Click_DelayedEventHandler&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;SynchronizationContext&lt;/span&gt; _SynchronizationContext&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #0600ff"&gt;void&lt;/span&gt; button1_Click&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;object&lt;/span&gt; sender, EventArgs e&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;_Click_DelayedEventHandler &lt;span style="color: #008000"&gt;!=&lt;/span&gt; &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return&lt;span style="color: #008000"&gt;;&lt;/span&gt;&lt;span style="color: #008080; font-style: italic"&gt;// we're already waiting - bail out&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt; &lt;span style="color: #0600ff"&gt;else&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// setup the 'wait until finished' anonymous method:&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _Click_DelayedEventHandler &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Thread&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Sleep&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;1000&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AsyncCallback finishedWaiting &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;IAsyncResult ar&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// Take note that at this point you will still be executing on a threadpool thread, &lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// not on the UI thread.&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SendOrPostCallback hello &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;object&lt;/span&gt; state&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageBox.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;this&lt;/span&gt;, &lt;span style="color: #666666"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;, &lt;span style="color: #666666"&gt;&amp;quot;Caption&amp;quot;&lt;/span&gt;, MessageBoxButtons.&lt;span style="color: #0000ff"&gt;OK&lt;/span&gt;, MessageBoxIcon.&lt;span style="color: #0000ff"&gt;Exclamation&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _SynchronizationContext.&lt;span style="color: #0000ff"&gt;Post&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;hello, &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// Make SURE to cleanup or this will be a one-trick pony&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _Click_DelayedEventHandler &lt;span style="color: #008000"&gt;=&lt;/span&gt; null&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _SynchronizationContext &lt;span style="color: #008000"&gt;=&lt;/span&gt; null&lt;span style="color: #008000"&gt;;&lt;/span&gt; &lt;span style="color: #008080; font-style: italic"&gt;// don't strictly need to set this to null...&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// fire off our anonymous 'waiter' method on a thread-pool thread:&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _SynchronizationContext &lt;span style="color: #008000"&gt;=&lt;/span&gt; SynchronizationContext.&lt;span style="color: #0000ff"&gt;Current&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _Click_DelayedEventHandler.&lt;span style="color: #0000ff"&gt;BeginInvoke&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;finishedWaiting, &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;To try this out, you should be able to create a new Windows Forms project, place a button on the form, hook up this method as the Click event handler. When you run, you should be able to click the button, and no matter how many times you click, you'll only get the &amp;quot;Hello World&amp;quot; message box after one second has elapsed since your first button click. So, what happens is, on the first click, it sets up a ThreadStart delegate, and executes it.&amp;#160; The only thing this does is wait for one second.&amp;#160; If any more button-clicks come in during this second, they're ignored. After the second, the ThreadStart finishes, and the 'finished' callback executes.&amp;#160; It's in this anonymous method that we place our real work.&amp;#160; In the &lt;em&gt;finishedWaiting &lt;/em&gt;you can see the use of the UI SynchronizationContext - you create a &lt;em&gt;SendOrPostCallback&lt;/em&gt; delegate and .Post it to the UI SynchronizationContext. At the end of &lt;em&gt;finishedWaiting &lt;/em&gt;is very important cleanup code.&amp;#160; If you don't set the _Click_DelayedEventHandler back to null, this whole thing is just a one-trick pony.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here's the more-useful &amp;quot;I'll wait for you to stop clicking&amp;quot; delayed event handler:&lt;/p&gt;  &lt;div class="csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;ThreadStart&lt;/span&gt; _ButtonClick_DelayedEventHandler&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; DateTime _ButtonClick_LastChangeTime&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #ff0000"&gt;object&lt;/span&gt; _ButtonClick_LastChangeLock &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;a style="color: #000060" href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;span style="color: #008000"&gt;new&lt;/span&gt;&lt;/a&gt; &lt;span style="color: #ff0000"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;SynchronizationContext&lt;/span&gt; _ButtonClick_SynchronizationContext&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #0600ff"&gt;private&lt;/span&gt; &lt;span style="color: #0600ff"&gt;void&lt;/span&gt; button1_Click&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;object&lt;/span&gt; sender, EventArgs e&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;if&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;_ButtonClick_DelayedEventHandler &lt;span style="color: #008000"&gt;!=&lt;/span&gt; &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// we're already waiting...increment the 'last fired' indicator.&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;lock&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;_ButtonClick_LastChangeLock&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt; _ButtonClick_LastChangeTime &lt;span style="color: #008000"&gt;=&lt;/span&gt; DateTime.&lt;span style="color: #0000ff"&gt;UtcNow&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt; &lt;span style="color: #0600ff"&gt;else&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// setup the 'wait until finished' anonymous method:&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_DelayedEventHandler &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// this will loop indefinately until the event hasn't been&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// raised for at least 1 second&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TimeSpan difference &lt;span style="color: #008000"&gt;=&lt;/span&gt; TimeSpan.&lt;span style="color: #0000ff"&gt;Zero&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;do&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;System.&lt;span style="color: #0000ff"&gt;Threading&lt;/span&gt;&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Thread&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Sleep&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;100&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime lastChanged&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;lock&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;_ButtonClick_LastChangeLock&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt; lastChanged &lt;span style="color: #008000"&gt;=&lt;/span&gt; _ButtonClick_LastChangeTime&lt;span style="color: #008000"&gt;;&lt;/span&gt; &lt;span style="color: #000000"&gt;}&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; difference &lt;span style="color: #008000"&gt;=&lt;/span&gt; DateTime.&lt;span style="color: #0000ff"&gt;UtcNow&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;Subtract&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;lastChanged&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt; &lt;span style="color: #0600ff"&gt;while&lt;/span&gt; &lt;span style="color: #000000"&gt;(&lt;/span&gt;difference.&lt;span style="color: #0000ff"&gt;TotalMilliseconds&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;1000&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; AsyncCallback finishedWaiting &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;IAsyncResult ar&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; SendOrPostCallback hello &lt;span style="color: #008000"&gt;=&lt;/span&gt; &lt;span style="color: #ff0000"&gt;delegate&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;object&lt;/span&gt; state&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MessageBox.&lt;span style="color: #0000ff"&gt;Show&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;this&lt;/span&gt;, &lt;span style="color: #666666"&gt;&amp;quot;Hello World&amp;quot;&lt;/span&gt;, &lt;span style="color: #666666"&gt;&amp;quot;Caption&amp;quot;&lt;/span&gt;, MessageBoxButtons.&lt;span style="color: #0000ff"&gt;OK&lt;/span&gt;, MessageBoxIcon.&lt;span style="color: #0000ff"&gt;Exclamation&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_SynchronizationContext.&lt;span style="color: #0000ff"&gt;Post&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;hello, &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// Make SURE to cleanup or this will be a one-trick pony.&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_LastChangeTime &lt;span style="color: #008000"&gt;=&lt;/span&gt; DateTime.&lt;span style="color: #0000ff"&gt;MinValue&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_DelayedEventHandler &lt;span style="color: #008000"&gt;=&lt;/span&gt; null&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_SynchronizationContext &lt;span style="color: #008000"&gt;=&lt;/span&gt; null&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// fire off our anonymous 'waiter' method on a thread-pool thread:&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_SynchronizationContext &lt;span style="color: #008000"&gt;=&lt;/span&gt; SynchronizationContext.&lt;span style="color: #0000ff"&gt;Current&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt; &lt;span style="color: #008080; font-style: italic"&gt;// assumed to be the UI thread&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_LastChangeTime &lt;span style="color: #008000"&gt;=&lt;/span&gt; DateTime.&lt;span style="color: #0000ff"&gt;UtcNow&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _ButtonClick_DelayedEventHandler.&lt;span style="color: #0000ff"&gt;BeginInvoke&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;finishedWaiting, &lt;span style="color: #0600ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #008000"&gt;;&lt;/span&gt;    &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;    &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;   &lt;br /&gt;To try this out, do the same steps as the first delayed event handler - hook this up to a button-click.&amp;#160; The difference you'll notice is that as long as you keep clicking the button at least once every second, the message box will not pop up.&amp;#160; It waits for you to finish hammering the button.&amp;#160; Again, it's very important that you cleanup at the end of finishedWaiting, and note that there is more to cleanup this time. &lt;/p&gt;  &lt;p&gt;Anyway, feel free to customize to your needs, and I really hope these are useful to someone other than myself. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-5906381207240707773?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/5906381207240707773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=5906381207240707773' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/5906381207240707773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/5906381207240707773'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/12/delayed-event-handlers-and.html' title='Delayed Event Handlers and System.Threading.SynchronizationContext'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-7767074138008773525</id><published>2008-10-16T11:42:00.001-04:00</published><updated>2008-10-16T11:42:40.896-04:00</updated><title type='text'>Quick Highlighter - Quick and Easy HTML/CSS Code Highlightin</title><content type='html'>&lt;p&gt;Hey everyone, just a quick post.&amp;#160; I recently learned about &lt;a href="http://quickhighlighter.com/" target="_blank"&gt;Quick Highlighter&lt;/a&gt;. It will take just about any piece of code you can throw at it and spit out snazzy HTML/CSS syntax highlighter code.&amp;#160; I just used it in my previous post. It's great.&lt;/p&gt;  &lt;p&gt;I've used the &lt;a href="http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/" target="_blank"&gt;CopySourceAsHtml AddIn&lt;/a&gt; for Visual Studio 2003/2005/2008, but I've always disliked it because my color scheme in Visual Studio doesn't translate well to HTML.&amp;#160; My blog has a dark-text-on-light-background scheme while I code in a light-text-on-dark-background scheme.&amp;#160; Plus, it doesn't help me when I want to post a piece of VB6 code, or code in any other language for that matter.&lt;/p&gt;  &lt;p&gt;So, give it a try.&amp;#160; I like it. :)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7767074138008773525?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7767074138008773525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7767074138008773525' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7767074138008773525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7767074138008773525'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/10/quick-highlighter-quick-and-easy.html' title='Quick Highlighter - Quick and Easy HTML/CSS Code Highlightin'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-511580013267226152</id><published>2008-10-16T11:37:00.001-04:00</published><updated>2008-10-16T11:37:19.966-04:00</updated><title type='text'>Troubles Marshalling System.Guid to Visual Basic 6.0 (VB6)</title><content type='html'>&lt;p&gt;I find myself in the &amp;lt;finger-quote&amp;gt;interesting&amp;lt;/finger-quote&amp;gt; situation of having to interop a large portion of .NET code back into an older VB6 code base. As it turns out, I need to pass a System.Guid to VB6. Before exposing a property that returned a System.Guid I made sure that System.Guid was COM-Visible - it is:&lt;/p&gt;  &lt;div class="csharp csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;Serializable&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ComVisible&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #0600ff"&gt;public&lt;/span&gt; &lt;span style="color: #ff0000"&gt;struct&lt;/span&gt; Guid &lt;span style="color: #008000"&gt;:&lt;/span&gt; IFormattable, IComparable, IComparable&lt;span style="color: #008000"&gt;&amp;lt;&lt;/span&gt;Guid&lt;span style="color: #008000"&gt;&amp;gt;&lt;/span&gt;, IEquatable&lt;span style="color: #008000"&gt;&amp;lt;&lt;/span&gt;Guid&lt;span style="color: #008000"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #008080; font-style: italic"&gt;// remainder of metadata snipped for brevity&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;  &lt;p&gt;But let's get this point across right from the beginning: System.Guid is marked as being COM-Visible, &lt;i&gt;but it is not usable in VB6&lt;/i&gt;! After adding a reference to mscorlib, VB6 will allow you to create a variable of type System.Guid:&lt;/p&gt;  &lt;div class="vb vb" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #b1b100"&gt;Dim&lt;/span&gt; myGuid &lt;span style="color: #b1b100"&gt;as&lt;/span&gt; mscorlib.&lt;span style="color: #66cc66"&gt;Guid&lt;/span&gt;&amp;#160; &lt;/div&gt;  &lt;p&gt;But you are unable to actually make use of 'myGuid' variable.&amp;#160; There is no intellisense pop-up when you type 'myGuid.', there's no way to create one or populate a declared mscorlib.Guid &lt;/p&gt;  &lt;p&gt;I'm not entirely sure what the problem is, but I have to assume it has to do with Guid being a struct. Regardless of the reason for the problem, I still needed access to a System.Guid in VB6. Thankfully, all my problem requires is to fetch the Guid from a .NET object, and then pass that Guid to a stored procedure that's expecting a SQL Server &amp;quot;uniqueidentifier&amp;quot; data type. &lt;/p&gt;  &lt;p&gt;I started searching. Talk about a tough problem to google for!&amp;#160; There's a lot of really good hits regarding Guid's an creating COM-visible classes/interfaces, but I found very little info on actually marshalling a System.Guid back-n-forth to/from .NET. Thankfully, I was able to &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/vbinterop/thread/16c0d49e-48d2-4329-8904-a2c371c5fba7/" target="_blank"&gt;find this post&lt;/a&gt; where someone is experiencing the exact same problem.&amp;#160; Unfortunately, there was no good answer. Someone did post a reply which didn't answer the original poster's question, but does include a link to an &lt;a href="http://blogs.msdn.com/adam_nathan/archive/2003/04/23/56635.aspx" target="_blank"&gt;Adam Nathan blog post discussing customizing marshalling&lt;/a&gt;, which uses a System.Guid as an example. It's informative, but it doesn't offer any assistance with the problem.&lt;/p&gt;  &lt;p&gt;For verbosity (and the morbidly curious,) let's look at a simple example illustrating the problem.&amp;#160; Here's an interface and a class that implements that interface, all exposed to COM. (This is in C#, but can just as easily be written in VB.NET.)&lt;/p&gt;  &lt;div class="csharp csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;Guid&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #666666"&gt;&amp;quot;BD95337B-0395-4773-B2FC-2BC812388BAB&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;InterfaceType&lt;span style="color: #000000"&gt;(&lt;/span&gt;ComInterfaceType.&lt;span style="color: #0000ff"&gt;InterfaceIsIDispatch&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ComVisible&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #0600ff"&gt;public&lt;/span&gt; &lt;span style="color: #ff0000"&gt;interface&lt;/span&gt; IGuidGetter &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; Guid GetSessionID&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;;     &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;     &lt;br /&gt;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;Guid&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #666666"&gt;&amp;quot;6AAFF9A3-875D-4955-AE09-634A88D9EC56&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ClassInterface&lt;span style="color: #000000"&gt;(&lt;/span&gt;ClassInterfaceType.&lt;span style="color: #0000ff"&gt;None&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ComVisible&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ProgId&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #666666"&gt;&amp;quot;JTPApp.GuidGetter&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #0600ff"&gt;public&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt; GuidGetter &lt;span style="color: #008000"&gt;:&lt;/span&gt; IGuidGetter &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;public&lt;/span&gt; Guid GetSessionID&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;return&lt;/span&gt; Guid.&lt;span style="color: #0000ff"&gt;NewGuid&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;;     &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;     &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt; &lt;/div&gt;  &lt;p&gt;To use that class in VB6, we compile it, regasm it, and add the registered type lib as a reference to the VB6 project. We can now do something like:&lt;/p&gt;  &lt;div class="vb vb" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #b1b100"&gt;Dim&lt;/span&gt; myGuidGetter &lt;span style="color: #b1b100"&gt;As&lt;/span&gt; &lt;span style="color: #b1b100"&gt;New&lt;/span&gt; GuidGetter     &lt;br /&gt;&lt;span style="color: #b1b100"&gt;Dim&lt;/span&gt; myGuid &lt;span style="color: #b1b100"&gt;As&lt;/span&gt; mscorlib.&lt;span style="color: #66cc66"&gt;Guid&lt;/span&gt;     &lt;br /&gt;    &lt;br /&gt;myGuid = guidGetter.&lt;span style="color: #66cc66"&gt;GetSessionID&lt;/span&gt;&lt;span style="color: #66cc66"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66"&gt;)&lt;/span&gt;     &lt;br /&gt;&lt;/div&gt;  &lt;p&gt;Unfortunately, Line 4 will fail to compile, giving you a &lt;strong&gt;&lt;em&gt;&amp;quot;Variable uses an automation type not supported in Visual Basic&amp;quot;&lt;/em&gt;&lt;/strong&gt; error message.&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Decorating the .NET interface and/or implementation with [MarshalAs(UnmanagedType.LPStruct)], while it does change the COM IDL (as noted and demonstrated in &lt;a href="http://blogs.msdn.com/adam_nathan/archive/2003/04/23/56635.aspx" target="_blank"&gt;Adam Nathan's article&lt;/a&gt;,) doesn't make any difference from a VB6 standpoint. You always get the &lt;em&gt;&amp;quot;Variable uses an automation type not supported in Visual Basic&amp;quot;&lt;/em&gt; error. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;The really aggravating part for me is that I don't need to really use the Guid in VB6.&amp;#160; I simply need VB6 to retrieve it, and then stuff it into a stored procedure call!&amp;#160; &lt;/p&gt;  &lt;p&gt;With this in mind, I tried returning the Guid as an object, but figured it would have problems because I would be boxing a value type in a reference type and then expecting VB6 to know how to properly unbox it. VB6 was able to retrieve the Guid into a Variant, but upon trying to set it as a parameter to the stored procedure, I received an AccessViolationException in my .NET code. Not pretty.&lt;/p&gt;  &lt;p&gt;Thankfully, my work-around to the problem turns out to be pretty simple: Return the Guid as a string.&amp;#160; So, to follow through with the example code I started above, if you change it to look like:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="csharp csharp" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;Guid&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #666666"&gt;&amp;quot;BD95337B-0395-4773-B2FC-2BC812388BAB&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;InterfaceType&lt;span style="color: #000000"&gt;(&lt;/span&gt;ComInterfaceType.&lt;span style="color: #0000ff"&gt;InterfaceIsIDispatch&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ComVisible&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #0600ff"&gt;public&lt;/span&gt; &lt;span style="color: #ff0000"&gt;interface&lt;/span&gt; IGuidGetter &lt;span style="color: #000000"&gt;{&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #ff0000"&gt;string&lt;/span&gt; GetSessionID&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;Guid&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #666666"&gt;&amp;quot;6AAFF9A3-875D-4955-AE09-634A88D9EC56&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ClassInterface&lt;span style="color: #000000"&gt;(&lt;/span&gt;ClassInterfaceType.&lt;span style="color: #0000ff"&gt;None&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ComVisible&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #0600ff"&gt;true&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;[&lt;/span&gt;ProgId&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #666666"&gt;&amp;quot;JTPApp.GuidGetter&amp;quot;&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;&lt;span style="color: #000000"&gt;]&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #0600ff"&gt;public&lt;/span&gt; &lt;span style="color: #ff0000"&gt;class&lt;/span&gt; GuidGetter &lt;span style="color: #008000"&gt;:&lt;/span&gt; IGuidGetter &lt;span style="color: #000000"&gt;{&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;public&lt;/span&gt; &lt;span style="color: #ff0000"&gt;string&lt;/span&gt; GetSessionID&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt; &lt;span style="color: #000000"&gt;{&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #0600ff"&gt;return&lt;/span&gt; Guid.&lt;span style="color: #0000ff"&gt;NewGuid&lt;/span&gt;.&lt;span style="color: #0000ff"&gt;ToString&lt;/span&gt;&lt;span style="color: #000000"&gt;(&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;/span&gt;;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;span style="color: #000000"&gt;}&lt;/span&gt;&amp;#160;&amp;#160; &lt;br /&gt;&lt;span style="color: #000000"&gt;}&lt;/span&gt;&amp;#160; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;It will work.&amp;#160; You get the Guid, as a string, in VB6.&amp;#160; There's only one minor catch to getting SQL Server to be able to convert that string into a unique identifier, it must be enclosed in curly braces, like so:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div class="vb vb" style="border-right: #d0d0d0 1px solid; border-top: #d0d0d0 1px solid; border-left: #d0d0d0 1px solid; color: #006; border-bottom: #d0d0d0 1px solid; font-family: monospace; background-color: #f0f0f0"&gt;   &lt;ol&gt;     &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&lt;span style="color: #b1b100"&gt;Dim&lt;/span&gt; sqlCommand &lt;span style="color: #b1b100"&gt;As&lt;/span&gt; &lt;span style="color: #b1b100"&gt;New&lt;/span&gt; ADODB.&lt;span style="color: #b1b100"&gt;Command&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&lt;span style="color: #b1b100"&gt;With&lt;/span&gt; sqlCommand &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; .&lt;span style="color: #66cc66"&gt;ActiveConnection&lt;/span&gt; = dbConn &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; .&lt;span style="color: #66cc66"&gt;CommandText&lt;/span&gt; = &lt;span style="color: #ff0000"&gt;&amp;quot;A_Stored_Procedure&amp;quot;&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; .&lt;span style="color: #66cc66"&gt;CommandType&lt;/span&gt; = adCmdStoredProc &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; .&lt;span style="color: #66cc66"&gt;Parameters&lt;/span&gt;.&lt;span style="color: #66cc66"&gt;Refresh&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; &lt;span style="color: #b1b100"&gt;Dim&lt;/span&gt; tmp &lt;span style="color: #b1b100"&gt;As&lt;/span&gt; &lt;span style="color: #b1b100"&gt;String&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; tmp = g_UserInfo.&lt;span style="color: #66cc66"&gt;GetSessionID&lt;/span&gt;&lt;span style="color: #66cc66"&gt;(&lt;/span&gt;&lt;span style="color: #66cc66"&gt;)&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; .&lt;span style="color: #66cc66"&gt;Parameters&lt;/span&gt;&lt;span style="color: #66cc66"&gt;(&lt;/span&gt;&lt;span style="color: #ff0000"&gt;&amp;quot;@sessionID&amp;quot;&lt;/span&gt;&lt;span style="color: #66cc66"&gt;)&lt;/span&gt;.&lt;span style="color: #66cc66"&gt;Value&lt;/span&gt; = &lt;span style="color: #ff0000"&gt;&amp;quot;{&amp;quot;&lt;/span&gt; &amp;amp; tmp &amp;amp; &lt;span style="color: #ff0000"&gt;&amp;quot;}&amp;quot;&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&amp;#160;&amp;#160; .&lt;span style="color: #66cc66"&gt;Execute&lt;/span&gt; , , adExecuteNoRecords &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&lt;span style="color: #b1b100"&gt;End&lt;/span&gt; &lt;span style="color: #b1b100"&gt;With&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;      &lt;li style="font: 130% &amp;#39;Courier New&amp;#39;, courier, monospace; color: #003030"&gt;       &lt;div style="padding-right: 0px; padding-left: 0px; font-weight: normal; padding-bottom: 0px; margin: 0px; color: #000020; padding-top: 0px; font-style: normal; font-family: monospace"&gt;&lt;span style="color: #b1b100"&gt;Set&lt;/span&gt; sqlCommand = &lt;span style="color: #b1b100"&gt;Nothing&lt;/span&gt; &lt;/div&gt;     &lt;/li&gt;   &lt;/ol&gt; &lt;/div&gt;  &lt;p&gt;On line 10, you can see that I wrapped it in curly-braces.&amp;#160; So while this works for my scenario, there's no way, that I've figured out, to easily interop a System.Guid value back and forth between .NET and VB6.&lt;/p&gt;  &lt;p&gt;Anybody have useful insight in how to get the back-n-forth marshalling to work?&amp;#160; I can't imagine I'm the only one who's ever needed to do this.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-511580013267226152?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/511580013267226152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=511580013267226152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/511580013267226152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/511580013267226152'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/10/troubles-marshalling-systemguid-to.html' title='Troubles Marshalling System.Guid to Visual Basic 6.0 (VB6)'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112744614147936185</id><published>2008-07-20T14:25:00.003-04:00</published><updated>2008-07-20T15:39:52.102-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='panographic'/><title type='text'>Panographic Play using Autostitch</title><content type='html'>I've been playing with &lt;a href="http://www.cs.ubc.ca/~mbrown/autostitch/autostitch.html"&gt;Autostitch&lt;/a&gt; for a while now.  It's a proprietary, but free, tool for automatically stitching and blending photographs together into panographic mosaics. &lt;br /&gt;&lt;br /&gt;For any of these pictures, click them and go download the original to see the full-size stitch.&lt;br /&gt;&lt;br /&gt;Here's a link to the entire album:&lt;br /&gt;&lt;table style="width:194px;"&gt;&lt;tr&gt;&lt;td align="center" style="height:194px;background:url(http://picasaweb.google.com/f/img/transparent_album_background.gif) no-repeat left"&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos?authkey=NPUHSQ_icBU"&gt;&lt;img src="http://lh5.ggpht.com/jtpoll/SINn9l7stoE/AAAAAAAAB1U/6RaFFw6qd2g/s160-c/StitchedPanographicPhotos.jpg" width="160" height="160" style="margin:1px 0 0 4px;"&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center;font-family:arial,sans-serif;font-size:11px"&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos?authkey=NPUHSQ_icBU" style="color:#4D4D4D;font-weight:bold;text-decoration:none;"&gt;Stitched Panographi&lt;wbr&gt;&lt;/wbr&gt;c Photos&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Here's a few from the album:&lt;br /&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos/photo?authkey=NPUHSQ_icBU#5225137844131289506"&gt;&lt;img src="http://lh4.ggpht.com/jtpoll/SINrL23lWaI/AAAAAAAAByY/UPgANTGbW-k/s400/pano.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This is the bridge over the Eagle River in Eagle River. Any family members recognize this stitch from the family blog?  This is the raw stitch before cropping and editing. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos/photo?authkey=NPUHSQ_icBU#5225173054380909410"&gt;&lt;img src="http://lh6.ggpht.com/jtpoll/SIOLNXRRI2I/AAAAAAAABzI/FQiRFn100uw/s400/deltsigs_carny_pano.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Here's a shot from Winter Carnival 2008.  This is the delt-sigs statue. Again, download the original full-size image and check out the detail. :) (This could use some contrast-adjusting...)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos/photo?authkey=NPUHSQ_icBU#5225134920178767074"&gt;&lt;img src="http://lh4.ggpht.com/jtpoll/SINohqS-lOI/AAAAAAAABxQ/yNe9lHQ57H4/s400/pano_large.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This is the lower Hungaria falls.  This was a simple three-photo stitch.  I had to rotate the pictures 90 degrees before stitching.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos/photo?authkey=NPUHSQ_icBU#5225136694210536098"&gt;&lt;img src="http://lh6.ggpht.com/jtpoll/SINqI7FHIqI/AAAAAAAABx0/PM0c82s6ulY/s144/pano.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This is the spring 2008 run-off on the Tioga River in between Houghton and Marquette at a roadside park.  It's just outside of Alberta by a few miles.  I had photos to go  in the bottom left of the photo, but autostitch didn't include them in the stitch for whatever reason.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/jtpoll/StitchedPanographicPhotos/photo?authkey=NPUHSQ_icBU#5225136944746371330"&gt;&lt;img src="http://lh6.ggpht.com/jtpoll/SINqXgZgmQI/AAAAAAAABx8/0pQttV4Mfr4/s400/pano.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;This is another of the Tioga river.  &lt;br /&gt;&lt;br /&gt;There's more in the album, so click-through to see them all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112744614147936185?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112744614147936185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112744614147936185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112744614147936185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112744614147936185'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/07/panographic-play-using-autostitch.html' title='Panographic Play using Autostitch'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/jtpoll/SINn9l7stoE/AAAAAAAAB1U/6RaFFw6qd2g/s72-c/StitchedPanographicPhotos.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-7705948070244937281</id><published>2008-05-20T22:14:00.004-04:00</published><updated>2008-05-20T22:42:52.293-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='xps'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><title type='text'>XPS Documents Opening With Firefox in Vista</title><content type='html'>So there I was, I had completed a transaction at a &lt;span style="font-style: italic;"&gt;'save this page for your records'&lt;/span&gt; page that I wanted to a PDF.  Ooops...I don't have Acrobat on this laptop.  Luckily I knew I had the XPS 'printer' installed by default. (It comes with Vista.)&lt;br /&gt;&lt;br /&gt;So I print it to an .xps file.  it appears to 'print' successfully.  The problem is, when I doublt-click it to open it, it opens in Firefox!  Firefox is set as my default browser, but I find this weird - I thought there was an XPS viewer application.  I right-click the .xps file and choose &lt;span style="font-style: italic;"&gt;"Open With"&lt;/span&gt; and then "XPS Viewer".  Again, it tries to open in Firefox.  Firefox doesn't understand the .xps extension and offers to save the file for me, or let's me open it with "XPSViewer.Document (default)".  Huh.  Ok.  I tell Firefox to open it with the "XPSViewer.Document (default)".  Firefox opens yet another tab with the .xps document, offering again to save/open it for me.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qt9sjR3SvlA/SDOJ1uCOQNI/AAAAAAAABdg/GQ1GR4a3uTE/s1600-h/vista_firefox_xps.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_qt9sjR3SvlA/SDOJ1uCOQNI/AAAAAAAABdg/GQ1GR4a3uTE/s400/vista_firefox_xps.png" alt="" id="BLOGGER_PHOTO_ID_5202653550526480594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Okaaaaay.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I caught wind that you should try dropping the file into Internet Explorer.  This works.  IE recognizes the file and opens the XPS document for you.  I also caught wind that this isn't just a Firefox problem, but rather a "default browser is not IE" problem. One solution to the problem is to re-associate the .xps file extension with IE instead of the "XPS Viewer" application.  The other route (which I prefer) is to download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=b8dcffdd-e3a5-44cc-8021-7649fd37ffee&amp;amp;DisplayLang=en"&gt;"XPS Essentials" pack from Microsoft&lt;/a&gt;.  I think this pack was originally intended to add XPS functionality to XP and Server 2003, but it now supports Vista, and it appears to merge into Vista as some sort of update.&lt;br /&gt;&lt;br /&gt;After I installed this update, double-clicking an .xps file still opened it in Firefox though!  Come on! If I right-click on the .xps file, and choose &lt;span style="font-style: italic;"&gt;"Open With"&lt;/span&gt;, I now have a new item: &lt;span style="font-style: italic;"&gt;"XPS Viewer EP"&lt;/span&gt;.  Ah-ha!  This opens up the .xps file in it's own separate non-browser viewer.  Perfect!&lt;br /&gt;&lt;br /&gt;All that's left to do is make &lt;span style="font-style: italic;"&gt;XPS Viewer EP&lt;/span&gt; the default app for .xps files.  The first time I tried changing a file extension association in Vista, I went about it the way you do in XP - go to the &lt;span style="font-style: italic;"&gt;Tools-&gt;Folder Options&lt;/span&gt;  menu.  But in Vista, the dialog that get for &lt;span style="font-style: italic;"&gt;Folder Options&lt;/span&gt; doesn't have the familiar file associations tab that XP has.  In Vista, you have to use the &lt;span style="font-style: italic;"&gt;"Default Programs"&lt;/span&gt; Start menu item. (Just use the quick-search, or you should be able to find it under the Control Panel:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qt9sjR3SvlA/SDOJ1OCOQMI/AAAAAAAABdY/bVjb_IoPmlQ/s1600-h/vista_default_programs.png"&gt;&lt;img style="cursor: pointer; width: 501px; height: 236px;" src="http://4.bp.blogspot.com/_qt9sjR3SvlA/SDOJ1OCOQMI/AAAAAAAABdY/bVjb_IoPmlQ/s400/vista_default_programs.png" alt="" id="BLOGGER_PHOTO_ID_5202653541936545986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just hit the &lt;span style="font-style: italic;"&gt;''Associate a file type or protocol with a program"&lt;/span&gt; item and you should be able to figure it out from there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7705948070244937281?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7705948070244937281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7705948070244937281' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7705948070244937281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7705948070244937281'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/05/xps-documents-opening-with-firefox-in.html' title='XPS Documents Opening With Firefox in Vista'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_qt9sjR3SvlA/SDOJ1uCOQNI/AAAAAAAABdg/GQ1GR4a3uTE/s72-c/vista_firefox_xps.png' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-3507717194916586260</id><published>2008-04-11T15:08:00.002-04:00</published><updated>2008-04-12T18:15:16.950-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>AnkhSVN and VS2008</title><content type='html'>I found &lt;a href="http://damieng.com/blog/2007/06/13/ankhsvn-and-visual-studio-20072008orcas"&gt;this post by Damien Guard&lt;/a&gt; useful on getting AnkhSVN to work with VS2008.&lt;br /&gt;&lt;br /&gt;Sorry for such a short post...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-3507717194916586260?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/3507717194916586260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=3507717194916586260' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/3507717194916586260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/3507717194916586260'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/04/ankhsvn-vs2008.html' title='AnkhSVN and VS2008'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-6031973263869963533</id><published>2008-04-02T11:31:00.001-04:00</published><updated>2008-04-02T11:31:49.768-04:00</updated><title type='text'>Rolling Back An SVN Repository</title><content type='html'>&lt;p&gt;Yeesh...&amp;#160; Talk about a minor panic.&lt;/p&gt;  &lt;p&gt;Don't ask me how, because I'm not entirely sure what I did to make it happen.&amp;#160; But, I &lt;em&gt;thought&lt;/em&gt; I went to commit some code, and when I hit 'commit', instead of committing the code, it decided that I had flagged my entire working directory and the point in the repository for deletion.&amp;#160; &lt;/p&gt;  &lt;p&gt;I really don't know what happened.&lt;/p&gt;  &lt;p&gt;I thought I'd fix the problem by simply pulling out my stuff at a previous revision, and recommitting. This seemed problematic because I'd have to re-add the trunk, and there would still be a delete in the history, and I'm sure that could cause merge-hell in the future.&amp;#160; &lt;/p&gt;  &lt;p&gt;Some quick googling turned up &lt;a href="http://timhatch.com/ark/2006/04/18/howto-svn-commit-rollback" target="_blank"&gt;Tim Hatch's very simple instructions on how to rollback an SVN commit&lt;/a&gt;. Tim apparently accidentally checked some confidential information into his public repository and explains how to rollback a revision by doing something really dirty: manually modifying your repository.&lt;/p&gt;  &lt;p&gt;I won't rehash what he explains, but know that his solution worked for our FSFS based repository. &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks Tim!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-6031973263869963533?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/6031973263869963533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=6031973263869963533' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/6031973263869963533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/6031973263869963533'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/04/rolling-back-svn-repository.html' title='Rolling Back An SVN Repository'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-7168682189082291572</id><published>2008-03-11T20:10:00.002-04:00</published><updated>2008-03-11T20:18:23.278-04:00</updated><title type='text'>Tumblr</title><content type='html'>For the three of you who read my blog, and the two of you who subscribe to this blog's RSS feed, I'm here to say you may want to also sub to my &lt;a href="http://yoopergeek.tumblr.com/rss"&gt;tumblr feed&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Actually, you may want to sub to that and unsub from this because the tumblr feed aggregates this blog feed.  It's up to you I guess.&lt;br /&gt;&lt;br /&gt;Why tumblr?  Because I'm not cool enough for twitter, and honestly, I like the extra content-type features tumblr offers.  My primary reason for creating a tumblr account is because I have my &lt;a href="http://www.google.com/reader/shared/14766863855758347747"&gt;Google Reader Shared Items&lt;/a&gt; feed, (shown at right, and also aggregated by my tumblr feed,) but I've ran into a lot of things that aren't on a feed and thusly can't be easily 'shared'.&lt;br /&gt;&lt;br /&gt;So, that'&lt;a href="http://yoopergeek.tumblr.com"&gt;s yoopergeek.tumblr.com&lt;/a&gt;, and it's &lt;a aiotitle="RSS feed" href="http://yoopergeek.tumblr.com/rss"&gt;RSS feed&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7168682189082291572?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7168682189082291572/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7168682189082291572' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7168682189082291572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7168682189082291572'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/03/tumblr.html' title='Tumblr'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-6034141476216309732</id><published>2008-03-11T20:08:00.001-04:00</published><updated>2008-03-11T20:10:17.921-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='evdo'/><category scheme='http://www.blogger.com/atom/ns#' term='alltel'/><title type='text'>A little extra EVDO info</title><content type='html'>In my last post about my new-found broadband, I should have linked &lt;a href="http://evdoinfo.com"&gt;EVDOInfo.com&lt;/a&gt; Specifically, their &lt;a href="http://www.evdoinfo.com/content/view/37/61/"&gt;"What is EVDO?"&lt;/a&gt; page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-6034141476216309732?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/6034141476216309732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=6034141476216309732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/6034141476216309732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/6034141476216309732'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/03/little-extra-evdo-info.html' title='A little extra EVDO info'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-1828765061280537696</id><published>2008-03-09T22:59:00.004-04:00</published><updated>2008-03-09T23:28:55.580-04:00</updated><title type='text'>Current Reading</title><content type='html'>Over a year ago, I subscribed to &lt;a href="http://www.makezine.com/magazine/"&gt;MAKE Magazine&lt;/a&gt; after following the &lt;a href="http://www.makezine.com/"&gt;MAKE RSS feed&lt;/a&gt; for probably 6 months before that.  I loved the magazine, but felt slightly left out of many of the projects being covered.&lt;br /&gt;&lt;br /&gt;See, while I have a lot of software development background, I have very little electronics background.  I did grow up playing with those &lt;a href="http://www.amazon.com/Vintage-Sports-Cards-MX-906-Electronic/dp/B00005K2SY"&gt;"100-in-1 Electronics Projects" kits &lt;/a&gt;but electronics never really took off in my mind. &lt;br /&gt;&lt;br /&gt;I've taken a couple (pathetic) stabs at it in the past, but I always lost interest when I couldn't find any good introductory reading material.  The things I would read seemed so far detached form the level that I wanted to be involved with. (Does that makes sense?)  I knew I had to learn about the low-level concepts such as electromotive force, current, power, and how they relate to each other, but everything I tried reading just didn't seem to hit the right 'buttons' in my head to click. &lt;br /&gt;&lt;br /&gt;After watching the &lt;a href="http://revision3.com/systm/avr101/"&gt;AVR Episode&lt;/a&gt; of &lt;a href="http://revision3.com/systm/"&gt;Systm&lt;/a&gt;, I thought "holy crap, I can do that, and these AVR microprocessors?  They seem right up my alley!"  I don't know what it was, but there was something about that episode that made electronics, at least simple microprocessor-based electronics, feel accessible to me: &lt;span style="font-style: italic;"&gt;Wire up a simple chip-programmer.  Write some code.  Compile some code.  Push code to chip.  Blinky LED!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I really think it had to do with the simplicity of the programmer, and the &lt;a href="http://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/"&gt;hold-your-hands instructions they linked to&lt;/a&gt; that grabbed me and said: "You're gonna learn another hobby, buck-o."&lt;br /&gt;&lt;br /&gt;I played a bit on a breadboard, never actually making that AVR programmer (yet).  I again thought: "Yeah...this is cool...but I still need a good book."  I dug around for a while, and of course, there's a ton of books on &lt;a href="http://www.google.com/search?q=Learning+electronics"&gt;"learning electronics"&lt;/a&gt;...kinda makes picking one a tough choice.  &lt;br /&gt;&lt;br /&gt;Luckily, while on Amazon I was reading a scathing review for some book that I don't remember. The reviewer mentioned "Gibilisco's book", and how great it was for the total newbie.  "Not too in depth, not too light."  The freakin' just-right porridge of the 'learning-electronics' book world is what it sounded like!&lt;br /&gt;&lt;br /&gt;I searched, found, and purchased Gibilisco's book and have been reading it (slowly) for over a week now, and I have to agree with that reviewers sentiment: So far, this book is good for beginners. I like that it's easy to read and understand, and at the end of every chapter, there's a test.  It feels like a book from school in some ways...but without that $250 price tag. &lt;br /&gt;&lt;a href="http://www.amazon.com/gp/product/0071459332?ie=UTF8&amp;amp;tag=yoopergeek-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0071459332"&gt;&lt;img src="http://1.bp.blogspot.com/_qt9sjR3SvlA/R9SpNamVNjI/AAAAAAAABQ0/0AF8tQ5mweo/s400/31TGVcgJ5qL._AA_SL160_.jpg" border="0" /&gt;&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=yoopergeek-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0071459332" alt="" style="border: medium none  ! important; margin: 0px ! important; display: none;" border="0" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;I'll probably write more about this as the time goes on.  But from what I've read so far of this book, I like it, and I'd recommend it to any 'geeky' individual who just hasn't found the right reading material to get them into electronics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-1828765061280537696?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/1828765061280537696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=1828765061280537696' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/1828765061280537696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/1828765061280537696'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/03/current-reading-and-new-hobbies.html' title='Current Reading'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qt9sjR3SvlA/R9SpNamVNjI/AAAAAAAABQ0/0AF8tQ5mweo/s72-c/31TGVcgJ5qL._AA_SL160_.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-420225650018030884</id><published>2008-03-09T21:22:00.003-04:00</published><updated>2008-03-09T22:19:33.764-04:00</updated><title type='text'>Motorola ROKR (MOTOROKR Z6m) + Alltel EVDO == "Finally, broadband in my home!"</title><content type='html'>My family and I live in one of the &lt;a href="http://maps.live.com/?v=2&amp;sp=Point.rvkw487mn1t9_Work_I%20work%20here._http%3A%2F%2Fwww.roadsoft.org%2F_&amp;encType=1"&gt;few remaining middle-of-nowheres&lt;/a&gt;. There's plenty of nice things about our &lt;a href="http://www.cityofhoughton.com/"&gt;middle-o-nowhere&lt;/a&gt;: it's cozy, it has just about everything you need and it's surrounded by pretty much nothing but &lt;a href="http://pasty.com/cam/index.html"&gt;beautiful sites&lt;/a&gt; for at least 100 miles. Heck, it even has bandwidth options out the wa-zoo: &lt;a href="http://www.charter.com"&gt;cable&lt;/a&gt;, &lt;a href="http://www.att.com"&gt;DSL&lt;/a&gt;, and even &lt;a href="http://www.pasty.net"&gt;line-of-sight wireless DSL&lt;/a&gt;. Naturally, we bought a house that's just far enough out of town to not have access to any of these options.&lt;br /&gt;&lt;br /&gt;"But I work in front of a computer all day...surely I don't need/want broadband at home?"  Yeah...I kept telling myself that for the last 8 years.  The &lt;a href="http://www.johndee.com/history.htm"&gt;winters are just too long&lt;/a&gt; around here to not have broadband.  Of course, I've always had the satellite option, but it just wasn't for me -- large initial setup costs, and then hefty monthly fees, mixed with latency issues. &lt;br /&gt;&lt;br /&gt;Thankfully, finally, as I sit here and type this, I'm on something other than dialup, and man, I gotta say, Alltel has got a decent thing going right now.  I wish I could say I'm being paid for this free advertising, but I'm not.  I'm just thrilled to the core to have bandwidth!&lt;br /&gt;&lt;br /&gt;I recently got a new cell phone, the &lt;a href="http://direct.motorola.com/hellomoto/motorokrz6m/"&gt;Motorola ROKR Z6m&lt;/a&gt;. I won't go into the snazzy details of the phone -- click that link if you want details.&lt;br /&gt;&lt;br /&gt;We've had an Alltel contract for nearly two years now.  A while back, as I drove home from work, I noticed the Alltel store had a banner outside proclaiming "$25 HIGH SPEED INTERNET FOR YOUR PC!"  Huh.  I eventually got around to checking it out.  It's just that. $25/month, for, as far as I can tell, truly unlimited data transfer.  I've heard it called 'tethered' internet because you have to hook your phone to you computer via USB (or possibly bluetooth...) Anyway, it's nice in that it's not a contracted service - you can turn add/remove it from your plan whenever you want. &lt;br /&gt;&lt;br /&gt;Now, if you're reading this and you don't have broadband, and you're considering going with this Alltel-route, maybe I can save you some money and trouble. Visit the &lt;a href="http://www.alltel.com/wps/portal/AlltelPublic/Content?WCM_GLOBAL_CONTEXT=/wps/wcm/connect/Personal/home/p/internetaccess/dinternetaccess"&gt;alltel page for some brief details&lt;/a&gt;. Scroll all the way to the bottom and you'll see the "Wireless Internet Kit" which strangely, includes a cable. All this kit has are cable(s) for hooking your phone to your PC's USB port, and some software/drivers on a CD.&lt;br /&gt;&lt;br /&gt;If you have a phone that has a USB connection on it, just pick up the most affordable USB cable you can find. If not, well, you may want to spring for the $60 kit...or maybe splurge and upgrade to a new phone?  Make sure it's an EVDO phone!  For the software, all you need are the USB drivers. You can download these drivers &lt;a href="https://developer.motorola.com/docstools/USB_Drivers/"&gt;directly from Motorola&lt;/a&gt; (free registration required to download.)  After downloading and installing the drivers, but before hooking your phone to your PC, make sure your phone is set to work as a modem when hooked up via USB, this should be buried under the "Connection" settings. &lt;span style="font-style:italic;"&gt;Now &lt;/span&gt;hook your phone to your PC.&lt;br /&gt;&lt;br /&gt;Assuming you have your internet plan turned on, your phone has signal, your drivers are 'happy' with the phone, all you need to do to get connected is to setup a new dialup internet connection in Windows (sorry, I'm not a Mac guy, and I've not the desire to make this work under *nix.)  The number you need to dial will be "#777". For username and password, use "[YourPhoneNumber]@alltel.net", ie: 1235551212@alltel.net. The password should be "alltel".&lt;br /&gt;&lt;br /&gt;Dialup and you should be connected!&lt;br /&gt;&lt;br /&gt;Check me out!  It's not amazing, but you must admit it's a &lt;span style="font-style:italic;"&gt;ton &lt;/span&gt;better than dialup. :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qt9sjR3SvlA/R9SWOamVNiI/AAAAAAAABQs/2IaEEPi0qN4/s1600-h/speedtest.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_qt9sjR3SvlA/R9SWOamVNiI/AAAAAAAABQs/2IaEEPi0qN4/s400/speedtest.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5175927046157973026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PS: I've left out some details here as it's getting late, but big thanks to Mikie and mom for helping get my contract squared away, and thank you interpipes for offering up the answers as you always do. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-420225650018030884?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/420225650018030884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=420225650018030884' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/420225650018030884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/420225650018030884'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2008/03/motorola-rokr-motorokr-z6m-alltel-evdo.html' title='Motorola ROKR (MOTOROKR Z6m) + Alltel EVDO == &quot;Finally, broadband in my home!&quot;'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qt9sjR3SvlA/R9SWOamVNiI/AAAAAAAABQs/2IaEEPi0qN4/s72-c/speedtest.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-7327910917099102915</id><published>2007-11-14T18:35:00.001-05:00</published><updated>2007-12-06T10:31:10.650-05:00</updated><title type='text'>Cloaking/Hiding/Filtering Unwanted Directories During Checkout (aka "Partial Checkouts") With Subversion 1.4.x</title><content type='html'>&lt;h2&gt;The Problem:&lt;/h2&gt;  &lt;p&gt;Ever find yourself working with a large-ish SVN repository that includes many sub-projects, and you only want to work on a subset of those sub-projects, but you don't want to deal with all the extra cruft involved in checking out at the top level of the repository?&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;What's this guy talking about?&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Sorry, a picture will help me explain.&amp;#160; Below is a snapshot of an old repository of &lt;a href="http://merl.michiganltap.org" target="_blank"&gt;one of products&lt;/a&gt; we develop here at work:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/jtpoll/RzuGJsVXx2I/AAAAAAAABE8/lXGjGHcOJVY/00_source_repo_browse%5B8%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="388" alt="00_source_repo_browse" src="http://lh4.google.com/jtpoll/RzuGKcVXx3I/AAAAAAAABFE/6DQ7-2iRvO4/00_source_repo_browse_thumb%5B6%5D.png" width="479" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As you can see, trunk consists of multiple sub-components, each of which have their own branches/tags/trunk folders.&amp;#160; Whether or not this is the best repository layout could be up for debate, but it seems to treat us well with the design of this project. (We have a repository layout similar to this for &lt;a href="http://www.roadsoft.org" target="_blank"&gt;another project&lt;/a&gt; we have, and it seems to serve us well there as well.)&lt;/p&gt;  &lt;p&gt;The big problem we have with this repository layout is that you never want to checkout that top-level trunk.&amp;#160; You end up with all of the sub-branches and tags folders that are not only superfluous, but also waste space and make the commit or update process so much slower because SVN must check all the sub-folders for modifications.&lt;/p&gt;  &lt;p&gt;What ends up happening, for example, is someone needs to work on the &amp;quot;Bids&amp;quot; and &amp;quot;Main&amp;quot; components at the same time.&amp;#160; To facilitate this without checking out at the trunk-level is they create two separate working folders, and check out each respective component's trunk (or appropriate branch).&amp;#160; When they commit, they have to make two separate commits.&lt;/p&gt;  &lt;p&gt;While this works, it's not desirable, especially if you aspire to reach &lt;a href="http://en.wikipedia.org/wiki/Continuous_Integration"&gt;Continuous Integration&lt;/a&gt; nirvana. Not being able to create an atomic commit across various working folders could potentially break things in a CI environment if changes in one component rely upon the changes of another.&amp;#160; Even if CI isn't your eventual goal, an atomic commit of 'grouped changes' just makes sense.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;What to do?&amp;quot;&lt;/em&gt;&amp;#160; &lt;/p&gt;  &lt;h2&gt;The Fix:&lt;/h2&gt;  &lt;p&gt;Well, the good news is that Subversion 1.5 is supposed to have better support for 'partial checkouts'.&amp;#160; I'll admit I haven't kept up with that aspect of v1.5, to be totally honest, I'm more excited about &lt;a href="http://blogs.open.collab.net/svn/2007/05/the_subversion__1.html"&gt;merge tracking&lt;/a&gt;. But that's for another post.&lt;/p&gt;  &lt;p&gt;But anyway, there is a work-around in SVN 1.4.x (and probably earlier versions..sorry for not doing any fact-checking here.)&amp;#160; Well, maybe work-around isn't the right word, it's more of an off-label use of a repository feature.&lt;/p&gt;  &lt;p&gt;Before continuing on, you must know that I'm primarily a Windows developer.&amp;#160; I use &lt;a href="http://subversion.tigris.org"&gt;Subversion&lt;/a&gt; on Windows via the excellent &lt;a href="http://tortoisesvn.tigris.org/"&gt;TortoiseSVN&lt;/a&gt; front end. The following how-to is going to be using TortoiseSVN.&amp;#160; Everything that follows is entirely possible with the command line SVN tools, and, if there's enough request, I'll update this post with how to do it from the command line. (&lt;a href="mailto:jtpoll@gmail.com"&gt;email me!&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;quot;Get to it already, would ya?&amp;quot;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Sorry, here we go, in short:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a repository on your local machine. &lt;/li&gt;    &lt;li&gt;Checkout a working copy of the repository and specify an svn:external property that will link to the portions of the remote repository you really want to work with. (Read the &lt;a href="http://svnbook.red-bean.com/en/1.4/svn.advanced.externals.html"&gt;SVN Book&lt;/a&gt; for important notes and details.) &lt;/li&gt;    &lt;li&gt;Commit this svn:externals property back to the local repository. &lt;/li&gt;    &lt;li&gt;Update you working copy of the local repository and you'll have checked out the parts of the remote repository you want to work with. &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Details:&lt;/h2&gt;  &lt;p&gt;Create a new folder somewhere on your machine, make sure it's in a place that you won't forget, and in non-obtrusive location because once this is created, it can't be moved without causing you pain in the process. ;)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jtpoll/RzuGK8VXx4I/AAAAAAAABFM/HI32vE_eNvg/01_myfilterrepo%5B2%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="105" alt="01_myfilterrepo" src="http://lh3.google.com/jtpoll/RzuGLMVXx5I/AAAAAAAABFU/FTbBBdGhcpQ/01_myfilterrepo_thumb.png" width="115" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;MyFilterRepo&lt;/em&gt; is a folder on my desktop.&amp;#160; Now, using TortoiseSVN, create an empty repository inside that new folder.&amp;#160; Right click on the folder, choose&amp;#160; &lt;em&gt;TortoiseSVN -&amp;gt; Create repository here...&lt;/em&gt;&amp;#160; Choose the 'FSFS' file system type.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jtpoll/RzuGLcVXx6I/AAAAAAAABFc/lK8Ah0hRFFs/02_create_repo%5B6%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="204" alt="02_create_repo" src="http://lh6.google.com/jtpoll/RzuGL8VXx7I/AAAAAAAABFk/L_iZrPPQAe8/02_create_repo_thumb%5B4%5D.png" width="407" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Then, browse this repository, right-click the folder, &lt;em&gt;TortoiseSVN-&amp;gt;Repo-browser:&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/jtpoll/RzuGMMVXx8I/AAAAAAAABFs/hFLcpbaD2-8/03_repo_browse%5B5%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="97" alt="03_repo_browse" src="http://lh4.google.com/jtpoll/RzuGMcVXx9I/AAAAAAAABF0/YT0lH6VSueg/03_repo_browse_thumb%5B3%5D.png" width="415" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Create a 'trunk' folder (or any other folder...it doesn't really matter:)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jtpoll/RzuGM8VXx-I/AAAAAAAABF8/jrLxRRT2vek/04_create_trunk%5B5%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="240" alt="04_create_trunk" src="http://lh4.google.com/jtpoll/RzuGNcVXx_I/AAAAAAAABGE/45w0DxKs2bc/04_create_trunk_thumb%5B3%5D.png" width="421" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Create another empty folder some place.&amp;#160; Checkout the trunk folder from the repository you just created by specifying the file:///bla/bla/bla/trunk style URL:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/jtpoll/RzuGNsVXyAI/AAAAAAAABGM/FXWCf8DAqr8/05_checkout%5B2%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="83" alt="05_checkout" src="http://lh6.google.com/jtpoll/RzuGN8VXyBI/AAAAAAAABGU/XhMyjIe87PQ/05_checkout_thumb.png" width="168" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now, specify the svn:external properties that will link your local repository's trunk folder to multiple remote repository folders. To do this, right-click on your working folder, and choose &lt;em&gt;TortoiseSVN-&amp;gt;Properties&lt;/em&gt;. In the dialog that pops up, click the '&lt;em&gt;Add&lt;/em&gt;' button. This will bring you to this dialog:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jtpoll/RzuGOcVXyCI/AAAAAAAABGc/3HnE4s04u1A/06_specify_externals%5B4%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="251" alt="06_specify_externals" src="http://lh5.google.com/jtpoll/RzuGOsVXyDI/AAAAAAAABGk/tF_UWnZPYzA/06_specify_externals_thumb%5B2%5D.png" width="479" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Choose '&lt;em&gt;svn:externals&lt;/em&gt;' From the &lt;em&gt;Property name&lt;/em&gt; combo box. In the &lt;em&gt;Property value&lt;/em&gt; text box, you will need to enter key/value pairs of the remote repositories.&amp;#160; The first item on the line is what you want folder to be named in your local repository.&amp;#160; The second item on the line is the full path to the remote repository.&amp;#160; (If you have credentials already cached for the remote repository, you shouldn't have a problem, otherwise you'll probably be asked to specify your username/password when you update later.)&lt;/p&gt;  &lt;p&gt;When you hit the &amp;quot;&lt;em&gt;OK&lt;/em&gt;&amp;quot; button, you'll notice that your working folder has been changed:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/jtpoll/RzuGPMVXyEI/AAAAAAAABGs/WhILMgviyjA/07_specify_externals2%5B4%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="274" alt="07_specify_externals2" src="http://lh4.google.com/jtpoll/RzuGPcVXyFI/AAAAAAAABG0/w5kq_sfxbl0/07_specify_externals2_thumb%5B2%5D.png" width="479" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, commit your working folder back to your local repository.&amp;#160; Don't worry, the repository(ies) linked via the svn:externals property will not be modified at this time.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/jtpoll/RzuGPsVXyGI/AAAAAAAABG8/ao-CdBveyfI/08_externals_commited%5B3%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="165" alt="08_externals_commited" src="http://lh6.google.com/jtpoll/RzuGP8VXyHI/AAAAAAAABHE/BKrINomuc1o/08_externals_commited_thumb%5B1%5D.png" width="420" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, update your working folder.&amp;#160; You'll notice that all of the repository locations mentioned in your svn:externals property will be checked out to your working folder.&amp;#160; Hooray!&amp;#160; You did it!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jtpoll/RzuGQcVXyII/AAAAAAAABHM/QNE3loDCUjw/09_update_includes_externals%5B3%5D.png"&gt;&lt;img id="id" style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="220" alt="09_update_includes_externals" src="http://lh6.google.com/jtpoll/RzuGQ8VXyJI/AAAAAAAABHU/LOHXZdhRmwg/09_update_includes_externals_thumb%5B1%5D.png" width="479" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You are now able to work in the sections of the remote repository that you want to work on, while completely ignoring all the other cruft that you don't want to see or care about. When you commit any changes to this local repository, you'll be pushing those changes to the remote repository in a single atomic commit.&amp;#160; &lt;/p&gt;  &lt;p&gt;(I must admit, I originally &lt;a href="http://tortoisesvn.net/node/238"&gt;found this via tortoisesvn.net&lt;/a&gt;, but since it's been one of those issues that I've dealt with for so long, I decided I had to duplicated the work-around here. )&lt;/p&gt;  &lt;p&gt;To further understand how this works, I must again point you to &lt;a href="http://svnbook.red-bean.com/en/1.4/svn.advanced.externals.html"&gt;the section of the official SVN book&lt;/a&gt; that describes externals, and what they're really intended to be used for.&lt;/p&gt;  &lt;p&gt;Let me know if this helps!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Update - Gotchas&lt;/h2&gt;  &lt;p&gt;Surprisingly, there are very few gotchas with this technique. Thankfully, the only ones I've discovered are easily worked-around.   &lt;br /&gt;So, you have multiple externals defined, and you've made changes to the various external 'parts', like so:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jtpoll/R1gVuudVZvI/AAAAAAAABH8/8mXk3CkYytA/10_commit_multiple_externals%5B2%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="188" alt="10_commit_multiple_externals" src="http://lh5.google.com/jtpoll/R1gVu-dVZwI/AAAAAAAABIE/cBO5R4CYEIk/10_commit_multiple_externals_thumb" width="160" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Normally, to commit those changes, you'd go to the parent folder, and choose to commit from there. The problem is, as you'll notice, is that TortoiseSVN will give you a message like: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jtpoll/R1gVvOdVZxI/AAAAAAAABIM/6BpbgboRn1E/11_tortoise_notification%5B3%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="166" alt="11_tortoise_notification" src="http://lh4.google.com/jtpoll/R1gVvudVZyI/AAAAAAAABIU/dWc3Skz7yO4/11_tortoise_notification_thumb%5B1%5D" width="479" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You'll also notice that the list of modified files doesn't include your changes. Notice how the message states that you'll have to commit those changes &lt;i&gt;separately&lt;/i&gt;. If we'd RTFM'd like we were supposed to, we'd notice the paragraph near the bottom of &lt;a href="http://svnbook.red-bean.com/en/1.0/ch07s03.html"&gt;Chapter 7, Section 3 of the SVN Book&lt;/a&gt; states: &lt;i&gt;&amp;quot;So, for example, if you want to commit changes that you've made in one or more of those external working copies, you must run svn commit explicitly on those working copies&amp;#8212;committing on the primary working copy will not recurse into any external ones.&amp;quot;&lt;/i&gt;    &lt;br /&gt;This is exactly what we're trying to &lt;u&gt;not&lt;/u&gt; do! Thankfully, there's a work-around which allows us to still create atomic commits across those externals:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Go into the the working folder &lt;/li&gt;    &lt;li&gt;Select each folder that has modifications that you want to commit. &lt;/li&gt;    &lt;li&gt;Right-click -&amp;gt; SVN Commit &lt;/li&gt;    &lt;li&gt;&lt;i&gt;TADA&lt;/i&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Now, what we haven't ran into, but I imagine could theoretically happen is, what if one of those externally-included sources itself has external-definitions? For example, in the sample repository we've been using here, what if the DBManager had an external definition? If you made modification inside that nested external definition, there would be no way for you to commit the changes inside that nested external definition, &lt;i&gt;and&lt;/i&gt; the changes in your home-spun externals repository.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7327910917099102915?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7327910917099102915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7327910917099102915' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7327910917099102915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7327910917099102915'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/11/cloakinghidingfiltering-unwanted.html' title='Cloaking/Hiding/Filtering Unwanted Directories During Checkout (aka &amp;quot;Partial Checkouts&amp;quot;) With Subversion 1.4.x'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-8518202080509505752</id><published>2007-11-01T10:33:00.001-04:00</published><updated>2007-11-05T09:03:00.399-05:00</updated><title type='text'>Dell / EMC AX150i/AX150SCi and Windows Server 2003 x64 iSCSI Initiator Woes</title><content type='html'>&lt;p&gt;Can I have a much larger post name?&amp;#xA0; &lt;/p&gt;  &lt;p&gt;In summary, this post details troubles I experienced by doing the right thing: I RTFM'd, and the manual was wrong.&lt;/p&gt;  &lt;p&gt;I'm not sure how many people this post will help, but I know I'm writing it under the same guidelines I usually follow for posting: I had a hard time solving a problem, and the internet at large really didn't offer me much help, so, here we are.&lt;/p&gt;  &lt;p&gt;At work we recently purchased a new server and storage-area-network (SAN) device:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Server: Dell 2950      &lt;ul&gt;       &lt;li&gt;Dual Intel Xeon 5320's (quad-core!) (1.86Ghz, 4MB cache, 1066MHz FSB) - 8 cores! &lt;/li&gt;        &lt;li&gt;16GB RAM &lt;/li&gt;        &lt;li&gt;6 160GB hard drives - RAID5'd via the integrate PERC 5/i RAID card. (I have some gripes about the PERC 5/i that I may describe in a later post.) &lt;/li&gt;        &lt;li&gt;Dual integrated gigabit ethernet adapters. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;SAN Device: Dell / EMC AX150i SP (ie: EMC AX150SCi)      &lt;ul&gt;       &lt;li&gt;iSCSI interface &lt;/li&gt;        &lt;li&gt;Single storage processor (ie: &amp;quot;SP&amp;quot; in Dell-speak, &amp;quot;SCi&amp;quot; in EMC-speak) &lt;/li&gt;        &lt;li&gt;8 250GB HD's in a RAID-5 config (with space for 4-more drives, and the ability to swap-in 750GB drives!) &lt;/li&gt;        &lt;li&gt;Separate 8-port Dell PowerConnect 2708 gigabit ethernet switch for the SAN network backbone / 'fabric'. &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The 2950 is great, we're got it running Windows Server 2003 R2 Standard x64 Edition (this is important for later...) We have another 2950 in the office, and the only complaint I have with both of them is the server management software's inability to notify you, in any useful way, of RAID-failure events.&amp;#xA0; This is actually a problem with the integrated PERC 5/i card, but that's not what this post is about read &lt;a href="http://msmvps.com/blogs/onq/archive/2007/03/30/on-dell-s-perc-5-i.aspx"&gt;Eric Neale's post about the PERC 5/i&lt;/a&gt; for more details on that gripe.&lt;/p&gt;  &lt;p&gt;The SAN is pretty great too, except it's setup software is giving me problems, but before we get to that, a little more information on the configuration, and steps I took to get to the problem.&lt;/p&gt;  &lt;p&gt;I'm going to be using the AX150 in a less-than-super redundant configuration.&amp;#xA0; I have the PowerConnect 2708 switch configured to be the primary switch for a private network that is used only for this storage-area-network.&amp;#xA0; The 2950 does not have an iSCSI host bus adapter (HBA), it's going to connect to the SAN with it's secondary NIC. Installing the necessary software on the Windows side of this was very easy.&amp;#xA0; Getting that software configured to work with the AX150 wasn't so.&lt;/p&gt;  &lt;p&gt;I've followed EMC's instructions to-a-'T', which pretty much proceed as:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Install the Microsoft iSCSI Initiator software&lt;/li&gt;    &lt;li&gt;Install the latest EMC PowerPath software &lt;/li&gt;    &lt;li&gt;Install the latest EMC Navisphere Server Utility&lt;/li&gt;    &lt;li&gt;Install the latest EMC Navisphere Initialization Utility &lt;/li&gt;    &lt;li&gt;...then follow the configuration steps.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I downloaded and installed v2.0.5 of the MS Software Initiator - followed EMC's specification that I install the 'Initiator Server' and the 'Software Initiator' - but not the 'MPIO Multipathing&amp;#xA0; Support for iSCSI.' This gave me an icon in my control panel and on my desktop.&amp;#xA0; EMC's documentation didn't state anything about configuring it at this point, so I left it alone. (yeah, that's foreshadowing.)&lt;/p&gt;  &lt;p&gt;I then downloaded and installed EMC's PowerPath v5.1.0 from their registration-only support site.&amp;#xA0; This required a reboot to finalize installation.&lt;/p&gt;  &lt;p&gt;Next up I downloaded and installed&amp;#xA0; v6.20.4.2.0 of the Navisphere AX Server Utility. This is where I ran into a couple separate issues.&amp;#xA0; In the box of the AX150 there was a big-poster-style &amp;quot;Getting Started&amp;quot; guide that came with the AX150.&amp;#xA0; At the point where it says to install the Server Utility it states to install with the defaults, and to make sure that the 'Registration Server' &lt;em&gt;is&lt;/em&gt; installed - which it states is the default.&amp;#xA0; But, it was disabled by default when I ran the installer.&amp;#xA0; The documentation I retrieved directly from EMC's web site stated that I should explicitly &lt;em&gt;&lt;u&gt;not&lt;/u&gt;&lt;/em&gt; install the 'Registration Service'.&amp;#xA0; Okaaaaaay. So, which is correct? First time through, I choose not to install it because I figured the online documentation was more recent/up-to-date. The second snag in this installation started when it asked me: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;&lt;i&gt;Are you installing this utility on a server that is using the Microsoft iSCSI initiator to connect to the CLARiiON storage system?&lt;/i&gt;&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Neither the 'big-poster' or the online documentation stated what I should choose, so, since it sounded appropriate, I choose 'Yes'. It then presented this message/error:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;&lt;em&gt;Microsoft Initiator is needed to setup your iSCSI devices. InstallShield does not find Microsoft Initiator installed on your computer. Please download Microsoft Initiator from &lt;/em&gt;&lt;a href="http://www.microsoft.com"&gt;&lt;em&gt;www.microsoft.com&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and install it.&lt;/em&gt;&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Whaaaaaaaat?&amp;#xA0; I had already installed MS iSCSI Initiator!&amp;#xA0; Strangely though, the installation didn't abort, and continued on to completion with no other errors or strange messages.&lt;/p&gt;  &lt;p&gt;After this, I download and installed v6.20.0.3.11 of the Navisphere Initialization Tool. After this is installed, I was instructed to use it to initialize the AX150. The initialization process assigns IP addresses to the management interface and iSCSI ports on the unit.&amp;#xA0; &lt;/p&gt;  &lt;p&gt;After initialization, I was instructed to open the Server Utility and choose the &amp;quot;&lt;strong&gt;&lt;em&gt;Configure iSCSI Connections on this server&lt;/em&gt;&lt;/strong&gt;&amp;quot; option. Well, look at the screenshot below and you tell me what I should choose:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jtpoll/Ryo-GMdLieI/AAAAAAAABEI/jSFirME7etg/emc_server_utility%5B7%5D.png"&gt;&lt;img id="id" style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="334" alt="emc_server_utility" src="http://lh4.google.com/jtpoll/Ryo-GsdLifI/AAAAAAAABEQ/IHRwjl6yMqU/emc_server_utility_thumb%5B5%5D.png" width="474" border="0" /&gt;&lt;/a&gt;&amp;#xA0;&lt;/p&gt;  &lt;p&gt;Yup.&amp;#xA0; There's my problem summed up in a screenshot.&amp;#xA0; Figuring I had missed something, or done something wrong, I meticulously combed through my installation notes, and cross-referenced the installation documentation. I tried rolling back installations and re-installing with different options. (Specifically, I tried installing the 'Registration Service', and I also tried answering 'no' to the Server Utilities install question mentioned earlier.)&amp;#xA0; No combination of installation options made a difference. I spelunked through more documentation on EMC's support site.&amp;#xA0; I looked on Dell's site for documentation -- they kept pointing me to EMC's support site.&amp;#xA0; I tried Google for answers - I found nothing.&amp;#xA0; &lt;/p&gt;  &lt;p&gt;I finally decided I'd have to get in touch with Dell.&amp;#xA0; I went to their support page, got to their 'online chat support' area, entered the AX150's service-tag, and, tada, found that everyone was busy with someone else.&amp;#xA0; (It's nice to see chat-support is no-more available than phone support.)&amp;#xA0; I tried a couple times, hoping to get through.&amp;#xA0; Nothing.&amp;#xA0; I really didn't want to email them because I needed to get this system online, and who knows how many days turn-around it would take to get resolved via email.&amp;#xA0; &lt;/p&gt;  &lt;p&gt;I started looking for the correct phone number to call, and I somehow, probably because I'd entered the AX150's service tag, I found myself at a tech-support page specific to the AX150.&amp;#xA0; There's a section near the top: &amp;quot;&lt;em&gt;Top Solutions : Frequently Asked Questions About Your Model&lt;/em&gt;&amp;quot;:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;em&gt;What is RAID 0 and RAID 1&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;&lt;em&gt;What is RAID 5&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;&lt;em&gt;How can I collect the SP event logs from a CLARiiON FC4700 or CS-Series array using the serial port?&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;&lt;em&gt;How do I configure the LUNs on my DELL|EMC&amp;#xAE; array?&lt;/em&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://support.dell.com/support/topics/global.aspx/support/dsn/en/document?docid=3073946DB8788D79E040A68F5B286BEB"&gt;&lt;em&gt;&lt;u&gt;EMC&amp;#xAE; Navisphere&amp;#xAE; Server Utility iSCSI configuration is not available in Microsoft&amp;#xAE; Windows&amp;#xAE; 2003 64-bit&lt;/u&gt;&lt;/em&gt;&lt;/a&gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;(Side question: What's with questions #1 and #2?&amp;#xA0; &amp;quot;You must be at least this smart to ride this ride.&amp;quot; comes to mind. hehe.)&lt;/p&gt;  &lt;p&gt;Number five!&amp;#xA0; Look at that!&amp;#xA0; That's exactly my problem! Dell's documentation had the answer, not EMC's!&amp;#xA0; Dell keeps redirecting you to EMC's documentation when they had the answer to my question all along.&amp;#xA0; &lt;/p&gt;  &lt;p&gt;It's a bummer that I had to spend this much time finding this answer because getting things configured manually through the MS iSCSI Initiator is really quite simple.&lt;/p&gt;  &lt;p&gt;Oh well...live-n-learn. &lt;/p&gt; &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-8518202080509505752?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/8518202080509505752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=8518202080509505752' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8518202080509505752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8518202080509505752'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/11/dell-emc-ax150iax150sci-and-windows.html' title='Dell / EMC AX150i/AX150SCi and Windows Server 2003 x64 iSCSI Initiator Woes'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-2120743801651159558</id><published>2007-10-28T16:43:00.000-04:00</published><updated>2007-11-18T20:24:11.980-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='zend'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='pdt'/><title type='text'>Getting Breakpoints to work in Eclipse PDT using Zend Debugger</title><content type='html'>November 18th, 2007 UPDATE: Please see the &lt;a href="#update"&gt;section at the bottom of this post&lt;/a&gt; for an update!&lt;br /&gt;&lt;br /&gt;I've recently been fooling around with PHP.&lt;br /&gt;&lt;br /&gt;At work we have a &lt;a href="http://www.blogger.com/drupal.org"&gt;Drupal&lt;/a&gt;-based web site, and I figured it was time to get a better mental-grasp around PHP.  After looking through a whitepaper from IBM titled &lt;a href="http://www.ibm.com/developerworks/ibm/osource/index.html"&gt;Using open source software to design, develop, and deploy a collaborative Web site&lt;/a&gt; I decided I needed to get myself a development environment setup in which I could work with Drupal 'under-the-hood'. &lt;br /&gt;&lt;br /&gt;IBM's whitepaper was written in various pieces over the course of about a years time.  One of the sections discusses setting up &lt;a href="http://www.blogger.com/www.eclipse.org"&gt;Eclipse&lt;/a&gt; with different plugins that facilitate PHP development. In a later section they mention the &lt;a href="http://www.eclipse.org/pdt/"&gt;PHP Development Tools (PDT)&lt;/a&gt; - a more comprehensive set of PHP development and debugging tools for Eclipse.  Lucky for me, they now have a PDT all-in-one Eclipse package that makes setup even easier. (Get the package from &lt;a href="http://download.eclipse.org/tools/pdt/downloads/"&gt;here&lt;/a&gt;.)  After downloading and installing it, and getting a feel for the whole thing (wow, Eclipse is complicated at first,) I got down to the brass-tacks and tried debugging.&lt;br /&gt;&lt;br /&gt;Before I go on, here's a little more information about my development environment:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OS: Window XP SP2&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Development Environment:&lt;br /&gt;   &lt;ul&gt;&lt;li&gt;Eclipse : PDT&lt;br /&gt;   &lt;/li&gt;&lt;li&gt;PHP 5.2.4&lt;br /&gt;   &lt;/li&gt;&lt;li&gt;MySQL 5.Something&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Web server: Apache&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;PHP, MySQL and Apache are all from the &lt;a href="http://www.apachefriends.org/en/xampp.html"&gt;Apache Friend's XAMPP package.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I followed the instructions on the PDT Wiki for instructions on how to &lt;a href="http://www.thierryb.net/pdtwiki/index.php?title=Using_PDT_:_Installation_:_Installing_the_Zend_Debugger"&gt;Install the Zend Debugger&lt;/a&gt; for Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qt9sjR3SvlA/RyTdB8dLiaI/AAAAAAAABDo/JM1sjo20M1g/s1600-h/bad_pdt_debug_config.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_qt9sjR3SvlA/RyTdB8dLiaI/AAAAAAAABDo/JM1sjo20M1g/s400/bad_pdt_debug_config.png" alt="" id="BLOGGER_PHOTO_ID_5126465301332593058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just for reference, in the screenshot above, you'll notice my "Dummy Debugger Test Server" configuration.  Here's a screenshot of the specific details of that config:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qt9sjR3SvlA/RyTfZcdLibI/AAAAAAAABDw/NMNNqUhx4lI/s1600-h/bad_pdt_server_debug_config.png"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_qt9sjR3SvlA/RyTfZcdLibI/AAAAAAAABDw/NMNNqUhx4lI/s400/bad_pdt_server_debug_config.png" alt="" id="BLOGGER_PHOTO_ID_5126467904082774450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After getting everything setup, I could get the debugger to debug any PHP-based web page -- so long as I had the "Break at First Line" debugging option set. I could start the debugger and at the first line of PHP code, the debugger would 'catch', and allow me to step through my code.  Everything worked as expected - variables and their values were visible in the Variables dialog, I could step into and out of various functions.  Unfortunately, if I set breakpoints anywhere, they would never 'hit', the debugger wouldn't halt the PHP execution on the specified breakpoints.  It would zip right past them as though they never existed.&lt;br /&gt;&lt;br /&gt;Naturally I hit-up my good friend Google for answers.  I found a number of people having the same problem as myself.  I found instances of people having this problem all the way back in January of 2007.  I also found instances of people having this problem as recently as October of 2007!  Every single time I found someone saying they had the problem, nobody ever had an answer for them! &lt;br /&gt;&lt;br /&gt;Finally, &lt;span style="font-style: italic;"&gt;finally&lt;/span&gt;, I was able to find &lt;a href="http://dev.eclipse.org/newslists/news.eclipse.tools.pdt/msg01345.html"&gt;this&lt;/a&gt; somewhat cryptic post on how someone fixed the problem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Not sure if this helps, but I ran into the same problem myself. I found out that it was that the plugin expects the project root to be the http root.&lt;br /&gt;&lt;br /&gt;My project structure had the http root as a subfolder of the project root.&lt;br /&gt;&lt;br /&gt;If the http root isn't the same point as the project root, then the plugin can't correctly inform the debugger which file the breakpoint is in.&lt;br /&gt;&lt;br /&gt;I ended up hacking the source to make the plugin work at a subfolder level.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Problem was, he stated that he hacked the source of the plugin to 'make the fix'.  Not exactly what I was hoping to do. I figured I was approaching yet another dead end, but something about him stating that the plugin was simply confused about expecting your Eclipse project's root to be the web server's root gave me an idea: Move my content to the virtual host's root directory.&lt;br /&gt;&lt;br /&gt;I tried moving my project's files all into the root folder of the web server (just dummy.php in this case.)  I modified my "Dummy Debugger Test Server" configuration as shown in this screenshot:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qt9sjR3SvlA/RyTyGsdLicI/AAAAAAAABD4/V-5HmNr77E4/s1600-h/good_pdt_server_debug_config.png"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/_qt9sjR3SvlA/RyTyGsdLicI/AAAAAAAABD4/V-5HmNr77E4/s400/good_pdt_server_debug_config.png" alt="" id="BLOGGER_PHOTO_ID_5126488472681155010" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I made sure that "Break at First Line" was unchecked/disabled, and fire up the debugger.  &lt;u&gt;It worked.&lt;/u&gt; It finally worked.  After all that trouble it freakin' worked.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qt9sjR3SvlA/RyT45sdLidI/AAAAAAAABEA/OLU3cF6kB5A/s1600-h/pdt_breakpoints_working.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_qt9sjR3SvlA/RyT45sdLidI/AAAAAAAABEA/OLU3cF6kB5A/s400/pdt_breakpoints_working.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5126495945924250066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Has anyone else had this much trouble?  Has anyone been able to get debugging to work when your debugged PHP doesn't reside in the root of your web server?&lt;br /&gt;&lt;br /&gt;&lt;a name="update"&gt;November 18th, 2007 Update:&lt;/a&gt;&lt;br /&gt;I think I may have a better example.  I've also been 'playing' around with the &lt;a target="_new" href="http://www.symfony-project.com/"&gt;Symfony PHP Framework&lt;/a&gt;.  I again ran into this breakpoints-not-working problem when trying to debug a Symfony-based project.  &lt;br /&gt;&lt;br /&gt;I'm going through the &lt;a href="http://www.symfony-project.com/askeet/1_0/"&gt;"Askeet" tutorial&lt;/a&gt; and have imported a project into Eclipse and had my Apache instance serving up the "/web" subfolder served up as the server's document root.&lt;br /&gt;&lt;br /&gt;Of course, this confuses the debugger plugin, because, again, the debugger is assuming that the Eclipse project-root corresponds directly to the web server's root directory, which it's not.  This is the situation:  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_qt9sjR3SvlA/R0DjIMVXyKI/AAAAAAAABH0/74H6JzBM2sc/s1600-h/broken_debugger_diagram.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_qt9sjR3SvlA/R0DjIMVXyKI/AAAAAAAABH0/74H6JzBM2sc/s400/broken_debugger_diagram.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5134353305091688610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The arrow titled "Assumed" is what the debugger is wrongly assuming.  To fix the problem, you have to configure your web server to match that assumption.&lt;br /&gt;&lt;br /&gt;So, I modified the virtual host's DocumentRoot to point to the Askeet project's root folder, even though there is no index.html or index.php to be served from there. I had to also modify the "/sf" alias to handle "/web/sf".  (If you're using Symfony, you should know what I'm talking about.) So, now instead of going to http://localhost, I have to go to http://localhost/web/.  But since this is strictly for development purposes, it's not a big deal. Oh, and I had to make a slight modification to the debugging profile in Eclipse to match the new /web/index.php URL.  Again, not a big deal.&lt;br /&gt;&lt;br /&gt;I hope this update cleared any confusion...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-2120743801651159558?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/2120743801651159558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=2120743801651159558' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/2120743801651159558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/2120743801651159558'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/10/getting-breakpoints-to-work-in-eclipse.html' title='Getting Breakpoints to work in Eclipse PDT using Zend Debugger'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_qt9sjR3SvlA/RyTdB8dLiaI/AAAAAAAABDo/JM1sjo20M1g/s72-c/bad_pdt_debug_config.png' height='72' width='72'/><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-8287090290748183654</id><published>2007-09-27T12:21:00.000-04:00</published><updated>2007-09-27T13:14:08.053-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>TortoiseSVN's "Noisy" TSVNCache.exe</title><content type='html'>A co-worker of mine pointed me to a post by Travis Illig on &lt;a href="http://paraesthesia.com"&gt;his blog&lt;/a&gt; titled &lt;a href="http://paraesthesia.com/archive/2007/09/26/optimize-tortoise-svn-cache-tsvncache.exe-disk-io.aspx"&gt;"Optimize Tortoise SVN Cache (TSVNCache.exe) Disk I/O"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A short synopsis:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0); margin: 15px; padding: 25px;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qt9sjR3SvlA/RvvdWkEnbbI/AAAAAAAAAk0/UOPl9TyJPPs/s1600-h/overlay.png"&gt;&lt;img style="float:left; padding: 0 10px; cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_qt9sjR3SvlA/RvvdWkEnbbI/AAAAAAAAAk0/UOPl9TyJPPs/s400/overlay.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5114925181519228338" /&gt;&lt;/a&gt;&lt;br /&gt;TortoiseSVN has a shell-overlay that indicates the status of your files and folders within an SVN 'working folder'.  &lt;br /&gt;&lt;br /&gt;The background process that 'watches' your file system for SVN-related files and folders is TSVNCache.exe.  &lt;br /&gt;&lt;br /&gt;TSVNCache.exe, according to Travis, was bogging his system down with disk I/O.&lt;br /&gt;&lt;br /&gt;Instead of disabling TSVNCache.exe entirely (and thereby disabling the icon-overlays) he found a way to limit what TSVNCache.exe 'watches' on the file system.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;When I first read his post, I thought "How bad can TSVNCache.exe be?"  So, as noted in the comments of Travis' post, I grabbed &lt;a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Filemon.mspx"&gt;FileMon&lt;/a&gt; from SysInternals, and fired it up. After setting a filter so it would only display TSVNCache.exe-related events, I was amazed at just how much 'noise' it was causing  -- and I wasn't doing anything at all!  Just sitting there watching FileMon do it's thing.&lt;br /&gt;&lt;br /&gt;What really caught my eye was when I sent my coworker an instant message, thanking him for the link.  My IM client wrote the message to it's log file, and I saw TSVNCache note the change, and check the log file's location for the existence of a ".svn" folder.  (The existence of such a folder would indicate that the folder is an SVN working folder.)&lt;br /&gt;&lt;br /&gt;I was surprised to say the least, and wanted to see how bad it really got.  I 'putzed ' around doing a whole lot of nothing other than navigating around my file system. I seemed ridiculous at just how much disk I/O TSVNCache.exe was inducing.  &lt;br /&gt;&lt;br /&gt;For example, look at the following screen shot.  It's the TSVNCache activity imposed when I copied a folder on my desktop, which contains &lt;b&gt;one file&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qt9sjR3SvlA/RvvgGEEnbcI/AAAAAAAAAk8/rfN4c4YrDxI/s1600-h/filemon.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_qt9sjR3SvlA/RvvgGEEnbcI/AAAAAAAAAk8/rfN4c4YrDxI/s400/filemon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5114928196586270146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thankfully, by limiting which folders TSVNCache.exe 'watches' you can greatly limit this superfluous disk I/O.  In case you still haven't taken a moment to click-through and read Travis' post, here's the quick run-down:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Open your TortoiseSVN settings (Right-click the desktop, TortoiseSVN -&gt; Settings)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Go to the "Icon Overlays" item in the treeview.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add "C:\*" to the "Exclude Paths" box&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Add the folders you do want included in the "Include Paths" box&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I entered my 'work' folder: "C:\Work\*", for example.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Save changes : Apply/Ok&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restart TSVNCache.exe - kill TSVNCache.exe in your Task Manager.  It will automatically restart when you open a Windows Explorer.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_qt9sjR3SvlA/RvvimkEnbdI/AAAAAAAAAlE/tS4qxwkfDOg/s1600-h/tsvnsettings.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_qt9sjR3SvlA/RvvimkEnbdI/AAAAAAAAAlE/tS4qxwkfDOg/s400/tsvnsettings.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5114930953955274194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With these changes in place, within FileMon, you'll notice that TSVNCache is a &lt;i&gt;lot&lt;/i&gt; less noisy.  It will still receive "Change Notify" messages, but you won't see it access files/folders outside of your specified "Include" list.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Thanks for the great tip, Travis!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-8287090290748183654?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/8287090290748183654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=8287090290748183654' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8287090290748183654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8287090290748183654'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/09/tortoisesvns-noisy-tsvncacheexe.html' title='TortoiseSVN&apos;s &quot;Noisy&quot; TSVNCache.exe'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_qt9sjR3SvlA/RvvdWkEnbbI/AAAAAAAAAk0/UOPl9TyJPPs/s72-c/overlay.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-3000116816765091882</id><published>2007-09-18T11:16:00.000-04:00</published><updated>2007-09-27T15:22:11.620-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Diff  / Merge Tools</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qt9sjR3SvlA/Ru_0Nzt_rbI/AAAAAAAAAj8/FUtXqVAL2ek/s1600-h/tortoisemerge.png"&gt;&lt;img style="float:right;" src="http://4.bp.blogspot.com/_qt9sjR3SvlA/Ru_0Nzt_rbI/AAAAAAAAAj8/FUtXqVAL2ek/s400/tortoisemerge.png" alt="" id="BLOGGER_PHOTO_ID_5111572620147404210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've been using &lt;a href="http://tortoisesvn.tigris.org/TortoiseMerge.html"&gt;TortoiseMerge&lt;/a&gt; (part of &lt;a href="http://tortoisesvn.net/"&gt;TortoiseSVN&lt;/a&gt;) for a while now to view my source's diff's as well as handling merge conflicts.  Something about it though has always felt 'clunky' to me.  It may just be it's default color scheme that causes my mental detraction, but when I saw &lt;a href="http://www.larkware.com/"&gt;Larkware&lt;/a&gt; plug something call &lt;a href="http://www.larkware.com/dg9/TheDailyGrind1228.aspx"&gt;DiffMerge 3.1 beta&lt;/a&gt; I figured I should give it a try.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_qt9sjR3SvlA/Ru_1Bzt_rdI/AAAAAAAAAkM/aS-OJFwgBk4/s1600-h/diffmerge.png"&gt;&lt;img style="float: left;" src="http://4.bp.blogspot.com/_qt9sjR3SvlA/Ru_1Bzt_rdI/AAAAAAAAAkM/aS-OJFwgBk4/s400/diffmerge.png" alt="" id="BLOGGER_PHOTO_ID_5111573513500601810" border="0" /&gt;&lt;/a&gt;So far, I like it. It's UI is more sexy, as far as I'm concerned. It supports 3-way merging (like TortoiseMerge), making life so much easier when resolving merge conflicts. It supposedly supports folder diff/merging, although I haven't tried that yet.&lt;br /&gt;&lt;br /&gt;I just wish I hadn't also accidentally stumbled upon another free diff/merge tool called &lt;a href="http://kdiff3.sourceforge.net/"&gt;KDiff3&lt;/a&gt;. I like KDiff3's shell context menu for it's ability to 'remember' a file's location on the file system.  Once a file is 'remembered', you can perform a diff on any other file on the system by asking KDiff3 to compare the current file you have in front of you, and one of the 'remembered' files from earlier.   (I've found myself needing to do this lately and KDiff3 definitely speeds up the process.)&lt;br /&gt;&lt;br /&gt;One other thing I liked about KDiff3 was in it's installer: It provided an install option to integrate with TortoiseSVN as Tortoise's primary diff/merge tool.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_qt9sjR3SvlA/Ru_23Dt_reI/AAAAAAAAAkU/n-I_6qZPo5A/s1600-h/kdiff3.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_qt9sjR3SvlA/Ru_23Dt_reI/AAAAAAAAAkU/n-I_6qZPo5A/s400/kdiff3.png" alt="" id="BLOGGER_PHOTO_ID_5111575527840263650" border="0" /&gt;&lt;/a&gt;The only problem with KDiff3 was, it's color scheme made me throw up in my mouth so fast that I quickly decided I had to give DiffMerge another shot. (The screenshot shown here doesn't truly show off the vomit-in-mouth colors so much...) KDiff's ability to integrate easily with TortoiseSVN got me looking into how to set DiffMerge as my Tortoise diff/merge tool.&lt;br /&gt;&lt;br /&gt;Being perpetually low on free time, and not wanting to figure out the command line options myself, I enlisted Google to give me answers.  In my search for integrating DiffMerge as my TortoiseSVN diff/merge tool, I ran into &lt;a href="http://dotnet.org.za/trumpi/archive/2007/06/05/sourcegear-release-diffmerge-for-free.aspx"&gt;this post by 'Trumpi' detailing&lt;/a&gt; exactly how to integrate the two!  So, instead of outright stealing from Trumpi, I give you: &lt;a href="http://dotnet.org.za/trumpi/archive/2007/06/05/sourcegear-release-diffmerge-for-free.aspx"&gt;Trumpi's blog : SourceGear release DiffMerge&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;Ok, I'll steal a little, only because I tweaked my settings slightly for the diff-tool specification (caught the tweak in Trumpi's post comments). Here's the command lines for specifying DiffMerge as your diff and merge tools for TortoiseSVN:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Diff:&lt;br /&gt;&lt;ul style="font-family: courier new;"&gt;&lt;li&gt;New way: (see comments)&lt;br&gt;C:\Program Files\SourceGear\DiffMerge\DiffMerge.exe /ro2 /t1=%bname /t2=%yname %base %mine &lt;/li&gt;&lt;li&gt;Old way:&lt;br&gt;&lt;s&gt;C:\Program Files\SourceGear\DiffMerge\DiffMerge.exe /t1=Base /t2=Mine %base %mine&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Merge:&lt;br /&gt;&lt;ul style="font-family: courier new;"&gt;&lt;li&gt;New Way: (see comments)&lt;br&gt; C:\Program Files\SourceGear\DiffMerge\DiffMerge.exe /r=%merged /t1=%yname /t2=%bname /t3=%tname /c=%mname %mine %base %theirs&lt;/li&gt;&lt;li&gt;Old Way:&lt;br&gt;&lt;s&gt;C:\Program Files\SourceGear\DiffMerge\DiffMerge.exe /t1=Mine /t2=Base /t3=Theirs /r=%merged %mine %base %theirs&lt;/s&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt;&lt;br&gt;&lt;br /&gt;Note on the updated TortoiseSVN external tool commands: In the comments, Travis mentioned that I should RTFM.  Upon inspecting the &lt;a href="http://download.sourcegear.com/DiffMerge/3.1-beta/DiffMergeManual.pdf"&gt;DiffMerge manual&lt;/a&gt;, I came up with the updated command lines above.  I especially appreciate the "/ro2" option for the diff-tool.  This makes DiffMerge act strictly like a diff-tool (ie: no editing allowed.)&lt;br /&gt;&lt;br /&gt;Also, I gave Jimmy's &lt;a href="http://winmerge.org/"&gt;WinMerge &lt;/a&gt;a try.  It does fit my 'eye-candy' requirement, but I just can't devote more time to it because of it's lack of 3-way merging.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-3000116816765091882?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/3000116816765091882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=3000116816765091882' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/3000116816765091882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/3000116816765091882'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/09/diff-merge-tools.html' title='Diff  / Merge Tools'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qt9sjR3SvlA/Ru_0Nzt_rbI/AAAAAAAAAj8/FUtXqVAL2ek/s72-c/tortoisemerge.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-7153059826381645268</id><published>2007-09-05T10:54:00.000-04:00</published><updated>2007-09-20T14:28:08.968-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='misc'/><title type='text'>Google Earth update</title><content type='html'>Hey, did anyone else notice the cool additions they made in Google Earth?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://earth.google.com/sky/skyedu.html"&gt;Check Out The Details Here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of special note, you can now flip-around and view the sky from your current location on Google Earth!  This is really cool.  There is also a &lt;a href="http://earth.google.com/intl/en/userguide/v4/flightsim/index.html"&gt;built-in flight simulator&lt;/a&gt;.  It's pretty easy to crash in the flight sim, so, I didn't really play much with it, just the 'view sky' mode.&lt;br /&gt;&lt;br /&gt;Anyway...  Quick post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7153059826381645268?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7153059826381645268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7153059826381645268' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7153059826381645268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7153059826381645268'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/09/google-earth-update.html' title='Google Earth update'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-1257315098205532393</id><published>2007-08-27T16:48:00.000-04:00</published><updated>2007-08-27T16:50:02.873-04:00</updated><title type='text'>Cool SIGGRAPH 'Content Aware' Image Resizing Demonstration</title><content type='html'>This is pretty stinkin' cool:&lt;br /&gt;&lt;br /&gt;&lt;div class="video"&gt;&lt;br /&gt;   &lt;object width="500" height="393"&gt;&lt;param name="movie" value="http://www.youtube.com/watch?v=qadw0BRKeMk"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/qadw0BRKeMk" type="application/x-shockwave-flash" width="500" height="393"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;                      &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-1257315098205532393?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/1257315098205532393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=1257315098205532393' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/1257315098205532393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/1257315098205532393'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/08/cool-siggraph-content-aware-image.html' title='Cool SIGGRAPH &apos;Content Aware&apos; Image Resizing Demonstration'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-2238043939506869460</id><published>2007-07-26T22:23:00.000-04:00</published><updated>2007-07-26T22:23:28.395-04:00</updated><title type='text'>I Have Adam's Book!</title><content type='html'>Just wanted to say that I got Adam Nathan's COM Interp book, and I'm already taking notes as to what I need to blog about. :)  It's already answering questions that I've had, and while I thought what I was recently reading was going to give insight into the problems I had previously, it just skirted the issue and said "More in Chapter 7, 20, and 24".&lt;br /&gt;&lt;br /&gt;This book is &lt;em&gt;huge&lt;/em&gt;.  We're talking bigger-than-the-Bible huge.  So big, they wouldn't bind it with just one binding.  No, they bound it as two seperate tomes.  Tomes of arcane COM knowledge.  ;) &lt;br /&gt;&lt;br /&gt;Although I'm only into chapter 4, I can tell this book has what I need.  Heh, well, I've also heard that if this book doesn't have the answers to your COM-interop questions, then no other book will, soooo. :)  It hasn't been updated for .NET 2.0/3.0/3.5.  I'm curious to know if any of the version-specific remarks Adam makes regarding the implementation of the SDK at the time of his writing have changed.  I would guess the answer is "not much" because who would miss the chance to write a second edition!? :D&lt;br /&gt;&lt;br /&gt;Anyway, before I go, does anyone else think it's kinda weird the way I just happened to have "N" post-it notes for Adam *N*athan's book? &lt;A HREF='http://4.bp.blogspot.com/_qt9sjR3SvlA/RqlXH9PBIwI/AAAAAAAAAiQ/20gGVLk70co/s1600-h/100_6399.JPG'&gt;&lt;IMG SRC='http://4.bp.blogspot.com/_qt9sjR3SvlA/RqlXH9PBIwI/AAAAAAAAAiQ/20gGVLk70co/s320/100_6399.JPG' border=0 alt='' id='BLOGGER_PHOTO_ID_' style='clear:both;float:right; margin:0 0 10px 10px;'&gt;&lt;/A&gt;&amp;nbsp;&lt;div style='clear:both; text-align:RIGHT'&gt;&lt;a href='http://picasa.google.com/blogger/' target='ext'&gt;&lt;img src='http://photos1.blogger.com/pbp.gif' alt='Posted by Picasa' style='border: 0px none ; padding: 0px; background: transparent none repeat scroll 0% 50%; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial;' align='middle' border='0' /&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/9236822-2238043939506869460?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/2238043939506869460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=2238043939506869460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/2238043939506869460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/2238043939506869460'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/07/i-have-adams-book.html' title='I Have Adam&apos;s Book!'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_qt9sjR3SvlA/RqlXH9PBIwI/AAAAAAAAAiQ/20gGVLk70co/s72-c/100_6399.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-8103340059533523261</id><published>2007-07-18T16:35:00.000-04:00</published><updated>2007-09-13T13:28:24.499-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtual machines'/><category scheme='http://www.blogger.com/atom/ns#' term='gentoo'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='vmware'/><title type='text'>VMWare : Loosing eth0 after you've copied your VM</title><content type='html'>&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 4px; vertical-align: middle; background-color: #FFF7C0;"&gt;Background&lt;/div&gt;&lt;br /&gt;Here's a bit of weird-behavior I've noticed when working with some of our production virtual machines (running &lt;a href="http://www.gentoo.org/"&gt;Gentoo&lt;/a&gt; Linux) here at work.&lt;br /&gt;&lt;br /&gt;In order to update the OS's on our virtual machines, I will copy them to my local machine, power them on, update them, and then push the updated OS's back out into production at the earliest convenience.&lt;br /&gt;&lt;br /&gt;When you copy the VM from one location to another, VMWare notices this and asks you "Hey, it looks like this machine has been physically moved or copied, do you want me to create a new VM-UUID?" If you answer in the affirmative, VMWare internally regenerates any unique-identifiers tied to this virtual machine.  The one thing that's really noticeable is that any virtual ethernet adapters get their MAC addresses changed.&lt;br /&gt;&lt;br /&gt;The problem I've experienced is that when you power on the new-UUID'd VM, you no longer have an ethernet adapter.  Gentoo tries to bring-up eth0 and it says "network interface eth0 does not exist" and "Please verify hardware or kernel module (driver)" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 4px; vertical-align: middle; background-color: #FFF7C0;"&gt;Explanation&lt;/div&gt;&lt;br /&gt;&lt;i&gt;"So, what's going on?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Try a couple things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you run &lt;code&gt;lspci&lt;/code&gt; you should still see the ethernet adapter.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you run '&lt;code&gt;dmesg&lt;/code&gt;' and should see the kernel find the network card and it even calls it &lt;code&gt;eth0&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"So, where does &lt;code&gt;eth0&lt;/code&gt; go?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Try running &lt;code&gt;ifconfig -a&lt;/code&gt;.  I &lt;i&gt;bet&lt;/i&gt; you now have an &lt;code&gt;eth1&lt;/code&gt; and it's MAC address matches the newly-generated virtual MAC address specified in the virtual machine's &lt;code&gt;.vmx&lt;/code&gt; file. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Oh great, so every time I copy the VM I need to update the system configs to use the new eth1, or eth2, etc!?!?!"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;No, hush, I'm getting to the answer.&lt;br /&gt;&lt;br /&gt;The problem stems from the linux distro 'remembering' the MAC address of the network adapter and expecting it to be the same between boots.  In the case of our Gentoo VM's, it's &lt;code&gt;udev&lt;/code&gt; that mucks this up.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Ok, fine, it's udev's fault. We know it's broken because it's expecting the ethernet adapter to have a MAC address that it no longer has.  What to do?&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 4px; vertical-align: middle; background-color: #FFF7C0;"&gt;The Answer&lt;/div&gt;&lt;br /&gt;To fix this problem you need to tell your linux distro the VM's new MAC address. How you do this can vary by distro.  In my spelunking, I found a few ways:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In Gentoo do one of the following: (Do #1, it's the easiest.) &lt;br /&gt; &lt;ol&gt;&lt;li&gt;Delete &lt;code&gt;/etc/udev/rules.d/70-persistent-net.rules&lt;/code&gt; and reboot.  &lt;u&gt;Your eth0 should be back.&lt;/u&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;2007/09/13 Update&lt;/b&gt;: This almost-always works for me.  But, for some reason, sometimes it seems to confuse udev even more;  after rebooting, I'll have an eth2 or eth3.  When this happens, I end up following  #2, making sure the udev config file has 'eth0' listed, and not eth1, eth2, or eth3.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Edit &lt;code&gt;/etc/udev/rules.d/70-persistent-net.rules&lt;/code&gt; (or whatever it's named) to match your new MAC address and reboot. &lt;u&gt;Your &lt;code&gt;eth0&lt;/code&gt; should be back.&lt;/u&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Other distros:&lt;ul&gt;&lt;li&gt;Look for, (and edit if you find,) &lt;code&gt;/etc/iftab&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Look for, and delete, then reboot &lt;code&gt;/etc/udev/rules.d/25-iftab.rules&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Look for, (and edit if you find,) &lt;code&gt;/etc/sysconfig/network-scripts/ifcfg-eth0&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 4px; vertical-align: middle; background-color: #FFF7C0;"&gt;Give Credit Where Credit Is Due&lt;/div&gt;&lt;br /&gt;I got hints from a number of pages, but in the end, it was the folks over at the VMWare discussion forums for the win:&lt;br /&gt;&lt;a href="http://www.vmware.com/community/thread.jspa?threadID=46069&amp;amp;tstart=0" class="externallink" title="VMWare Discussion Forums" target="_blank"&gt;VMWare Discussion Forums&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-8103340059533523261?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/8103340059533523261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=8103340059533523261' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8103340059533523261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8103340059533523261'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/07/vmware-loosing-eth0-after-youve-copied.html' title='VMWare : Loosing eth0 after you&apos;ve copied your VM'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-8928040023124354549</id><published>2007-07-13T08:35:00.000-04:00</published><updated>2007-07-13T11:13:31.096-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='com'/><title type='text'>Marshalling Arrays To VB6's COM Funland pt2</title><content type='html'>Ok, &lt;a href="http://yoopergeek.blogspot.com/2007/07/marshalling-arrays-to-vb6s-com-funland.html"&gt;yesterday &lt;/a&gt; I figured out how to get an array of interfaces (actually, objects that implement an interface, but go along with my sloppy grammer, ok?) out of C#, through the COM Callable Wrapper (CCW) and into COM-land.  &lt;br /&gt;&lt;br /&gt;Wouldn't you know it, but I also need to be able to pass an array of objects back into C# from COM-land.  &lt;br /&gt;&lt;br /&gt;Well, I'm here to say that figuring this out was a lot easier than yesterday's problem.  At first I tried something like:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface ITest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;void TakeBusinessObjects(IBusinessObject[] bos);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, that doesn't work.  In VB6, when you try to compile something that calls &lt;span style="font-family: courier new,sans-serif;"&gt;TakeBusinessObjects(...)&lt;/span&gt; you get the a compile error like the following:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Function or interface marked as restricted, or the function uses an Automation type not supported in Visual Basic&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, my Google digging on that particular error actually proved fruitful and the answer is simple:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface ITest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;void TakeBusinessObjects(&lt;span style="font-weight:bold;"&gt;ref &lt;/span&gt;IBusinessObject[] bos);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;font size="-1"&gt;(credit goes to Jon Wojtowicz for his &lt;a href="http://www.eggheadcafe.com/articles/20051019.asp"&gt;Using COM Callable Wrappers to Extend Existing Visual Basic 6.0 Applications&lt;/a&gt; post at &lt;a href="http://www.eggheadcafe.com/"&gt;EggHeadCafe&lt;/a&gt;.&lt;/font&gt;)&lt;br /&gt;&lt;br /&gt;Hooray!  That works!  The array gets passed back into .NET-land, and things seem happy.  Except, I wouldn't be writing this post if I didn't have a problem, right? Well, &lt;span style="font-family: courier new,sans-serif;"&gt;TakeBusinessObjects(...)&lt;/span&gt; doesn't throw an exception, and it reaches it's &lt;span style="font-family: courier new,sans-serif;"&gt;return&lt;/span&gt; statement successfully. Unfortunately, something gets lost in translation while returning control to VB6-land because I intermediately upon returning, VB6 raises this error:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Class does not support Automation or does not support expected interface&lt;br /&gt;Number: 430&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This error makes it sound like I've developed on v2 of some COM component, but I've deployed the compiled EXE on a machine that only has v1 of the COM component.  What I don't understand is that the array gets passed through the CCW into .NET-land!  It works!  Something just goes wrong on the way back to VB-land.&lt;br /&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 36px; vertical-align: middle; background-color: #FFF7C0;"&gt;Update: The Answer! (Kind of)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I gotta hand it to my buddy &lt;a href="http://mrdotnet.wordpress.com/"&gt;Jimmy&lt;/a&gt; - that guy has given me the "Try XYZ" that has fixed whatever problem I was tackling so many times -- and he's come through once again!  He suggested that, I take a look at the &lt;span style="font-family: courier new,sans-serif;"&gt;[In]&lt;/span&gt; and &lt;span style="font-family: courier new,sans-serif;"&gt;[Out]&lt;/span&gt; attributes. &lt;br /&gt;&lt;br /&gt;By default, when I compile my COM component, it's being assumed that I not only want to be able to take in an array reference, but that I also want to push any changes made to that array reference back out to the caller. Well, lucky for me, I don't make any changes to the array once it's in .NET-land, and I can flag the parameter as only needing to come into the method, and not out.  Like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface ITest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;void TakeBusinessObjects(&lt;span style="font-weight:bold;"&gt;[In]&lt;/span&gt; ref IBusinessObject[] bos);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;So, while this fixes most of the situations where I would need to pass an array from COM-land into .NET-land, it still irks me that I don't know why VB6 throws that error if the CCW marshaller tries to move the array back out of .NET-land when the method returns.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-8928040023124354549?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/8928040023124354549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=8928040023124354549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8928040023124354549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8928040023124354549'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/07/marshalling-arrays-to-vb6s-com-funland_13.html' title='Marshalling Arrays To VB6&apos;s COM Funland pt2'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-8592253791295275531</id><published>2007-07-11T17:10:00.000-04:00</published><updated>2007-07-13T09:05:26.124-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vb6'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='com'/><title type='text'>Marshalling Arrays To VB6's COM Funland</title><content type='html'>Ok, so, please, don't ask why I've found myself writing a COM component in C#, and am using it in VB6. Just accept that fact that I need to.&lt;br /&gt;&lt;br /&gt;This COM component needs to return an array of data to VB6.  At first I thought "Why not just have my C# project reference the VB6 runtime via interop, and I'll be able to instantiate a VB6 Collection class, and return that to VB6, and it will be happy.&lt;br /&gt;&lt;br /&gt;But no, when I try to instantiate a VBA.CollectionClass I get:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Retrieving the COM class factory for component with CLSID {A4C4671C-499F-101B-BB78-00AA00383CBB} failed due to the following error: 80040154.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;After much googling, the closest answer I could get was that I was trying to instantiate a VBA.Collection on an x64 platform.  Um, the last time I checked my Pentium-D was a 32 bit processor.  I even went so far as to force my C# COM component to compile to x86 specifically instead of the &lt;span style="font-style:italic;"&gt;'Any CPU'&lt;/span&gt; configuration.  Still, the error persisted.  &lt;br /&gt;&lt;br /&gt;So, I had to bail on that idea, and come up with &lt;span style="font-style:italic;"&gt;"Hey, what about just returning an array?&lt;/span&gt;  What a great idea!  I performed a test.  &lt;br /&gt;&lt;br /&gt;I created a test COM visible interface and class, something like:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface ITest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;String[] GetStrings();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[ClassInterface(ClassInterfaceType.None)]  &lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public class Test : ITest {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public String[] GetStrings() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&lt;string&gt; foo = new List&lt;string&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo.Add("hello");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo.Add("bye-bye");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return foo.ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then, the corresponding test-code in VB6:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Dim testObject as Test&lt;br /&gt;Dim strings() as String&lt;br /&gt;&lt;br /&gt;set testObject = new Test&lt;br /&gt;strings = testObject.GetStrings()&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;It worked.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was happy, and I continued working on my C# code as planned.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Days later, I have hundreds of lines of code down in C#, and I'm at a good point to test what I've written.  Now, my objects weren't going to be returning string-arrays like the test case above, rather, they're going to be returning arrays of an interface defined in my C# COM component, something like:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface IBusinessObject {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Int32 GetSomething();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface IFoo {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IBusinessObject[] GetBusinessObjects();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[ClassInterface(ClassInterfaceType.None)]  &lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public class BusinessObject : IBusinessObject {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* you get the idea */&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;[ClassInterface(ClassInterfaceType.None)]  &lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public class Foo : IFoo {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public IBusinessObject[] GetBusinessObjects() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&lt;IBusinessObject&gt; bos = new List&lt;IBusinessObject&gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Add some BusinessObjects to 'bos' */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return bos.ToArray();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then, the corresponding VB6 code:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Dim foo as Foo&lt;br /&gt;Dim myObjects() as BusinessObject&lt;br /&gt;&lt;br /&gt;set foo = new Foo&lt;br /&gt;myObjects = foo.GetBusinessObjects()&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, it didn't work.  While no exception was thrown in C#, somewhere between &lt;span style="font-family: courier new,sans-serif;"&gt;return bos.ToArray()&lt;/span&gt; and VB6's assignment to the &lt;span style="font-family: courier new,sans-serif;"&gt;myObjects&lt;/span&gt; array a "&lt;span style="font-family: courier new,sans-serif;"&gt;Type Mismatch&lt;/span&gt;" error was thrown in VB6. I couldn't figure out why, though.&lt;br /&gt;&lt;br /&gt;I tried catching the array returned from &lt;span style="font-family: courier new,sans-serif;"&gt;.GetBusinessObjects()&lt;/span&gt; into a Variant like: &lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Dim myObjects as Variant&lt;br /&gt;myObjects = foo.GetBusinessObjects()&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I still received the "&lt;span style="font-family: courier new,sans-serif;"&gt;Type Mismatch&lt;/span&gt;" error.  I was really lost here, because in VB6-land a Variant is the closest thing you're going to get to a generic object pointer as you're going to get. &lt;br /&gt;&lt;br /&gt;I again didn't garner much assistance from another thorough Google spelunking.  In my searches, I did stumble across the &lt;span style="font-family: courier new,sans-serif;"&gt;MarshalAs&lt;/span&gt; attribute, but since I'm not a COM-master I wasn't entirely sure what I should be marshaling an array of interfaces as in order to safely reach COM-world.  I blindly tried a number of things, and always ended up with "&lt;span style="font-family: courier new,sans-serif;"&gt;Type Mismatch&lt;/span&gt;".  I was loosing hope. (As a side note I desperately need to get a copy of &lt;a href="http://blogs.msdn.com/Adam_Nathan"&gt;Adam Nathan&lt;/a&gt;'s book &lt;a href="http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X/ref=pd_ybh_11/104-9454856-8721520?pf_rd_m=ATVPDKIKX0DER&amp;pf_rd_s=center-2&amp;pf_rd_r=17N3B18VR3EKE2M9ZZGB&amp;pf_rd_t=1501&amp;pf_rd_p=280800601&amp;pf_rd_i=ybh"&gt;.NET and COM: The Complete Interoperability Guide&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Finally, I stumbled upon it, and I'm not entirely sure why I didn't try it first:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 36px; vertical-align: middle; background-color: #FFF7C0;"&gt;The Answer!&lt;/div&gt;&lt;br /&gt;[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]&lt;br /&gt;[ComVisible(true)]&lt;br /&gt;public interface IFoo {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;"&gt;[MarshalAs(UnmanagedType.AsAny)]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;IBusinessObject[] GetBusinessObjects();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;What's weird is that this produces a compiler warning making it sound like the attribute is not of any use:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;Type library exporter warning processing 'MyNamespace.IFoo.GetBusinessObjects(#0), MyProject'. Warning: Type contains [MarshalAs(AsAny)], which is only valid for PInvoke. &lt;span style="font-weight:bold;"&gt;The MarshalAs directive was ignored.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you place the attribute on the actual implementation you do not get the compiler warning...but you also get the &lt;span style="font-family: courier new,sans-serif;"&gt;Type Mismatch&lt;/span&gt; again.  So, it would seem the warning is ignorable as it is applying to something.&lt;br /&gt;&lt;br /&gt;Something tells me that once I get my hands on Adam Nathan's book, this will become a lot more obvious to me, and/or I'll find a better answer.  Either way, I've got a solution for now.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, why this post?  Mostly as a note-to-self as to how to solve the problem in the future, but there's the hope that some poor sap such as myself has had the exact same problem and that this will turn up for them while they spelunk Google.&lt;br /&gt;&lt;br /&gt;If this proves useful to anyone, please, drop me a line.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-8592253791295275531?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/8592253791295275531/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=8592253791295275531' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8592253791295275531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/8592253791295275531'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/07/marshalling-arrays-to-vb6s-com-funland.html' title='Marshalling Arrays To VB6&apos;s COM Funland'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-5784974724190496151</id><published>2007-06-28T08:27:00.000-04:00</published><updated>2007-09-13T15:11:34.077-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='sql2005'/><title type='text'>Weird SQL2005 TempDB Table and Primary Key Behavior</title><content type='html'>Ok, here's something I ran into the other day while working with some temp tables. I needed a temp table.  That table was probably going to be bloated, and could benefit from a primary key and some extra indexes on it since I'd be doing some heavy queries against the table. The SQL used in this post isn't the same SQL as from my app, rather, it's been simplified to the point of demonstrating my problem.&lt;br /&gt;&lt;br /&gt;Consider the create-table statement below:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 36px; vertical-align: middle; background-color: #FFF7C0;"&gt;Figure 1&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;CREATE TABLE #myTmp (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[id] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[id2] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[foo] [decimal](6,3) NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CONSTRAINT [PK_myTmp] PRIMARY KEY CLUSTERED ([id] ASC, [id2] ASC))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ok, so this gives us a very simple temp table that's scoped to the connection (or stored procedure) that it's create inside.  It also has a primary key.&lt;br /&gt;&lt;br /&gt;I'd been designing this temp table, and testing my SQL in a query window inside Management Studio.  I had run this SQL, and the query window and it's connection were still open when I copy-n-pasted the code into my application and took it for a test run.&lt;br /&gt;&lt;br /&gt;I got an error:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;"There is already an object named 'PK_TmpWorking' in the database."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Whaaaaaat?  It's as though the name of the primary key doesn't follow the same scoping rules as other objects created in TempDB! This seems really weird to me, and my google-spelunking didn't turn up many answers (am I loosing my touch?)  The only way around this was to not name the primary key constraint, like so:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 36px; vertical-align: middle; background-color: #FFF7C0;"&gt;Figure 2&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;CREATE TABLE #myTmp (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[id] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[id2] [int] NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;[foo] [decimal](6,3) NOT NULL,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRIMARY KEY CLUSTERED ([id] ASC, [id2] ASC))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;This leaves SQL Server to come up with a name for the primary key, and it appears that it names it some random jibber-jabber.&lt;br /&gt;&lt;br /&gt;So, while I can't really logic-out an answer as to why I'm seeing this behavior, I do at least have a work-around.  But get this, as if this primary-key thing isn't weird enough, it would seem this 'bug' only exists for primary keys, and &lt;b&gt;not&lt;/b&gt; other named indexes.  What I haven't shown you is that, in my query window, I also had a number of CREATE INDEX statements, similar to:&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(0,0,0)"&gt;&lt;br /&gt;&lt;div style="border-top: solid 2px #FED626; border-bottom: solid 2px #FED626; padding: 4px 4px 4px 36px; vertical-align: middle; background-color: #FFF7C0;"&gt;Figure 3&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: courier new,sans-serif;"&gt;&lt;br /&gt;CREATE NONCLUSTERED INDEX [IX_MyTmp_Foo] ON #myTmp ([foo] ASC)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I had this executed in my query window.  The temp table had it's randomly-named primary key, and it had this named index. When I ran the same code in my application, there was no complaints at all.  I would have expected to run into the same "There is already an object named 'IX_MyTmp_Foo' in the database." error, but I didn't get one!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Does any of this make sense?  Can anyone explain why it appears that primary keys on temp tables aren't scoped within the same scope as the temp table itself?  Especially since regular indexes appear to be scoped as you would assume.&lt;br /&gt;&lt;br /&gt;Signed:&lt;br /&gt;&lt;br /&gt;  Confused in Yooperland.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-5784974724190496151?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/5784974724190496151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=5784974724190496151' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/5784974724190496151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/5784974724190496151'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/06/weird-sql2005-tempdb-table-and-primary.html' title='Weird SQL2005 TempDB Table and Primary Key Behavior'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-2274119616067207126</id><published>2007-06-21T14:00:00.001-04:00</published><updated>2007-06-21T14:06:35.038-04:00</updated><title type='text'>Oh wowwwww...</title><content type='html'>Ok, in this day in age, it's difficult to make me so awe-struck that my jaw hits the floor. Well, I finally got around to checking out the Tech Preview of Microsoft Live Labs' Photosynth, and let me tell you, my jaw is still on the floor.  Totally awesome technology.&lt;br /&gt;&lt;br /&gt;I'm going to give you guys two links, one that will take you to a MS Live Labs blog post containing a video of a guy at TED (Technology, Entertainment, Design) Conference in Monterey, California explaining a couple of new MS-acquired technologies.  Photosynth is included.  Find that post &lt;a href="http://labs.live.com/Photosynth+At+TED+Conference.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Then, go and install and &lt;a href="http://labs.live.com/photosynth/"&gt;try Photosynth yourself&lt;/a&gt;.  You will need to install the browser plugin to use it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-2274119616067207126?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/2274119616067207126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=2274119616067207126' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/2274119616067207126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/2274119616067207126'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/06/oh-wowwwww.html' title='Oh wowwwww...'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-7031784663030223358</id><published>2007-02-16T13:16:00.000-05:00</published><updated>2007-02-16T13:31:37.527-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computer &quot;eye strain&quot; &quot;repetative stress&quot;'/><title type='text'>Eye Strain</title><content type='html'>Ok, nothing like posting only to link someone else, but here goes!  &lt;br /&gt;&lt;br /&gt;I found &lt;a href="http://www.ipnlighting.com/blog/2007/02/22-ways-to-reduce-eye-strain-at-your.asp"&gt;22 Ways to Reduce Eye Strain at Your Computer&lt;/a&gt; via &lt;a href="http://lifehacker.com"&gt;LifeHacker.&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;Now, I've stared at computer screens for a fairly large portion of my life, and only in the last couple years have I started developing eye-strain related ailments (head aches, and occassional blurred vision.)  &lt;br /&gt;&lt;br /&gt;Other things I found via the above links is &lt;a href="http://www.wikihow.com/Exercise-Your-Eyes"&gt;How To Exercise Your Eyes&lt;/a&gt;, and a program called &lt;a href="http://www.workrave.org/"&gt;WorkRave&lt;/a&gt;.  WorkRave may just replace my home-spun 'egg timer' application that bugs me at defined intervals to "'stand up, relax your eyes, etc...".&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-7031784663030223358?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/7031784663030223358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=7031784663030223358' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7031784663030223358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/7031784663030223358'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2007/02/eye-strain.html' title='Eye Strain'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-116672797495826224</id><published>2006-12-21T13:51:00.000-05:00</published><updated>2006-12-21T16:02:22.763-05:00</updated><title type='text'>Does Granholm Live In Michigan?</title><content type='html'>What's wrong with this picture?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/5887/664/1600/631476/Picture.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/5887/664/400/577272/Picture.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is a postcard a coworker received from our freshly re-elected governor.&lt;br /&gt;&lt;br /&gt;I like the attempt to include us yoopers. Unfortunately, well, I dunno.  I've lived here a while, and something just doesn't seem right.  Let's consult maps of Michigan at Google Images. (&lt;a href="http://images.google.com/images?q=michigan%20map" target="new"&gt;Go look&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;What really thrills my coworker is the shear number of hands this photo must have gone through before getting printed and *NOBODY* noticed it.  Show anyone here in the U.P. this picture and they catch what's wrong instantly.&lt;br /&gt;&lt;br /&gt;Now, I wasn't impressed with either candidate in this last election, but, well, who the heck is representing us?&lt;br /&gt;&lt;br /&gt;UPDATE: I got a better copy of the picture...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/x/blogger/5887/664/1600/199834/26927.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://photos1.blogger.com/x/blogger/5887/664/400/941103/26927.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/michigan" rel="tag"&gt;michigan&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/upper+peninsula" rel="tag"&gt;upper peninsula&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/granholm" rel="tag"&gt;granholm&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/christmas+card" rel="tag"&gt;christmas card&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/mitten" rel="tag"&gt;mitten&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/politics" rel="tag"&gt;politics&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/governor" rel="tag"&gt;governor&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-116672797495826224?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/116672797495826224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=116672797495826224' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/116672797495826224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/116672797495826224'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/12/does-granholm-live-in-michigan.html' title='Does Granholm Live In Michigan?'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-116379889549055106</id><published>2006-11-17T16:26:00.000-05:00</published><updated>2006-11-17T16:28:15.503-05:00</updated><title type='text'>VS2005 Pro FxCop Integration</title><content type='html'>This is mostly for my own "Hey, don't forget this link" purposes, but it's also for any of you whom, like me, aren't cool enough to have VS2005 Team Edition:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geekswithblogs.net/michelotti/archive/2006/01/31/67747.aspx"&gt;Integrating FxCop into VS2005 Professional Edition&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pretty nifty!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-116379889549055106?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/116379889549055106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=116379889549055106' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/116379889549055106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/116379889549055106'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/11/vs2005-pro-fxcop-integration.html' title='VS2005 Pro FxCop Integration'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-115920178464541433</id><published>2006-09-25T12:29:00.000-04:00</published><updated>2006-09-25T12:29:44.766-04:00</updated><title type='text'>T.E.D.D.Y.</title><content type='html'>James sent me a link to a video demonstration of something called "T.E.D.D.Y." -- a simple 3D modeling program. &lt;br /&gt;&lt;br /&gt;The link James sent me linked back to another blog that had found TEDDY, and that blog had a link to the original work, which can be found by clicking &lt;a href="http://www-ui.is.s.u-tokyo.ac.jp/~takeo/teddy/teddy.htm"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Check out the video of TEDDY in action:&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;embed style="width:400px; height:326px;" id="VideoPlayback" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?docId=5053834549541822378&amp;#038;hl=en"&gt; &lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-115920178464541433?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/115920178464541433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=115920178464541433' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115920178464541433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115920178464541433'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/09/teddy.html' title='T.E.D.D.Y.'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-115695616068420903</id><published>2006-08-30T12:42:00.000-04:00</published><updated>2006-08-30T12:42:40.760-04:00</updated><title type='text'>CheezLog</title><content type='html'>Hey, and old buddie of mine just started blogging.  He's going to be getting himself up to speed with C#, and the XNA framework.  &lt;br /&gt;&lt;br /&gt;Since I don't have time to play with XNA myself, I hope to be able to live vicariously through his experiences. :)&lt;br /&gt;&lt;br /&gt;Anyway, check out Cheez's blog:&lt;br /&gt;&lt;a href="http://abharrie.misterdotnet.com/"&gt;CheezLog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-115695616068420903?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/115695616068420903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=115695616068420903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115695616068420903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115695616068420903'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/08/cheezlog.html' title='CheezLog'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-115582451577629457</id><published>2006-08-17T10:08:00.000-04:00</published><updated>2006-08-17T10:35:06.610-04:00</updated><title type='text'>Classical Music Remixes</title><content type='html'>I'm in no way a music aficionado, and I have very specific likes and dislikes.  Sometimes I like certain songs by a certain band, but really dislike the majority of other music in the same genre.  It's weird.&lt;br /&gt;&lt;br /&gt;One type of music I like almost 100% across the board is classical.  I'm not a &lt;i&gt;huge&lt;/i&gt; fan of overly-chamber-ish classical, and I don't really go outta my way to listen to classical.  It's just decent background music.  (No vocals == good background noise as far as I'm concerned.)&lt;br /&gt;&lt;br /&gt;Now, remixed classical?  I &lt;b&gt;really&lt;/b&gt; like that.  Check out this YouTube video for an example:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style='text-align:center;display:block;'&gt;&lt;object width='425' height='350'&gt;&lt;param name='movie' value='http://www.youtube.com/v/5Zn5OplT4Po'&gt;&lt;/param&gt;&lt;embed src='http://www.youtube.com/v/5Zn5OplT4Po' type='application/x-shockwave-flash' width='425' height='350' allowscriptaccess='samedomain'&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;I'd really like to hear more remixes by this guy.  Does anybody have any leads?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;B&gt;UPDATE:&lt;/B&gt; I found this YouTube vid because of &lt;a href="http://www.digg.com/" target="new"&gt;digg.com&lt;/a&gt;, click &lt;a href="http://digg.com/videos_music/Coolest_version_of_Pachelbel_s_Canon_ever"&gt;here&lt;/a&gt; to digg-it.  In the comments, someone has a link to Jerry&lt;b&gt;&lt;u&gt;C&lt;/u&gt;&lt;/b&gt;'s website. (I thought it was Jerry&lt;b&gt;&lt;u&gt;L&lt;/u&gt;&lt;/b&gt;.).  Anyway:&lt;br&gt;&lt;br /&gt;&lt;a href="http://www.jerryc.tw/" target="new"&gt;JerryC&lt;/a&gt; (mostly-English)&lt;BR&gt;&lt;br /&gt;&lt;a href="http://www.jerryc.co.uk/" target="new"&gt;Collection of all his vides&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-115582451577629457?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/115582451577629457/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=115582451577629457' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115582451577629457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115582451577629457'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/08/classical-music-remixes.html' title='Classical Music Remixes'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-115332448644944744</id><published>2006-07-19T11:43:00.000-04:00</published><updated>2006-07-19T11:54:46.483-04:00</updated><title type='text'>Debugging Threads In VS2005? Woe To Thee!</title><content type='html'>Ok folks, this is mostly a post for my own personal use.  Basically, so the next time I run into the problem, I'll remember that I wrote this post. :)&lt;br /&gt;&lt;br /&gt;While the title is misleading -- debugging in VS2005, especially debugging when debugging multithreaded apps.  I've just ran into a problem though.&lt;br /&gt;&lt;br /&gt;See, I'd set a breakpoint inside some code that's executing on another thread.  When the breakpoint hits, VS2005 just sits there for about 10 seconds.  It's like it's dead.  Then, after it comes-to, if I try to step-through, or step-into any code after the breakpoint weird things happen.  Like, it doesn't step-forward into the code.  And while the IDE indicates the app is still in a 'paused' state, it certainly doesn't have any instruction pointer, nor does the "Threads" debugger panel indicate that your extra thread even exists anymore!  Hitting "F5" and letting it go about it's business doesn't help either -- the app is now in some sort of voodoo-ized state. &lt;br /&gt;&lt;br /&gt;The only solution is to stop the app and restart it. &lt;br /&gt;&lt;br /&gt;This still doesn't help the fact that I can't debug any code running on a non-main/UI thread!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What to do?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Off to the MSDN forums for me!&lt;br /&gt;&lt;br /&gt;Here's a post that helped me: &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=285644&amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=285644&amp;amp;SiteID=1&lt;/a&gt;&lt;br /&gt;That post links to &lt;span style="font-style: italic;"&gt;this&lt;/span&gt; post:&lt;br /&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=147707&amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=147707&amp;amp;SiteID=1&lt;/a&gt;&lt;br /&gt;And that post links to &lt;span style="font-style: italic;"&gt;this &lt;/span&gt;blog:&lt;br /&gt;&lt;a href="http://blogs.msdn.com/greggm/archive/2005/11/18/494648.aspx"&gt;http://blogs.msdn.com/greggm/archive/2005/11/18/494648.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically, what's happening is the debugger is trying to peek at all the local variables in order to 'help you' debug.  Unfortunately, access the GUI objects created on the main/UI thread from another thread is bad juju, and the debugger hangs when it hits a breakpoint while trying to probe values from objects owned by the UI thread. Why it screws everything else up, I don't know.&lt;br /&gt;&lt;br /&gt;BUT, I've come up with a solution not listed in the above links -- disable/close/don't-look-at the "Locals" debugging panel.  If that panel isn't visible, the debugger won't waste time poking-n-prodding all the objects found in the current scope, and you'll avoid the problem entirely. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-115332448644944744?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/115332448644944744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=115332448644944744' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115332448644944744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115332448644944744'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/07/debugging-threads-in-vs2005-woe-to.html' title='Debugging Threads In VS2005? Woe To Thee!'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-115142658954703444</id><published>2006-06-27T12:43:00.000-04:00</published><updated>2006-06-27T12:43:09.600-04:00</updated><title type='text'>SQL MythBusters – MSDE/SQL Express has a 5 concurrent user limit</title><content type='html'>Having worked with various versions of MS SQL Server for a number of years now, (6.5, 7.0, 2000, 2005,) and the verious MSDE and 'Express' editions of the product, I found this following link interesting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/euanga/archive/2006/03/09/545576.aspx"&gt;Euan Garden's BLOG : SQL MythBusters – MSDE/SQL Express has a 5 concurrent user limit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That '5 Concurrent User' limit has always been difficult to explain to our users...mostly because what we were explaining was never clearly explained to us... But anyway, I won't ramble on forever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-115142658954703444?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/115142658954703444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=115142658954703444' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115142658954703444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/115142658954703444'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/06/sql-mythbusters-msdesql-express-has-5.html' title='SQL MythBusters – MSDE/SQL Express has a 5 concurrent user limit'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-114425475256048246</id><published>2006-04-05T12:32:00.000-04:00</published><updated>2006-04-14T09:24:22.513-04:00</updated><title type='text'>Use Firefox? Hate the memory leak?</title><content type='html'>Found this, and figured it was worth sharing.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tech.cybernetnews.com/2006/03/26/this-may-help-your-firefox-memory-leak/"&gt;This May Help Your Firefox Memory Leak&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/firefox" rel="tag"&gt;firefox&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/memory+leak" rel="tag"&gt;memory leak&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/tweak" rel="tag"&gt;tweak&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-114425475256048246?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/114425475256048246/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=114425475256048246' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114425475256048246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114425475256048246'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/04/use-firefox-hate-memory-leak.html' title='Use Firefox? Hate the memory leak?'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-114410040651821147</id><published>2006-04-03T17:40:00.000-04:00</published><updated>2006-04-14T09:48:59.426-04:00</updated><title type='text'>System.Runtime.Serialization.SerializationInfo --  .KeyExists()?</title><content type='html'>&lt;FONT SIZE="+2"&gt;&lt;B&gt;The Problem:&lt;/B&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;There are a number of collection-like objects in the .NET Framework that allow you to 'key' the data you enter into them.  &lt;span style="font-family:courier new;"&gt;Dictionary&amp;lt;TKey,TValue&amp;gt;&lt;/span&gt; comes to mind almost immediately.  &lt;span style="font-family:courier new;"&gt;Dictionary&amp;lt;TKey,TValue&amp;gt;&lt;/span&gt; contains a &lt;span style="font-family:courier new;"&gt;Dictionary&amp;lt;TKey,TValue&amp;gt;.ContainsKey(T key)&lt;/span&gt; method that makes key-existance determination trivial.  &lt;br /&gt;&lt;br /&gt;But what about the &lt;span style="font-family:courier new;"&gt;SerializationInfo&lt;/span&gt; object?&lt;br /&gt;&lt;br /&gt;When an object implements &lt;span style="font-family:courier new;"&gt;ISerializable&lt;/span&gt; the &lt;span style="font-family:courier new;"&gt;ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)&lt;/span&gt; method adds the object's data to the serialization stream in a key/value style: &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family:courier new;"&gt;info.AddValue("MyObjectsValueKey", this._MyValue);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then, during deserialization, the constructor that meets the ISerializable implied-constructor signature:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-family:courier new;"&gt;MyObject(SerializationInfo info, StreamingContext context)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;is called, and the object is supposed to bootstrap itself from the data contained in the &lt;span style="font-family:courier new;"&gt;SerializationInfo&lt;/span&gt; instance.  &lt;br /&gt;&lt;br /&gt;How? By retrieving values based on the previously used string-keys, of course. &lt;br /&gt;&lt;br /&gt;So, why isn't there a &lt;span style="font-family:courier new;"&gt;SerializationInfo.KeyExists(string key)&lt;/span&gt; method?&lt;br /&gt;&lt;br /&gt;I hear some of you saying &lt;I&gt;"Well, it's the serialization of an object, you had better know what's was serialized in the first place!" &lt;/I&gt; True, very true.  But, consider a versioning issue that might arise:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT SIZE="+1"&gt;&lt;B&gt;Example (version 1):&lt;/B&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;Assume you have a business object that implements ISerializable.  For this example, let's call that business object MyObject. In your first version of MyObject, you have some code that looks like this (large portions of code left out to save space):&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;[Serializable]&lt;br /&gt;public sealed class MyObject : ISerializable {&lt;br /&gt;   private List&amp;lt;OtherObject&amp;gt; _OtherObjects;&lt;br /&gt;   private Int32 _CurrentOtherObjectIndex;&lt;br /&gt;&lt;br /&gt;   public OtherObject CurrentOtherObject {&lt;br /&gt;      get { return this._OtherObjects[_CurrentOtherObjectIndex]; }&lt;br /&gt;      set { this._CurrentOtherObjectIndex = this._OtherObjects.IndexOf(value); }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   private const string OTHEROBJECTS_KEY = "___otherobjetskey___";&lt;br /&gt;   private const string INDEX_KEY = "___indexkey___";&lt;br /&gt;   private MyObject(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      this._OtherObjects = (List&amp;lt;OtherObject&amp;gt;)info.GetValue(OTHEROBJECTS_KEY, typeof(List&amp;lt;OtherObject&amp;gt;));&lt;br /&gt;      this._CurrentOtherObjectIndex = info.GetInt32(INDEX_KEY);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void GetObjectData(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      info.AddValue(OTHEROBJECTS_KEY, this._OtherObjects);&lt;br /&gt;      info.AddValue(INDEX_KEY, this._CurrentOtherObjectIndex);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;As you can see, &lt;I&gt;MyObject&lt;/I&gt; has an internal &lt;span style="font-family:courier new;"&gt;List&amp;lt;T&amp;gt;&lt;/span&gt; of &lt;span style="font-family:courier new;"&gt;OtherObject&lt;/span&gt;'s.  It exposes a property that returns whatever the 'current' &lt;span style="font-family:courier new;"&gt;OtherObject&lt;/span&gt; is, based upon a private index into the &lt;span style="font-family:courier new;"&gt;_MyOtherObjects List&amp;lt;T&amp;gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The serialization code is fairly straight forward.&lt;br /&gt;&lt;br /&gt;Now, let's say, somewhere in the development of the version 2, we find a bug related to &lt;span style="font-family:courier new;"&gt;_CurrentOtherObjectIndex&lt;/span&gt; not being updated properly when instances &lt;span style="font-family:courier new;"&gt;OtherObject&lt;/span&gt; are being inserted into the &lt;span style="font-family:courier new;"&gt;_OtherObjects List&amp;lt;T&amp;gt;&lt;/span&gt; at various locations, thereby possibly invalidating the &lt;span style="font-family:courier new;"&gt;OtherObject&lt;/span&gt; pointed to by &lt;span style="font-family:courier new;"&gt;_CurrentOtherObjectIndex&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Instead of updating the various code locations that would need to update &lt;span style="font-family:courier new;"&gt;_CurrentOtherObjectIndex&lt;/span&gt; we decide it would be better to just replace &lt;span style="font-family:courier new;"&gt;_CurrentOtherObjectIndex&lt;/span&gt; with an &lt;span style="font-family:courier new;"&gt;OtherObject&lt;/span&gt; instance. ie: &lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;[Serializable]&lt;br /&gt;public sealed class MyObject : ISerializable {&lt;br /&gt;   private List&amp;lt;OtherObject&amp;gt; _OtherObjects;&lt;br /&gt;   private OtherObject _CurrentOtherObject;&lt;br /&gt;&lt;br /&gt;   public OtherObject CurrentOtherObject {&lt;br /&gt;      get { return this._CurrentOtherObject; }&lt;br /&gt;      set { this._CurrentOtherObject = value; }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;Ahhhh, but making this change would break the compatiblity between version 1 and version 2 of MyObject. Oh, but wait, we're handling the serialization ourselves, we should be able to code around it.  &lt;br /&gt;&lt;FONT SIZE="-2"&gt;[Let's ignore any possible versioning issues involved with strong-naming, let's just assume the version 2 code tries to deserialize a version 1 MyObject.]&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;So, ideally, we could change the ISerializable implementation to look like this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;   private const string OTHEROBJECTS_KEY = "___otherobjetskey___";&lt;br /&gt;   private const string INDEX_KEY = "___indexkey___";                             // we need the v1 key&lt;br /&gt;   private const string CURRENTOTHEROBJECT_KEY = "___currentotherobjectkey___";&lt;br /&gt;   private MyObject(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      this._OtherObjects = (List&amp;lt;OtherObject&amp;gt;)info.GetValue(OTHEROBJECTS_KEY, typeof(List&amp;lt;OtherObject&amp;gt;));&lt;br /&gt;&lt;br /&gt;      if (info.ContainsKey(INDEX_KEY)) {&lt;br /&gt;         // we're deserializing a version-1 MyObject.  Update it to version-2&lt;br /&gt;         Int32 tmpIndex = info.GetInt32(INDEX_KEY);&lt;br /&gt;         this._CurrentOtherObject = this._OtherObjects[tmpIndex];&lt;br /&gt;      } else {&lt;br /&gt;         // we're deserializing a version-2 MyObject. Just get the deserialize the CurrentOtherObject&lt;br /&gt;         this._CurrentOtherObject = (OtherObject)info.GetValue(CURRENTOTHEROBJECT_KEY, typeof(OtherObject));&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void GetObjectData(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      info.AddValue(OTHEROBJECTS_KEY, this._OtherObjects);&lt;br /&gt;      info.AddValue(CURRENTOTHEROBJECT_KEY, this._CurrentOtherObject);&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;Unfortunately, we can't do this because there is no &lt;span style="font-family:courier new;"&gt;SerializationInfo.ContainsKey(string key)&lt;/span&gt; method!  What we have to do is this:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;   private MyObject(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      this._OtherObjects = (List&amp;lt;OtherObject&amp;gt;)info.GetValue(OTHEROBJECTS_KEY, typeof(List&amp;lt;OtherObject&amp;gt;));&lt;br /&gt;&lt;br /&gt;      try {&lt;br /&gt;         this._CurrentOtherObject = (OtherObject)info.GetValue(CURRENTOTHEROBJECT_KEY, typeof(OtherObject));&lt;br /&gt;      } catch (SerializationException) {&lt;br /&gt;         // we're deserializing a version-1 MyObject.  Update it to version-2&lt;br /&gt;         Int32 tmpIndex = info.GetInt32(INDEX_KEY);&lt;br /&gt;         this._CurrentOtherObject = this._OtherObjects[tmpIndex];&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;We have to rely on an exception as part of our 'normal' code path.  This feels 'icky' to me.  ("Icky" being a highly technical term that means many things at different times.  In this case, 'icky' means &lt;I&gt;"goes against my 'best-practices' sense"&lt;/I&gt;. Exceptions should be exactly that: an unexpected error condition.  In the course of a normal deserialization, we have decided that being able to deserialize v1 MyObject instances into v2 MyObject instances is a completely normal operation. We should not have to rely on an Exception to perform normal work.  And if we have a situation where v2 MyObject code may be deserializing a large amount of v1 MyObjects, we can expect it to be much slower as well because the Exception handling system carries a heavy tax.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT SIZE="+2"&gt;&lt;B&gt;One Possible Solution&lt;/B&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;One solution is to have any object that implements &lt;span style="font-family:courier new;"&gt;ISerializable&lt;/span&gt; also serialize some for of version information.  Whether this version information is culled from the assembly versioning info, or is a private field of the class is completely up to your implementation.  In the following modification to &lt;span style="font-family:courier new;"&gt;MyObject&lt;/span&gt;, MyObject will store it's own versioning information.&lt;br /&gt;&lt;br /&gt;So, again from the top, version 1 of &lt;span style="font-family:courier new;"&gt;MyObject&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;[Serializable]&lt;br /&gt;public sealed class MyObject : ISerializable {&lt;br /&gt;   private static Int32 Version = 1;&lt;br /&gt;&lt;br /&gt;   private List&amp;lt;OtherObject&amp;gt; _OtherObjects;&lt;br /&gt;   private Int32 _CurrentOtherObjectIndex;&lt;br /&gt;&lt;br /&gt;   public OtherObject CurrentOtherObject {&lt;br /&gt;      get { return this._OtherObjects[_CurrentOtherObjectIndex]; }&lt;br /&gt;      set { this._CurrentOtherObjectIndex = this._OtherObjects.IndexOf(value); }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   private const string VERSION_KEY = "___version___";&lt;br /&gt;   private const string OTHEROBJECTS_KEY = "___otherobjetskey___";&lt;br /&gt;   private const string INDEX_KEY = "___indexkey___";&lt;br /&gt;   private MyObject(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      this._OtherObjects = (List&amp;lt;OtherObject&amp;gt;)info.GetValue(OTHEROBJECTS_KEY, typeof(List&amp;lt;OtherObject&amp;gt;));&lt;br /&gt;&lt;br /&gt;      // version 1 doesn't care about the VERSION_KEY value because it is the first version&lt;br /&gt;      this._CurrentOtherObjectIndex = info.GetInt32(INDEX_KEY);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void GetObjectData(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      info.AddValue(VERSION_KEY, MyObject.Version);&lt;br /&gt;      info.AddValue(OTHEROBJECTS_KEY, this._OtherObjects);&lt;br /&gt;      info.AddValue(INDEX_KEY, this._CurrentOtherObjectIndex);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;And the updated version 2 of &lt;span style="font-family:courier new;"&gt;MyObject&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;pre&gt;&lt;br /&gt;[Serializable]&lt;br /&gt;public sealed class MyObject : ISerializable {&lt;br /&gt;   private static Int32 Version = 2;&lt;br /&gt;&lt;br /&gt;   private List&amp;lt;OtherObject&amp;gt; _OtherObjects;&lt;br /&gt;   private OtherObject _CurrentOtherObject;&lt;br /&gt;&lt;br /&gt;   public OtherObject CurrentOtherObject {&lt;br /&gt;      get { return this._CurrentOtherObject; }&lt;br /&gt;      set { this._CurrentOtherObject = value; }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   private MyObject(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      Int32 streamVersion = info.GetInt32(VERSION_KEY);&lt;br /&gt;&lt;br /&gt;      this._OtherObjects = (List&amp;lt;OtherObject&amp;gt;info.GetValue(OTHEROBJECTS_KEY, typeof(List&amp;lt;OtherObject&amp;gt;&lt;br /&gt;&lt;br /&gt;      if (streamVersion == 2) {&lt;br /&gt;         this._CurrentOtherObject = (OtherObject)info.GetValue(CURRENTOTHEROBJECT_KEY, typeof(OtherObject));&lt;br /&gt;      } else {&lt;br /&gt;         Int32 tmpIndex = info.GetInt32(INDEX_KEY);&lt;br /&gt;         this._CurrentOtherObject = this._OtherObjects[tmpIndex];&lt;br /&gt;      }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void GetObjectData(SerializationInfo info, StreamingContext context) {&lt;br /&gt;      info.AddValue(VERSION_KEY, MyObject.Version);&lt;br /&gt;      info.AddValue(OTHEROBJECTS_KEY, this._OtherObjects);&lt;br /&gt;      info.AddValue(CURRENTOTHEROBJECT_KEY, this._CurrentOtherObject);&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;br /&gt;Tada.  Clean, deterministic deserialization of version 1 and 2 MyObject instances. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;FONT SIZE="+2"&gt;&lt;B&gt;Wrap-Up&lt;/B&gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;So, does anyone out there know why there isn't a&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SerializationInfo.ContainsKey(string key)&lt;/span&gt;&lt;br /&gt;method?  As with many things that I've learned about the .NET Framework, what at first seems obtuse to me usually has a very good explanation behind it. &lt;br /&gt;&lt;br /&gt;I gotta give thanks to &lt;A HREF="http://www.misterdotnet.com/blog/wp-rss2.phpi"&gt;Mr. DotNet&lt;/A&gt; who has helpd me through those mentally-obtuse times.  He really knows his stuff. I was hoping to be able to use his &lt;A HREF="http://www.misterdotnet.com/blog/?s=SyntaxHighlighter"&gt;SyntaxHighlighter&lt;/A&gt; (*nudge*-*nudge*) to make my code a bit more readable.  Maybe in a future update!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/iserializable" rel="tag"&gt;iserializable&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/serializable" rel="tag"&gt;serializable&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/versioning" rel="tag"&gt;versioning&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/visual+studio+2005" rel="tag"&gt;visual studio 2005&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/dotnet" rel="tag"&gt;dotnet&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-114410040651821147?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/114410040651821147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=114410040651821147' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114410040651821147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114410040651821147'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/04/systemruntimeserializationserializatio.html' title='System.Runtime.Serialization.SerializationInfo --  .KeyExists()?'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-114381766680792597</id><published>2006-03-31T10:07:00.000-05:00</published><updated>2006-04-14T09:56:41.836-04:00</updated><title type='text'>The Top 10 weirdest keyboards ever - Fosfor Gadgets</title><content type='html'>I know I've blogged about weird keyboards before, so why not again? :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gadgets.fosfor.se/the-top-10-weirdest-keyboards-ever/"&gt;The Top 10 weirdest keyboards ever - Fosfor Gadgets&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think #6 looks interesting, and I wouldn't mind trying it once, but for normal use? No thanks.&lt;br /&gt;&lt;br /&gt;A couple coworkers have bad wrist problems and have keyboard #8.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;What am I using right now?  A &lt;a href="http://www.microsoft.com/hardware/mouseandkeyboard/productdetails.aspx?pid=043"&gt;Microsoft Ergonomic 4000.&lt;/a&gt;&lt;br /&gt;It's relatively similar to the original Microsoft Natural, but the key layout is slightly modified -- more relaxed I guess. I like the sexy-black color and the soft foamy wrist wrest.  I'm not sure about all the extra buttons on the keyboard though.  At least they're kept to a relative minimum, and are out of the way, on this keyboard.  &lt;br /&gt;&lt;br /&gt;Anyway....&lt;br /&gt;&lt;br /&gt;&lt;span class="technoratitag"&gt;Technorati Tags: &lt;a href="http://www.technorati.com/tags/weird" rel="tag"&gt;weird&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/ergonomic" rel="tag"&gt;ergonomic&lt;/a&gt;, &lt;a href="http://www.technorati.com/tags/keyboards" rel="tag"&gt;keyboards&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-114381766680792597?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/114381766680792597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=114381766680792597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114381766680792597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114381766680792597'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/03/top-10-weirdest-keyboards-ever-fosfor.html' title='The Top 10 weirdest keyboards ever - Fosfor Gadgets'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-114366701719351986</id><published>2006-03-29T15:45:00.000-05:00</published><updated>2006-03-29T16:16:57.340-05:00</updated><title type='text'>Problem during ClickOnce deployment.</title><content type='html'>I just finished figuring out a problem I was having with a ClickOnce deployment for a project I've been working on.&lt;br /&gt;&lt;br /&gt;This project has a reference to ADODB.dll -- a Primary Interop Reference provided by Microsoft in the .NET Framework SDK.  Unfortunately, that PIA isn't provided in the .NET Framework redistributable.  Also, unfortunately, setting the adodb.dll to copy-local during the project-build process didn't help during ClickOnce deployment -- the ADODB.dll was specified as needing to be installed into the GAC before my app would install.&lt;br /&gt;&lt;br /&gt;I did some searching around, and stumbled upon this post as the MSDN ClickOnce forums:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=323832&amp;SiteID=1"&gt;http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=323832&amp;amp;SiteID=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can find my response there, but if you're averse to clicking, read-on.&lt;br /&gt;&lt;br /&gt;Basically, the problem boils down to the default ClickOnce publishing behavior for the ADODB PIA.  For whatever reason, it marks the ADODB PIA as a pre-requisite in the applications .manifest file.  This means that ClickOnce requires the ADODB PIA to be installed into the GAC before it will allow my app to be installed.  Unfortunately, none of the bootstrapper pre-reqs installed the PIA into the GAC, (making one of those pre-req bootstrapper installers is a possible solution, and I mention it in the reply, but it's not the easiest solution.)&lt;br /&gt;&lt;br /&gt;What fixes is the problem is modifying the 'Publish Status' of the ADODB.dll&lt;br /&gt;in the project's ClickOnce publishing settings.  You change ADODB.dll's publish-status from the default "Include (Auto)" to "Include".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Yes.  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt;Change it from one setting to another setting that appears to be the exact same&lt;/span&gt;&lt;span style="font-style: italic; font-weight: bold;"&gt; setting.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Re-publish.  The applications .manifest now specifies ADODB.dll to 'install' -- which will cause ClickOnce to copy it to the install folder, instead of requiring it be installed into the GAC.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's a couple screen shots for ya:&lt;br /&gt;&lt;br /&gt;Bring up your Project Properties Page, and go to the Publish tab.  Click the "Application Files..." button:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5887/664/1600/PublishSettings.0.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/5887/664/400/PublishSettings.0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In the dialog that pops up, set ADODB.dll's Publish Status to &lt;span style="font-weight: bold;"&gt;Include&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/5887/664/1600/ADODBSettings.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/5887/664/400/ADODBSettings.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-114366701719351986?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/114366701719351986/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=114366701719351986' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114366701719351986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/114366701719351986'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2006/03/problem-during-clickonce-deployment.html' title='Problem during ClickOnce deployment.'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112991437615569626</id><published>2005-10-21T13:06:00.000-04:00</published><updated>2005-10-21T13:06:16.183-04:00</updated><title type='text'>Flickr: luminea's photos tagged with strobelab</title><content type='html'>High-speed camera + (Rose + Liquid Nitrogen) == &lt;A href="http://www.flickr.com/photos/luminea/tags/strobelab/"&gt;Awesome.&lt;/A&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112991437615569626?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112991437615569626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112991437615569626' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112991437615569626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112991437615569626'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/10/flickr-lumineas-photos-tagged-with.html' title='Flickr: luminea&apos;s photos tagged with strobelab'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112610372753789554</id><published>2005-09-07T10:35:00.000-04:00</published><updated>2005-09-07T10:35:27.536-04:00</updated><title type='text'>Adam Nathan's Win32 to WinFX Blog : Windows Vista: It's the little things...</title><content type='html'>&lt;a href="https://blogs.msdn.com/adam_nathan/archive/2005/08/25/456308.aspx"&gt;Adam Nathan's Win32 to WinFX Blog : Windows Vista: It's the little things...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow.  I really like the second-to-the-bottom screen shot.  &lt;br /&gt;&lt;br /&gt;I don't know about you all, but I usually have so much crap in my Start menu that, even though I spend time organizing it, I have a heck of a time actually finding anything that I don't use on a daily basis.  (And things that I use on a daily basis are copied into a taskbar toolbar, anyway...)&lt;br /&gt;&lt;br /&gt;ANYWAY...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112610372753789554?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112610372753789554/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112610372753789554' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112610372753789554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112610372753789554'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/09/adam-nathans-win32-to-winfx-blog.html' title='Adam Nathan&apos;s Win32 to WinFX Blog : Windows Vista: It&apos;s the little things...'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112610310984982430</id><published>2005-09-07T10:25:00.000-04:00</published><updated>2005-09-08T15:46:21.600-04:00</updated><title type='text'>WinAmp 5.1 'Surround Edition'</title><content type='html'>I just grabbed the latest-n-greatest version of WinAmp because I heard a rumor that it has Podcast support somehow built into the Media Library.  &lt;br /&gt;&lt;br /&gt;I download it.&lt;br /&gt;&lt;br /&gt;I install it.&lt;br /&gt;&lt;br /&gt;I fire it up.&lt;br /&gt;&lt;br /&gt;It has the usual 'WinAmp WINAMP winamp...it really WHIPS the llamas ass' sample MP3 queued up, as well as a second MP3 that came with the download. &lt;br /&gt;&lt;br /&gt;I hit play.  It plays, it whips the llama, and prompty crashes. &lt;br /&gt;&lt;br /&gt;I fire WinAmp up a second time.  Try it again.  Yup.  That MP3 kills winamp.  How neat! I fire it up AGAIN and try playing the other MP3 -- as the song ends, it crashes WinAmp!  Any song ending crashes WinAmp.  How nice! :D&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE:&lt;/span&gt;&lt;br /&gt;I did a bit of searching, and discovered that I wasn't the only one with this problem!  &lt;br /&gt;&lt;br /&gt;Someone suggested disabling the new Predixis MusicMix (or whatever it's called) plugin.  I disabled it, and tada!  No crashing!&lt;br /&gt;&lt;br /&gt;Bad Predixis plugin...BAD!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112610310984982430?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112610310984982430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112610310984982430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112610310984982430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112610310984982430'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/09/winamp-51-surround-edition.html' title='WinAmp 5.1 &apos;Surround Edition&apos;'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112490416981436342</id><published>2005-08-24T13:22:00.000-04:00</published><updated>2005-08-24T13:22:49.853-04:00</updated><title type='text'>Turn Your Head</title><content type='html'>I have a distant interest in wood working. (ie: I really would like to get into it, but time spent on other hobbies, the money for tools and wood, life in general,  etc -- it all prevents me from really getting into it.)&lt;br /&gt;&lt;br /&gt;But anyway, the point of this post: &lt;br /&gt;  If I ever get a lathe, I &lt;i&gt;really&lt;/i&gt; want to make something like this:&lt;br /&gt;&lt;A HREF="http://www.turnyourhead.com/home.htm"&gt;Turn Your Head&lt;/A&gt;.  Really really cool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112490416981436342?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112490416981436342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112490416981436342' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112490416981436342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112490416981436342'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/08/turn-your-head.html' title='Turn Your Head'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112473839470298394</id><published>2005-08-22T15:19:00.000-04:00</published><updated>2005-08-22T15:19:54.720-04:00</updated><title type='text'>August 18th's PvPOnline</title><content type='html'>Anybody else ever have a conversation &lt;a href="http://www.pvponline.com/archive.php3?archive=20050818"&gt;like this?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've had a couple... You guess which side of the conversation I'm on. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112473839470298394?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112473839470298394/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112473839470298394' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112473839470298394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112473839470298394'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/08/august-18ths-pvponline.html' title='August 18th&apos;s PvPOnline'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112428782075601665</id><published>2005-08-17T10:10:00.000-04:00</published><updated>2005-08-17T10:10:20.773-04:00</updated><title type='text'>Amazon.com: Books: Earthcore</title><content type='html'>I've recently finished listening to a free podcast audio book called &lt;A HREF="http://www.scottsigler.net/earthcore/"&gt;Earthcore&lt;/A&gt;.  It was long, but I loved it.  The good news it that the author, Scott Sigler, got published!  Actually, this book was going to get published once, but then got cut shortly after 9/11.&lt;br /&gt;&lt;br /&gt;If you want to pre-order the book, grab it here:&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1896944329/qid=1123682295/sr=8-3/ref=pd_bbs_3/104-0901479-1539156"&gt;Amazon.com: Books: Earthcore&lt;/a&gt;&lt;br /&gt;I &lt;i&gt;highly&lt;/i&gt; recommend this book.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112428782075601665?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112428782075601665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112428782075601665' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112428782075601665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112428782075601665'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/08/amazoncom-books-earthcore.html' title='Amazon.com: Books: Earthcore'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112247295568419172</id><published>2005-07-27T10:02:00.000-04:00</published><updated>2005-07-27T10:02:35.690-04:00</updated><title type='text'>Optimus keyboard</title><content type='html'>&lt;a href="http://www.artlebedev.com/portfolio/optimus/"&gt;Optimus keyboard&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now this is a pretty cool keyboard!  Every key is a tiny LCD screen, and you can display whatever you want on each key.&lt;br /&gt;&lt;br /&gt;That's definitely geeky.  But I've got a couple problems.  I loves me my Microsoft Natural keyboard (the _ORIGINAL_, none of these new ones w/ screwed up arrow and insert/delete/pgup/pgdown key layouts, or with 30 extra shortcut buttons.)  Why don't any of these cool keyboards that I'd actually want ever come in ergo-configurations?  My only other problem with this keyboard would be that I know I wouldn't use the LCD keys for legit purposes.  I'd end up with naughty pictures all over my keyboard or some other useless configuration. :)&lt;br /&gt;&lt;br /&gt;Oh, I guess I implied that there are other 'cool' keyboards out there, eh?   Here's a few, just from &lt;a href="http://www.thinkgeek.com/"&gt;ThinkGeek&lt;/a&gt;:&lt;br /&gt;&lt;a href="http://www.thinkgeek.com/computing/input/7727/"&gt;Das Keyboard.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.thinkgeek.com/computing/input/785b/"&gt;Maltron Super Ergo KB.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.thinkgeek.com/computing/input/5c3f/"&gt;EluminX KB.&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.thinkgeek.com/computing/input/5a7f/"&gt;Rool-Up KB&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and my favorite that I would &lt;b&gt;LOVE&lt;/b&gt; to try for at least a month:&lt;br /&gt;The &lt;a href="http://www.fingerworks.com/ST_product.html"&gt;TouchStream LP Zero-Force&lt;/a&gt; no-physical-keys, gesture-enabled/compatible keyboard.  *drrooooool*&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112247295568419172?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112247295568419172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112247295568419172' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112247295568419172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112247295568419172'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/07/optimus-keyboard.html' title='Optimus keyboard'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-112006950973781103</id><published>2005-06-29T13:43:00.000-04:00</published><updated>2005-06-29T14:25:09.760-04:00</updated><title type='text'>I bent my Whidbey!</title><content type='html'>Ok, this is weird.  For friends / family who come here not knowing what "Whidbey" is, please, just move along.&lt;br /&gt;&lt;br /&gt;So, I've been using Whidbey for a while now and I've never experienced anything as weird as I experienced today. I'm posting this to re-hash my experience, and hopefully find someone else who's experienced this problem, and maybe, just &lt;u&gt;maybe&lt;/u&gt; have someone tell me &lt;u&gt;why&lt;/u&gt; it happened.&lt;br /&gt;&lt;br /&gt;First, some background on the project I'm working on. This project requires the implementation of two seperate but very similar and intertwined, applications. Because of the shared elements, I felt it best to create a Solution consisting of three projects -- two &lt;i&gt;main&lt;/i&gt; Windows Forms projects and a &lt;i&gt;common&lt;/i&gt; Class Library project. The &lt;i&gt;main&lt;/i&gt;s reference the &lt;i&gt;common&lt;/i&gt; project and use the helper methods, 'middle-tier' business objects, common tool form windows, project-property dialogs, etc, that the &lt;i&gt;common&lt;/i&gt; project serves-up.&lt;br /&gt;&lt;br /&gt;At some point I guess I did something wrong this morning because I opened a code view, and I could type characters and numbers, but I couldn't press enter, backspace, delete, or the arrow keys. It's almost as if any key that wasn't an [a-zA-Z0-9] key was just discarded by the IDE. I could highlight code and copy/cut/paste from the right-click context menu, but I couldn't use the ctrl-[cxp] shortcut keys to do the same thing. I also noticed that when I was typing, Intellisense wasn't poping up.&lt;br /&gt;&lt;br /&gt;Ok. . . Weird.&lt;br /&gt;&lt;br /&gt;I tried many things.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Closed all open files -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Checked everything into Source Safe, then back out -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Closed the solution, and closed VS2005, and opened it back up -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rebooted my PC -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Deleted the bin and obj directories from my 3 project directories and re-opened the solution -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Reset all VS keyboard shortcut customizations -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Rebuilt a 'clean' copy of the solution from Source Safe -- nope.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Opened VS2005, created a dummy project -- &lt;b&gt;NO PROBLEMS!&lt;/b&gt;.&lt;br /&gt;&lt;span style="font-size:-2;"&gt;("Ok, so it seems like it's something with my solution." I thought.)&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Opened a different, pre-existing, previously known-to-be-working project -- &lt;b&gt;NO PROBLEMS!&lt;/b&gt;.&lt;br /&gt;&lt;span style="font-size:-2;"&gt;("Yup...it's definately something with my solution.")&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;I'd almost run out of options (I really didn't want to try the uninstall/reinstall 'option',) when it became crystal-clear that it was something in my solution that was causing the problem...but what? There were no build errors, the application ran, and I can seemingly view all designers and code windows, I just couldn't edit code!&lt;br /&gt;&lt;br /&gt;So, how did I 'fix' it?  I'm not sure if I fixed it, or if it fixed itself, but here's what I did:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Fired up my 'broken' solution&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Confirmed that, yes, it was still broken.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;File-&gt;New-&gt;Project. Created another junk project/solution. (ie: I never closed Visual Studio.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Confirmed that, yes, in this junk project/solution, there were no problems with the code editor -- Intellisense was working, and so was enter/delete/backspace.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;File-&gt;Recent Projects-&gt;MyBroken.sln to re-open my 'broken' Solution.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;The Code Editor Worked.&lt;/b&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;- W - T - F -&lt;/u&gt;&lt;/b&gt;???&lt;br /&gt;&lt;br /&gt;What was I doing before it 'broke'?  Well, to tell you that, you need a little more background info.&lt;br /&gt;&lt;br /&gt;Remember that the main form in the &lt;i&gt;main&lt;/i&gt; projects use tool windows provided by the &lt;i&gt;common&lt;/i&gt; project. As such, I wanted a way to handle any exceptions that might happen in the tool windows in my &lt;i&gt;main&lt;/i&gt; projects. (ie: The &lt;i&gt;main&lt;/i&gt; projects have 'centralized' exception displaying/logging, and I want exceptions that happen in the tool windows &lt;span style=""&gt;(provided by &lt;i&gt;common&lt;/i&gt;,)&lt;/span&gt; to basically pass the exception to it's parent form for user-notification and logging.) To facilitate this, in the &lt;i&gt;common&lt;/i&gt; project,  I made a simple derived class that looked something like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public abstract class MySpecialForm : System.Windows.Forms.Form {&lt;br /&gt; protected virtual void ExceptionHandlerCORE(Exception ex, string logfile) {&lt;br /&gt;    ...&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public virtual void ExceptionHandler(Exception ex) {&lt;br /&gt;    ...&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Then, in the &lt;i&gt;main&lt;/i&gt; project, it's main form is derived from MySpecialForm. It overloads the ExceptionHandler method, calling base.ExceptionHandlerCORE(...), passing in a user-specific logfile.&lt;br /&gt;&lt;br /&gt;This solves my requirement of having the &lt;i&gt;common&lt;/i&gt; tool windows 'report' exceptions back to their owner form.  All these tool windows need to do is something like this:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;try {&lt;br /&gt;   // something that throws an error&lt;br /&gt;} catch (System.Exception ex) {&lt;br /&gt; MySpecialForm owner = (MySpecialForm)this.Owner;&lt;br /&gt; owner.ExceptionHandler(ex);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;At this point I hear some of you guys hollaring: "You're MySpecialForm, it can't be declared abstract if you ever expect to use it in the Visual Studio Designer!" You're exactly right!  It was with the discovery of this little fact that the IDE started acting weird, and the Code Editor decided to start acting up on me.&lt;br /&gt;&lt;br /&gt;I tried opening the &lt;i&gt;main&lt;/i&gt; project's main form, and instead of getting my form, I get a page telling me that MySpecialForm is declared abstract, and I can't work in the Designer because of that. Oookay. I closed the designer, went and modifed MySpecialForm so it wasn't abstract, rebuilt the Common project, tried re-opening the &lt;i&gt;main&lt;/i&gt; project's form in the designer, but nope. The same error. *sigh* Stupid thing isn't seeing my recompiled &lt;i&gt;common&lt;/i&gt;. I rebuilt the entire solution, which in the past has fixed problems where the &lt;i&gt;main&lt;/i&gt; projects couldn't 'see' the recompiled changes in their referenced &lt;i&gt;common&lt;/i&gt; assembly. I even tried removing and re-adding the reference to the compiled &lt;i&gt;common&lt;/i&gt; assembly -- the error persisted. It was some where around that time that the Code Editor started acting wonky -- I think I closed/restarted Visual Studio in an effort to try and get &lt;i&gt;main&lt;/i&gt; to refresh it's references, and then the weirdness in the code editor began.&lt;br /&gt;&lt;br /&gt;And with that...I'm out.  I've got to thank my friend &lt;a href="http://www.misterdotnet.com/blog/"&gt;Mr .NET&lt;/a&gt; for helping me try to figure this out. I've also got to chastize him for not knowing the answer!  heh.  &lt;br /&gt;&lt;br /&gt;With that, I leave the floor open.  Someone tell me they've seen this before!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-112006950973781103?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/112006950973781103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=112006950973781103' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112006950973781103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/112006950973781103'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/06/i-bent-my-whidbey.html' title='I bent my Whidbey!'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110805815071259667</id><published>2005-02-10T13:55:00.000-05:00</published><updated>2005-02-10T12:56:57.503-05:00</updated><title type='text'>Snap-Crackle-Pop (NOT) Rice Crispies!</title><content type='html'>Well, I finally broke down and went and saw a chiropractor.&lt;br /&gt;&lt;br /&gt;For over a week now, just sitting here working all day has caused the musles in the back of my neck to knot up tight/stiff, along with the occasional burning sensation.  It was driving me nuts.  It was giving me the worst headaches.  With the family sinus problems, I'm no stranger to sinus headaches, and these aren't sinus headaches.  Almost migraine like.  Quite literally a pain in the neck/head.&lt;br /&gt;&lt;br /&gt;Usually, when I have a bad headache of any sort, and the meds just aren't helping much, I &lt;i&gt;always&lt;/i&gt; get relief from a good nights sleep.  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Not anymore.  &lt;/b&gt;&lt;br /&gt;&lt;br /&gt;In fact, seemingly by the luck of the draw, I could wake up with a sore neck, and a fresh headache starting to soak itself in.  Heather suggested I either go to the doctor, or "Doctor Dave" (the local chiropractor that &lt;i&gt;everyone&lt;/i&gt; swears by.)   Well, Doctor Dave wouldn't take a new patient, so I went to this Doc. Peterson, Chiro-back-crack-ologist and Nutritionalist.  &lt;br /&gt;&lt;br /&gt;Well, he snap-crackle-popped me, and TADA!  I feel a bit better!  There's inflamation in the joints (that was there BEFORE the rice-crispy-action,) that will take some time, and ice, to settle down, but for now, I'm feeling a ton better! WOOO! &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110805815071259667?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110805815071259667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110805815071259667' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110805815071259667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110805815071259667'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/02/snap-crackle-pop-not-rice-crispies.html' title='Snap-Crackle-Pop (NOT) Rice Crispies!'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110685103472045439</id><published>2005-01-27T13:37:00.000-05:00</published><updated>2005-01-27T13:37:14.720-05:00</updated><title type='text'>Guiness Book of World Records</title><content type='html'>So, according to &lt;a href="http://www.mtulode.com/viewarticle.php?ArticleID=4018"&gt;this article&lt;/A&gt; in the campus news paper, MTU has set a record for for the world's biggest pendulum...104 years after making the actual pendulum.  &lt;br /&gt;&lt;br /&gt;Huh.  Weird. &lt;br /&gt;&lt;br /&gt;From the sounds of it, it's purpose was basically a depth-o-meter, if there is such a thing.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110685103472045439?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110685103472045439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110685103472045439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110685103472045439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110685103472045439'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/01/guiness-book-of-world-records.html' title='Guiness Book of World Records'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110658106629988684</id><published>2005-01-24T09:11:00.000-05:00</published><updated>2005-01-24T15:11:03.986-05:00</updated><title type='text'>Is It Monday Already?</title><content type='html'>*yaaaaaawwwn* &lt;br /&gt;&lt;br /&gt;Wow, it's Monday already, and I'm sitting here at work, sipping a cup of coffee, trying to get caught up on email, news, and get some coding done. BUT, before that, a quit entry.  This weekend seemed like it went non-stop!&lt;br /&gt;&lt;br /&gt;Saturday, I woke up all geared-up and ready to brew a batch of beer.  I had the idea of waking up 'early' (8/9am,) and getting the brewing done quickly, but as Heather will attest, I say that I'd like to wake up on many brew days.  That bed is just far too comfortable to wake up early. :)&lt;br /&gt;&lt;br /&gt;We finally all did wake up around 10-ish.  Breakfast was had.  Coffee was brewed, and drank.  I got garbed-up, and went wading through the snow banks in order to drag wood from the pile to the basement.  Fires flamed, the house was warmed. Noon rolled by, and I decided I needed to get moving if this beer was ever going to get brewed! I fired up the computer and started doing the final calculations for the recipe.&lt;br /&gt;&lt;br /&gt;See, I was originally going to brew a 5+/- gallon batch of brown ale. &lt;FONT SIZE="-2"&gt;Err, 'nut brown ale' you call it because I guess calling something a 'brown ale' just sounds like you're brewing a poop-brew.  &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/emots/shit.gif"&gt;&lt;/FONT&gt;) My recipe, as I brewed it, isn't available online (yet.)  You can find the original recipe I based my recipe upon &lt;A HREF="http://www.beersmith.com/Recipes/recipes/A_Toast.htm"&gt;here.&lt;/A&gt;  &lt;FONT SIZE="-2"&gt;(Basically, I just converted it to all-grain, and swapped a little of the Special-B Malt for Dark (135-165L) Crystal Malt.)&lt;/FONT&gt; &lt;br /&gt;&lt;br /&gt;ANYWAY, I _WAS_ going to brew a 5-ish gallon batch.  Well, I had a really good yeast culture going of &lt;A HREF="http://www.whitelabs.com/ratings.asp?id=WLP023"&gt;White Labs WLP023 - Burton Ale Yeast&lt;/A&gt; that I got from a friend (thanks, Randy!)  It's a surprisingly good yeast that I'd brewed with once before that has a really great 'English' character, and as that White Labs page will attest, is well-suited for an English-style brown ale.  The thing is, I also had 'rescued' a yeast culture that I put away over a year ago of &lt;A HREF="http://www.whitelabs.com/ratings.asp?id=WLP001"&gt;White Labs WLP001 - California Ale Yeast.&lt;/A&gt;  Just about any brewer who's worth his salt has used this yeast at least once.  It's _the_ 'American' yeast.  Clean, crisp, and unlike an English yeast, it's really quite 'clean' for an ale yeast -- very little fruity esters.  It accentuates &lt;FONT SIZE="-2"&gt;(big word for the day...had to look up how to spell it,)&lt;/FONT&gt; the hops and grains instead of masks them under the yeast characteristics.   &lt;B&gt;CRAP&lt;/B&gt; Can I actually get to the point?  I'll try.  &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/emots/blah.gif"&gt; So, this yeast that I was sure was dead, came back to life! The starter culture smelled and tasted clean, surprisingly no infection that I could detect, so I just &lt;i&gt;had&lt;/i&gt; to use it.  So, my point that I was trying to get at?  I decided to brew an 8+ gallon batch, and split the batch among the two yeasts, so I needed to scale the recipe up before actually getting started. &lt;br /&gt;&lt;br /&gt;While I was deftly tacking away at the keyboard, Heather was getting a grocery list made up.  A pretty big one too!  It was somewhere in the middle of this that I realized I didn't have Fuggles hops! I was &lt;i&gt;sure&lt;/i&gt; I had them.  I dug through the freezer upstairs, and the freezer downstairs.  No Fuggles hops. &lt;i&gt;CRAP&lt;/I&gt;.  &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/emots/wtf.gif"&gt;  &lt;br /&gt;&lt;br /&gt;&lt;I&gt;"Ok, this isn't a problem, Heather's going into town, I'll go with, pick up the hops I need, no problem!"&lt;/I&gt;  Except in the back of my head I knew I was already resigning the brew to another day.&lt;br /&gt;&lt;br /&gt;With a grocery list like the one Heather had in hand, this wasn't going to be a quick into-town-and-back-home joy ride.  Really, the list didn't have that many things on it, but it included at least four separate stops at different stores.  That's a pretty good days worth of shopping, and anyone who has/has-had a baby knows it's going to be an even-longer day.  And you know how it is when you get into the store: you're going to browse and if you're in a hurry, every obstacle will be in your way.  Friends you haven't seen in a while? "Hello!"  Long lines?  Yup.  By the time we got out of Wally-World I was &lt;u&gt;sure&lt;/u&gt; I wasn't brewing on Saturday.   &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/emots/yahoo_eyeroll.gif"&gt;&lt;br /&gt;&lt;br /&gt;I don't think we actually hit the road until about 1:30.  I think we got home some time around 6:30, 7:00.  Yeesh.  But hey!  I got a new pair of jeans out of it, and if you know how often I buy new clothes, that's a pretty big deal!  Instead of piddling away the rest of the evening, after dinner I got my grain mill, and scale, and went to work on measuring out my grains and crushing them so I wouldn't have to spend the extra time in the morning.  &lt;br /&gt;&lt;br /&gt;You know what's awesome?  Hooking your 14v cordless drill to your grain mill!  Holy crap!  I can grind grain in no time flat!  It's amazing!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Well, anyway, Sunday rolls around.  Noah and I wake up, and make breakfast for all three of us.  While breakfast is getting prepared, I put my mash water (about 5 gallons) on the stove to heat up.  By the time breakfast was done, the mash water is ready, and I mash-in.  I decided to try mashing in my 10 gallon GOTT cooler that I picked up at a garage sale this year.  This cooler is &lt;b&gt;AWESOME!&lt;/b&gt;  After an hour-long mash, I was surprised to see that the mash hadn't dropped a single degree!  Very cool.  &lt;br /&gt;&lt;br /&gt;Anyway, to wrap things up....the rest of the brew day was typical, the sparge went fine, the boil went fine, and I ended up with two carboys with about 4.5 gallons of wort in each.  I checked this morning on my way to work and both carboys are burpling away like a happy wort-becoming-beer should.&lt;br /&gt;&lt;br /&gt;Anyway...I need to get going.  I guess I could talk about putting together the treadmill, or the fun I had with Heather and Noah, but yeesh, this post is long enough!  I'll talk about that in another post. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110658106629988684?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110658106629988684/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110658106629988684' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110658106629988684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110658106629988684'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/01/is-it-monday-already.html' title='Is It Monday Already?'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110546842095168141</id><published>2005-01-11T13:33:00.000-05:00</published><updated>2005-01-11T13:33:40.950-05:00</updated><title type='text'>Do you have a dirty monitor?</title><content type='html'>Be sure to get your screen cleaned for free! &lt;a href="http://60gp.ovh.net/~cleanyou/"&gt;www.clean-your-screen-for-free-now.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110546842095168141?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110546842095168141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110546842095168141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110546842095168141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110546842095168141'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/01/do-you-have-dirty-monitor.html' title='Do you have a dirty monitor?'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110504177009254725</id><published>2005-01-06T15:02:00.000-05:00</published><updated>2005-01-06T15:02:50.093-05:00</updated><title type='text'>A Couple Weeks To Late</title><content type='html'>This is a couple weeks too late, but who cares?  It's a homebrewers Christmas Carole, supposidly by Dr. Clayton Cone:&lt;br /&gt;&lt;br /&gt;&lt;FONT SIZE="-1"&gt;&lt;br /&gt;'Twas the night before Christmas, and all through the house,&lt;br /&gt;Every creature was thirsty, including the mouse...&lt;br /&gt;The steins were empty, and the bottles were too.&lt;br /&gt;The beer had been drunk with no time to brew.&lt;br /&gt;&lt;br /&gt;My family was nestled all snug in their beds&lt;br /&gt;While visions of Christmas Ale foamed in their heads.&lt;br /&gt;Mama in her kerchief lamented the drought,&lt;br /&gt;She craved a pilsner and I, a stout.&lt;br /&gt;&lt;br /&gt;When out on the lawn, there arose such a clatter,&lt;br /&gt;I sprang from my chair to see what was the matter.&lt;br /&gt;Away to the kitchen, I flew like a flash,&lt;br /&gt;Opening the door with a loud bang and crash!&lt;br /&gt;&lt;br /&gt;I threw on the switch and the lights, all aglow,&lt;br /&gt;Gave a luster of mid-day to the brew-pot below.&lt;br /&gt;When, what to my wondering eyes should appear&lt;br /&gt;But Gambrinus himself, the patron of beer.&lt;br /&gt;&lt;br /&gt;With a look in his eye, so lively and quick,&lt;br /&gt;He said, "You want beer? Well, here, take your pick."&lt;br /&gt;More rapid than eagles, his recipes came&lt;br /&gt;As he whistled and shouted and called them by name.&lt;br /&gt;&lt;br /&gt;"Now, Pilsener! Now, Porter! Now, Stout and Now Maerzen!&lt;br /&gt;On, Bitter! On, Lager! On, Bock and On Weizen!"&lt;br /&gt;"To the top of the bottles, the short and the tall,&lt;br /&gt;Now brew away, brew away, and fill them all!"&lt;br /&gt;&lt;br /&gt;As dried hops before a wild hurricane fly,&lt;br /&gt;And then, without warning, settle down with a sigh,&lt;br /&gt;So towards the brew-pot, the ingredients flew,&lt;br /&gt;Malt extract, roasted barley and crystal malt, too.&lt;br /&gt;&lt;br /&gt;And then in a twinkling, I heard it quite plain,&lt;br /&gt;The cracking open of each barley grain.&lt;br /&gt;As I drew in my head and was turning around,&lt;br /&gt;Into the kitchen, he came with a bound.&lt;br /&gt;&lt;br /&gt;He was dressed like a knight, from his head to his toes,&lt;br /&gt;With an old family crest adorning his clothes.&lt;br /&gt;A bundle of hops, he had flung on his back,&lt;br /&gt;And the brewing began when he opened his pack.&lt;br /&gt;&lt;br /&gt;His hops were so fragrant! His barley, how sweet! &lt;br /&gt;The adjuncts included Munich malt and some wheat.&lt;br /&gt;The malted barley was mashed in the tun,&lt;br /&gt;Then boiled with hops in the brew-pot 'till done.&lt;br /&gt;&lt;br /&gt;Excitement had me gnashing my teeth,&lt;br /&gt;As the sweet smell encircled my head like a wreath.&lt;br /&gt;Beer yeast was pitched, both lager and ale,&lt;br /&gt;The wort quickly fermented, not once did it fail.&lt;br /&gt;&lt;br /&gt;It was then krausened, or with sugar primed,&lt;br /&gt;And just being bottled when midnight had chimed.&lt;br /&gt;A wink of his eye and a twist of his head,&lt;br /&gt;Soon gave me to know, I'd be shortly in bed.&lt;br /&gt;&lt;br /&gt;He spoke not a word but kept on with his work,&lt;br /&gt;And capped all the bottles, then turned with a jerk.&lt;br /&gt;And laying a finger alongside his nose,&lt;br /&gt;He belched (quite a burp!) before he arose.&lt;br /&gt;&lt;br /&gt;Clean-up was easy, with only a whistle,&lt;br /&gt;And away the mess flew, like the down on a thistle.&lt;br /&gt;And I heard him exclaim, 'ere he left me the beer,&lt;br /&gt;"Merry Christmas to all! and a HOPPY New Year!"&lt;br /&gt;&lt;br /&gt;Merry Christmas everyone!!&lt;br /&gt;And Happy New Year!!&lt;br /&gt;&lt;/FONT&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110504177009254725?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110504177009254725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110504177009254725' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110504177009254725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110504177009254725'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/01/couple-weeks-to-late.html' title='A Couple Weeks To Late'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110502224883281138</id><published>2005-01-06T09:37:00.000-05:00</published><updated>2005-01-06T09:37:28.833-05:00</updated><title type='text'>Yooper Lock De-Icer</title><content type='html'>I saw the strangest thing Tuesday morning on my way to work.  &lt;br /&gt;&lt;br /&gt;As I was getting to the top of Quincy Hill, almost to Peterson's Fish Market, I noticed the tell-tale light that is cast by dancing flames on the snow banks, and tree branches around the fish market.  &lt;br /&gt;&lt;br /&gt;At first, I thought the worst: "On no, Peterson's Fish Market is on fire!"  Well, as I drove by, it all became clear, and I &lt;i&gt;so&lt;/i&gt; wish I had a picture of what I saw.&lt;br /&gt;&lt;br /&gt;Picture this: A man standing in front of Peterson's Fish Market...with a big tank of propane sitting next to him.  In his hands?  Why, a long-handled torch that resembled one of those torches you would use to burn the weeds in the cracks in your pavement, or burn a field or ditch in early spring.  What's he doing with it?  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;He's flaming the doorknob to the building.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;It was the most 'yooper' thing I've seen up here in a long time.  I asked some of my coworkers who have been up here much longer than I have if they've ever seen or heard of anyone de-icing a lock in such a manner.  Not a one ever had.&lt;br /&gt;&lt;br /&gt;I wish I had gotten a picture. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110502224883281138?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110502224883281138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110502224883281138' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110502224883281138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110502224883281138'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2005/01/yooper-lock-de-icer.html' title='Yooper Lock De-Icer'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110375397651249597</id><published>2004-12-22T17:14:00.000-05:00</published><updated>2007-01-09T19:59:18.100-05:00</updated><title type='text'>I'm Employeed!</title><content type='html'>Just got the news this morning: the &lt;A HREF="http://www.roadsoft.org"&gt;RoadSoft&lt;/A&gt; contract for 2005 was approved by the 'ad board' -- the final hoop to jump through in getting our 2005 contract approved.  &lt;br /&gt;&lt;br /&gt;&lt;FONT SIZE=-1&gt;&lt;B&gt;Translation:&lt;/B&gt; I'm employeed for the year of 2005.&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;For those of you who don't know, my terms of employement are hard to explain, at best, but I'll try.  &lt;br /&gt;&lt;br /&gt;I work at/for &lt;A HREF="http://www.mtu.edu/"&gt;Michigan Technological University&lt;/A&gt;...kinda.  My paychecks say "Michigan Tech" on them, but my department has nothing to do with the faculty who teach students.  We're kind of like a research department. I work for the &lt;A HREF="http://www.tdg.mtu.edu/"&gt;Technology Development Group (TDG.)&lt;/A&gt;  The TDG is a branch of &lt;A HREF="http://www.michiganltap.org"&gt;Michigan's Local Technical Assisstance Program (LTAP.)&lt;/A&gt;  &lt;br /&gt;&lt;br /&gt;&lt;B&gt;What's LTAP again?&lt;/B&gt;&lt;br /&gt;Every state has an &lt;A HREF="http://www.ltap.org"&gt;LTAP&lt;/A&gt; center.  A quote from &lt;A HREF="http://www.ltapt2.org/about/program.htm"&gt;here&lt;/A&gt; puts it like this: &lt;FONT SIZE="-1"&gt;&lt;I&gt;"LTAP's mission is to foster a safe, efficient, environmentally sound transportation system by improving the skill and knowledge of local transportation providers through training, technical assistance and technology transfer."&lt;/I&gt;&lt;/FONT&gt;  See the previous link for more details.  Basically, we're a sort of clearing house of information and training for civil engineer types of people.  Our LTAP here at Tech is a little different than most LTAP centers in that we have this TDG thing.&lt;br /&gt;&lt;br /&gt;So, as you might guess, that makes us a part of the Civil Engineering department here at Tech. But we're a bit different. (Catching the pattern here?) We're like a research group in that we're what you call 'soft money'.  The University support us at all.  No general fund dollars come our way. If we don't bring in contracts, we go home.  We don't work.  As far as I've ever known, the contracts we deal with are yearly.  So, every year we basically sweat in our boots until we find out if our contracts will be renewed for another year.  If not, we sweat a lot more while we scramble to find new jobs.&lt;br /&gt;&lt;br /&gt;Buuut anyway... I need to get going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110375397651249597?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110375397651249597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110375397651249597' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110375397651249597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110375397651249597'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/12/im-employeed.html' title='I&apos;m Employeed!'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110312230450909954</id><published>2004-12-15T09:51:00.001-05:00</published><updated>2004-12-15T09:51:44.510-05:00</updated><title type='text'>RIP Beer Fridge</title><content type='html'>Well, I guess my beer fridge is dead.  &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/emots/msn_cry.gif"&gt;&lt;br /&gt;&lt;br /&gt;When we bought our house, it came with two refridgerators.  One nice new one, and an older one.  I was suprised at home much space it had.  I immediately claimed it as 'mine', for use only in my devious beer-brewing schemes.   I gutted the thing to the point where I could fit 5 corny-kegs in it, and still have room for about a case of bottles.  I could fit 6 kegs if I didn't want any bottles.  Did I mention it also had a nice freezer?  This was a nice fridge!  &lt;br /&gt;&lt;br /&gt;Well, since this summer, it's been running more and more often.  It's never had a problem keeping things cool, and the freezer's always kept things frozen solid.  But, it's gotten to the point where it's running all the time, and never turning off.  Which, I guess is fine, if you can stomach the extra $30 a month on the power bill.  So, for now, I've unplugged it, emptied it, and defrosted it.  It's a sad sad sight. &lt;br /&gt;&lt;br /&gt;Please, a moment of silence...&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Ok, that's enough.  In other news: I brought home the medium-sized dorm fridge that's been at the office for the last 5 years.  It's the new beer fridge. Sure, there's no room for kegs, but hey...we'll figure out a way to cope.  &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/emots/cheers.gif"&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110312230450909954?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110312230450909954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110312230450909954' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110312230450909954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110312230450909954'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/12/rip-beer-fridge_15.html' title='RIP Beer Fridge'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110210484419581717</id><published>2004-12-03T15:14:00.000-05:00</published><updated>2004-12-03T15:15:17.480-05:00</updated><title type='text'></title><content type='html'>&lt;a href="http://zoomquilt.machwerk.ws/zoom.htm"&gt;This is the coolest thing!&lt;/a&gt;  Below is a screenshot.  Just click-n-drag like the instructions state.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/img/196/2402/1024/Fullscreen%20capture%2012%203%202004%203%2012%2052%20PM.jpg"&gt;&lt;img style="border: 1px solid rgb(0, 0, 0); margin: 2px;" src="http://photos1.blogger.com/img/196/2402/320/Fullscreen%20capture%2012%203%202004%203%2012%2052%20PM.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://zoomquilt.machwerk.ws/zoom.htm"&gt;&lt;br /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110210484419581717?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110210484419581717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110210484419581717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110210484419581717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110210484419581717'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/12/this-is-coolest-thing-below-is.html' title=''/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110210111921397640</id><published>2004-12-03T14:11:00.000-05:00</published><updated>2004-12-03T14:11:59.213-05:00</updated><title type='text'>This is so cool. :)</title><content type='html'>Check this out, it's a picture from the Astronomy Picture Of the Day.  &lt;a href="http://antwrp.gsfc.nasa.gov/apod/ap041130.html"&gt;APOD: 2004 November 30 - Lake Effect Snow on Earth&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I just thought it was a pretty cool picture and wanted to share. &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110210111921397640?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110210111921397640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110210111921397640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110210111921397640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110210111921397640'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/12/this-is-so-cool.html' title='This is so cool. :)'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110175638109773660</id><published>2004-11-29T14:26:00.000-05:00</published><updated>2004-11-29T14:33:48.510-05:00</updated><title type='text'>Stout Floats</title><content type='html'>You know what's suprisingly good?  Stout-Floats.&lt;br /&gt;&lt;br /&gt;Take your favorite stout, and make a rootbeer float out of it. All you need to do is replace the root beer with stout. It's suprisingly good!&lt;br /&gt;&lt;br /&gt;At our last homebrewers club meeting, we made them using &lt;a href="http://www.bellsbeer.com/default.asp"&gt;Bell's&lt;/a&gt; &lt;a href="http://www.bellsbeer.com/branddetail.asp?BrandID=34"&gt;Cherry Stout&lt;/a&gt;.   By itself, Bell's Cherry Stout isn't my favorite.  Like '&lt;a href="http://www.ratebeer.com/View-User-1045.htm"&gt;Delbomber&lt;/a&gt;' said on &lt;a href="http://www.ratebeer.com/.htm"&gt;RateBeer.com&lt;/a&gt;, &lt;em&gt;"...this beer's strengths are it weaknesses. The combination of chocolate with sour cherry is original and unique, but the biting acidity makes it difficult to enjoy the bottle to its entirety."&lt;/em&gt;  But, add a bunch of vanilla icecream?  OH YUM! &lt;br /&gt;&lt;br /&gt;I definately need to try this with some different stouts, maybe even make a sort of stout-smoothie or something.  &lt;img src="http://www.trans.mtu.edu/%7Ejtpoll/emots/yahoo_drool.gif" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110175638109773660?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110175638109773660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110175638109773660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110175638109773660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110175638109773660'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/stout-floats.html' title='Stout Floats'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110130707867399802</id><published>2004-11-24T09:37:00.000-05:00</published><updated>2004-11-24T09:37:58.673-05:00</updated><title type='text'>How Depressing</title><content type='html'>I decided to pull some pictures off of a couple full Compact Flash cards, and put some of the pictures on the family blog before leaving for the long weekend.  &lt;br /&gt;&lt;br /&gt;Everything went fine with the first card.  The second one? Yeesh...it had some major 'issues'.  Chkdsk 'fixed' the problems, but that also ment that I lost a bunch of the photos on the card!   In all, it looks like I lost 30 pictures. &lt;IMG SRC="http://www.trans.mtu.edu/~jtpoll/noah/emots/frown.gif"&gt;  I'm not even sure what was lost!&lt;br /&gt;&lt;br /&gt;But anyway, keep an eye out on the family web site for some of the pictures I was able to recover.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110130707867399802?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110130707867399802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110130707867399802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110130707867399802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110130707867399802'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/how-depressing.html' title='How Depressing'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110116016834480057</id><published>2004-11-22T16:49:00.000-05:00</published><updated>2004-11-22T16:49:28.346-05:00</updated><title type='text'>Firefox</title><content type='html'>Ok, I installed and spent a little time trying out &lt;a href="http://www.getfirefox.com/"&gt;Firefox.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I saw everyone get excited when it hit 1.0, I've got friends saying it's 'the bestest ever'...figured I might as well try it.  &lt;br /&gt;&lt;br /&gt;It's great. I only wish it had a few things that I'm used to in Avant.  From what my friend says, they're probably available as an extension...&lt;br /&gt;&lt;br /&gt;A skinable, extensible, standards-compliant web browser.  Who'da thunkit?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110116016834480057?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110116016834480057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110116016834480057' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110116016834480057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110116016834480057'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/firefox.html' title='Firefox'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110113579568404051</id><published>2004-11-22T10:03:00.000-05:00</published><updated>2004-11-22T10:03:15.683-05:00</updated><title type='text'>Finally...it's bottled!</title><content type='html'>Earlier this year I brewed an India Pale Ale when my dad was up an visiting.  That was on September 25th.  I racked it to secondary, and dry-hopped with with about an ounce of Fuggles about 3 weeks later.  Just this past weekend I bottled it.  It's a little over-due for bottling, but bulk-aging in the basement certainly didn't hurt it. :)&lt;br /&gt;&lt;br /&gt;All I have to say about it right now is: WOW!  This is a lot better than I was expecting.  I wish I had my notes here, as I'd describe how it tasted when I was bottling it.  &lt;br /&gt;&lt;br /&gt;It's great when warm, flat beer tastes this good.  It usually means it's only going to taste better once it's carbonated and slightly chilled.  (Hmm, by "warm, flat beer", I mean un-finished, un-bottled beer, not beer that's been sitting out overnight...)&lt;br /&gt;&lt;br /&gt;Speaking of carbonation, if you saw my post over at &lt;a href="http://thepolls.blogspot.com/"&gt;ThePolls&lt;/a&gt;, you might have caught the part where I said I brough some of my Raspberry Wheat beer to Noah's friend's 1st birthday party.  I did something wrong with that beer.  Don't get me wrong, it tastes great, the taste isn't the problem.  The problem is, I must have misweighed the corn sugar when I was bottling because it's _COMPLETELY_ over carbonated.  It's not to the point of being a 'gusher', nor is it a batch of bottle-bombs, but you literally need a large pitcher just to pour a 12oz glass.  When you pop the cap, you have about 5 seconds before it starts pouring foam out of the bottle.  An impressive, if not messy, display.&lt;br /&gt;&lt;br /&gt;Oh!  This weekend I stopped by a friends how to drop off a Zymurgy magazine he'd let me borrow, and he sent me home with a bottle of his recently brewed pale ale, which uses his newly-acquired Burton Ale yeast.  It's supposed to be an interesting yeast.  I haven't had the chance to try the beer yet, unfortunately. I think I'll try to harvest a sample of the yeast when I do open the bottle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110113579568404051?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110113579568404051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110113579568404051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110113579568404051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110113579568404051'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/finallyits-bottled.html' title='Finally...it&apos;s bottled!'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110089706056694292</id><published>2004-11-19T15:44:00.000-05:00</published><updated>2004-11-19T15:44:20.566-05:00</updated><title type='text'></title><content type='html'>&lt;a href='http://photos1.blogger.com/img/196/2402/1024/Fullscreen%20capture%2011%2019%202004%203%2042%2055%20PM.jpg'&gt;&lt;img border='0' style='border:1px solid #000000; margin:2px' src='http://photos1.blogger.com/img/196/2402/320/Fullscreen%20capture%2011%2019%202004%203%2042%2055%20PM.jpg'&gt;&lt;/a&gt;&lt;br /&gt;...and here's a picture of the almost-finished product.  Ya know...that doesn't look very impressive for the amount of work that went into it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110089706056694292?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110089706056694292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110089706056694292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110089706056694292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110089706056694292'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/blog-post.html' title=''/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110089577476501049</id><published>2004-11-19T15:22:00.000-05:00</published><updated>2004-11-19T15:35:22.513-05:00</updated><title type='text'></title><content type='html'>&lt;a href="http://photos1.blogger.com/img/196/2402/1024/Fullscreen%20capture%2011%2019%202004%203%2021%2031%20PM.jpg"&gt;&lt;img style="BORDER-RIGHT: #000000 1px solid; BORDER-TOP: #000000 1px solid; MARGIN: 2px; BORDER-LEFT: #000000 1px solid; BORDER-BOTTOM: #000000 1px solid" src="http://photos1.blogger.com/img/196/2402/320/Fullscreen%20capture%2011%2019%202004%203%2021%2031%20PM.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;What's this? Nothing in particular, really. I just like showing off screenshots that make it look I'm smart!  Hehe.  &lt;span style="font-size:85%;"&gt;It's like the guy who is, um, 'lacking', who buys a big-flashy-expensive car, in order to make up for his, um, perceived 'inadequacy'.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;But seriously, all crude-jokes aside, this is just an in-progress piece of software I'm writing for work. What you're seeing is a map. I need to make an algorithm that will give me a line that's offset on the left or right side of any given line. (This offset line will represent a guardrail.) What you see here is an intermediary step in creating the offset lines with a bunch of extra labels for debug purposes.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110089577476501049?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110089577476501049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110089577476501049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110089577476501049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110089577476501049'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/whats-this-nothing-in-particular.html' title=''/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9236822.post-110088691453807502</id><published>2004-11-19T13:48:00.000-05:00</published><updated>2005-01-17T15:07:49.790-05:00</updated><title type='text'>Personal Blog</title><content type='html'>Ok, first post. This is my personal blog. If you want to see the Jason &amp;amp; Heather Poll family blog let me know and I'll fire you the URL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9236822-110088691453807502?l=yoopergeek.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yoopergeek.blogspot.com/feeds/110088691453807502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9236822&amp;postID=110088691453807502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110088691453807502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9236822/posts/default/110088691453807502'/><link rel='alternate' type='text/html' href='http://yoopergeek.blogspot.com/2004/11/personal-blog.html' title='Personal Blog'/><author><name>Jason Poll</name><uri>http://www.blogger.com/profile/13833122086713002530</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://lh4.google.com/jtpoll/RpPSe9JtGZI/AAAAAAAAAh0/7gjKgy5j2gk/facethumb2.jpg'/></author><thr:total>0</thr:total></entry></feed>
