<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Adam Caudill&#039;s Blog &#187; Tips and Tricks</title>
	<atom:link href="http://adamcaudill.com/tag/tips-and-tricks/feed/" rel="self" type="application/rss+xml" />
	<link>http://adamcaudill.com</link>
	<description>Adam&#039;s view on technology, software development, and world domination.</description>
	<lastBuildDate>Sat, 04 Feb 2012 19:01:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Masking Credit Cards for PCI</title>
		<link>http://adamcaudill.com/2011/10/20/masking-credit-cards-for-pci/</link>
		<comments>http://adamcaudill.com/2011/10/20/masking-credit-cards-for-pci/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 20:14:40 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Code Samples]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[PCI]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=1004</guid>
		<description><![CDATA[<p>PCI DSS, the security standard for companies that handle credit cards, defines a number of <a href="https://www.pcisecuritystandards.org/pdfs/pci_audit_procedures_v1-1.pdf">rules</a> as to how credit cards are handled. One of those rules, 3.3, is defined as follows:</p> <p style="padding-left: 30px;">Mask PAN when displayed (the first six and last four digits are the maximum number of digits to be displayed)</p> [...]]]></description>
			<content:encoded><![CDATA[<p>PCI DSS, the security standard for companies that handle credit cards, defines a number of <a href="https://www.pcisecuritystandards.org/pdfs/pci_audit_procedures_v1-1.pdf">rules</a> as to how credit cards are handled. One of those rules, 3.3, is defined as follows:</p>
<p style="padding-left: 30px;"><em>Mask PAN when displayed (the first six and last four digits are the maximum number of digits to be displayed)</em></p>
<p>So based on this requirement I assumed that the code to do this would be common and widely available; much to my surprise there are rather few samples that do this, and of those I found they only showed the last four (which when you are handling a lot of credit cards, searching for an account by the last four isn&#8217;t all that helpful) and were often rather fragile.</p>
<p>So I whipped this up, hopefully it&#8217;ll be useful to others.</p>
<div id="gist-1674453" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">public</span> <span class="k">static</span> <span class="kt">string</span> <span class="nf">MaskCreditCard</span><span class="p">(</span><span class="kt">string</span> <span class="k">value</span><span class="p">)</span></div><div class='line' id='LC2'><span class="p">{</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">const</span> <span class="kt">string</span> <span class="n">PATTERN</span> <span class="p">=</span> <span class="s">@&quot;\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|&quot;</span> <span class="p">+</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="s">@&quot;6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|&quot;</span> <span class="p">+</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="s">@&quot;[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})\b&quot;</span><span class="p">;</span></div><div class='line' id='LC6'>&nbsp;</div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="n">var</span> <span class="n">replace</span> <span class="p">=</span> <span class="n">Regex</span><span class="p">.</span><span class="n">Replace</span><span class="p">(</span><span class="k">value</span><span class="p">,</span> <span class="n">PATTERN</span><span class="p">,</span> <span class="k">new</span> <span class="n">MatchEvaluator</span><span class="p">(</span><span class="n">match</span> <span class="p">=&gt;</span></div><div class='line' id='LC8'>&nbsp;&nbsp;<span class="p">{</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">var</span> <span class="n">num</span> <span class="p">=</span> <span class="n">match</span><span class="p">.</span><span class="n">ToString</span><span class="p">();</span></div><div class='line' id='LC10'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">return</span> <span class="n">num</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">6</span><span class="p">)</span> <span class="p">+</span> <span class="k">new</span> <span class="kt">string</span><span class="p">(</span><span class="sc">&#39;*&#39;</span><span class="p">,</span> <span class="n">num</span><span class="p">.</span><span class="n">Length</span> <span class="p">-</span> <span class="m">10</span><span class="p">)</span> <span class="p">+</span></div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">num</span><span class="p">.</span><span class="n">Substring</span><span class="p">(</span><span class="n">num</span><span class="p">.</span><span class="n">Length</span> <span class="p">-</span> <span class="m">4</span><span class="p">);</span></div><div class='line' id='LC12'>&nbsp;&nbsp;<span class="p">}));</span></div><div class='line' id='LC13'>&nbsp;</div><div class='line' id='LC14'>&nbsp;&nbsp;<span class="k">return</span> <span class="n">replace</span><span class="p">;</span></div><div class='line' id='LC15'><span class="p">}</span></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/1674453/570a38b70ef4441988a12fe282a64b81bde8be35/gistfile1.cs" style="float:right;">view raw</a>
            <a href="https://gist.github.com/1674453#file_gistfile1.cs" style="float:right;margin-right:10px;color:#666">gistfile1.cs</a>
            <a href="https://gist.github.com/1674453">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>

<p>The regex pattern is from <a href="http://www.regular-expressions.info/creditcard.html">Regular-Expressions.info</a> and should detect most major cards.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2011/10/20/masking-credit-cards-for-pci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 3 &amp; Dreamhost PS</title>
		<link>http://adamcaudill.com/2011/01/28/rails-3-dreamhost-ps/</link>
		<comments>http://adamcaudill.com/2011/01/28/rails-3-dreamhost-ps/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 07:47:01 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[DreamHost]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=717</guid>
		<description><![CDATA[<p>I recently had an idea for a small web application, and seeing as I&#8217;ve not spent as much time as I&#8217;ve wanted to using <a href="http://rubyonrails.org/">Rails</a> &#8211; I opted to build it the latest version of Rails. A decision that caused far more grief than I expected.</p> <p>If you are using <a href="http://www.dreamhost.com/r.cgi?485850">Dreamhost&#8217;s</a> PS offering (a managed [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had an idea for a small web application, and seeing as I&#8217;ve not spent as much time as I&#8217;ve wanted to using <a href="http://rubyonrails.org/">Rails</a> &#8211; I opted to build it the latest version of Rails. A decision that caused far more grief than I expected.</p>
<p>If you are using <a href="http://www.dreamhost.com/r.cgi?485850">Dreamhost&#8217;s</a> PS offering (a managed VPS for those that don&#8217;t know), the seemingly simple task of getting a Rails 3 application up and running is actually quite complex. The root cause of this is that Dreamhost&#8217;s OS image is based on Debian <a href="http://www.debian.org/releases/etch/">etch</a>, which was released in April 2009 and has since been replaced; which means etch has become fairly outdated.</p>
<p>Here&#8217;s the process I used, and so far it seems to be working quite well:</p>
<p><strong>Domain Setup:</strong></p>
<p>When adding your domain to the Dreamhost panel, you&#8217;ll want to enable <a href="http://wiki.dreamhost.com/Passenger">Passenger</a>.</p>
<p><img src="http://adamcaudill.com/files/2011-01-28_0048.png" alt="" width="409" height="217" /></p>
<p>Once your application is uploaded to the server, you&#8217;ll be greeted with a particularly unhelpful error message (something like &#8220;<code>uninitialized constant Bundler</code>&#8220;) from Passenger (or perhaps just a 500 error page).</p>
<p><strong>Server Updates:</strong></p>
<p>This is where the work starts, and gets somewhat ugly. As a warning, it&#8217;s quite possible that you could damage your configuration doing this; though thankfully you can <a href="https://panel.dreamhost.com/index.cgi?tree=vserver.reboot&amp;">restore</a> your server to a working state within a few minutes from the Dreamhost panel should something go wrong. You&#8217;ll also need to have an &#8220;<a href="https://panel.dreamhost.com/index.cgi?tree=vserver.adminusers&amp;">admin user</a>&#8221; for this task, as much of what needs to be done has to be done as root.</p>
<p>First step: Get your PS up to date; even after performing a restore on my server, there were a number of updates that are available to be installed. So let&#8217;s start off by getting those out of the way.</p>
<pre class="brush: plain; title: ; notranslate">sudo apt-get update
sudo apt-get upgrade
sudo apt-get -f install</pre>
<p>Once you get past those three commands, the next step is to update SQLite to the latest version, as the version Dreamhost uses is quite old and won&#8217;t work with Rails 3.0 (well, to be accurate it won&#8217;t work with the latest version of sqlite3-ruby, which is the default database provider for Rails 3).</p>
<pre class="brush: plain; title: ; notranslate">wget http://www.sqlite.org/sqlite-autoconf-3070400.tar.gz
tar zxvf sqlite-autoconf-3070400.tar.gz
cd sqlite-autoconf-3070400
sudo ./configure --bindir=/usr/bin --libdir=/usr/lib
sudo make
sudo make install</pre>
<p>If you don&#8217;t update SQLite you&#8217;ll get an error like this:</p>
<pre class="brush: plain; title: ; notranslate">sudo gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
	ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb
checking for sqlite3.h... yes
checking for sqlite3_libversion_number() in -lsqlite3... yes
checking for rb_proc_arity()... no
checking for sqlite3_initialize()... no
sqlite3-ruby only supports sqlite3 versions 3.6.16+, please upgrade!
*** extconf.rb failed ***</pre>
<p>or if you install the updated version, but don&#8217;t force it to <code>/usr/lib</code> you&#8217;ll get an error like this:</p>
<pre class="brush: plain; title: ; notranslate">sudo gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
	ERROR: Failed to build gem native extension.

/usr/bin/ruby1.8 extconf.rb
checking for sqlite3.h... yes
checking for sqlite3_libversion_number() in -lsqlite3... no
sqlite3 is missing. Try 'port install sqlite3 +universal' or 'yum
install sqlite3-devel'
*** extconf.rb failed *** </pre>
<p>Once that is taken care of SQLite, the rest is easy.</p>
<pre class="brush: plain; title: ; notranslate">sudo gem update</pre>
<p>At this point if you visit your new Rails site, it <em>should</em> be working!</p>
<p>Notes:</p>
<ol>
<li>I&#8217;ve not tested this extensively, and I&#8217;ve no idea if this breaks anything. All I can say for certain, if that all of <em>my</em> sites still work, but your mileage may vary. &lt;Disclaimer /&gt;</li>
<li>I was a fairly early Dreamhost PS adopter, and part way through this process I reset my server to get it back to a clean state. After resetting, I noticed some differences with the behavior of <code>apt-get</code> (404s on <code>update</code> and <code>upgrade</code> are gone), so for other early adopters it may be necessary to perform a reset to get your servers configuration in-sync with the latest official setup.</li>
<li>I can&#8217;t say for a fact that this is completely necessary, though you&#8217;ll likely need to selectively update a few packages if you skip this step. Also, for me, <code>gem</code> was broken until I ran <code>sudo apt-get -f install</code>.</li>
<li>Special thanks to <a href="http://matthewjlittle.com/">Matt</a> for helping me get this working; troubleshooting the SQLite install was more than a little time consuming.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2011/01/28/rails-3-dreamhost-ps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>on Hiring</title>
		<link>http://adamcaudill.com/2010/06/19/on-hiring/</link>
		<comments>http://adamcaudill.com/2010/06/19/on-hiring/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 19:58:25 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Business of Software]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[Hiring]]></category>
		<category><![CDATA[HR]]></category>
		<category><![CDATA[ISV]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=582</guid>
		<description><![CDATA[<p>The company I work for is hiring several developers which marks my first significant hiring effort since being promoted to management. This had led to a few interesting observations* I would like to share that may benefit both those looking for a new job and those looking for the next star to add to their team.</p> <p>Immigration Law: [...]]]></description>
			<content:encoded><![CDATA[<p>The company I work for is hiring several developers which marks my first significant hiring effort since being promoted to management. This had led to a few interesting observations* I would like to share that may benefit both those looking for a new job and those looking for the next star to add to their team.</p>
<p><strong>Immigration Law:</strong> I had no idea how complex this area of law gets; it&#8217;s a maddening maze of rules and policies that are more effective at confusing those involved than providing a reasonable solution to a problem. If you run into this (and you will), you need somebody that has dealt with this and knows what to do. Getting both parties into legal hot water is far too easy.</p>
<p><strong>Resumes:</strong> I&#8217;ve seen great resumes that made it clear that I needed to hire this person and resumes so cluttered and complex it took an hour just to get through it. Here&#8217;s a few things that stuck out to me:</p>
<ul>
<li><a href="http://en.wikipedia.org/wiki/Don't_repeat_yourself">DRY</a> is good for code, and for a resume. Clean and concise is always better; if you find yourself hitting Ctrl+C even once while working on a resume, you&#8217;re probably doing something wrong.</li>
<li>Length is important, but shorter isn&#8217;t always better. Unlike many other fields where a single page resume is considered optimal, technical resumes need at least a second page. Going too short on a resume is a great way to blend into the crowd; a resume should stand out, and that takes space.</li>
<li>How long is too long? Unless you&#8217;ve been doing this for a <em>very</em> long time, more than three pages is probably excessive. This isn&#8217;t always true, but think it through before using more than two pages.</li>
<li>Use whitespace carefully. Don&#8217;t leave a page half empty or pack everything in so that it looks cluttered. As with any type of design, whitespace is a powerful tool that should be used wisely and never be left to chance.</li>
<li>Use color sparingly. Many corporate printers are black and white only, so if you use color make sure it looks right when printed without it.</li>
<li>Use bold even more sparingly. It&#8217;s sometimes useful to point out items of interest, but it quickly degrades the readability of a resume.</li>
</ul>
<p>Many people seem to have a hard time with this, but a resume is a <em>textual representation of yourself</em>. It represents you as a person and your accomplishments as a professional. Any errors or signs of haste or carelessness say much about you as a person; if you are careless with such a significant representation of yourself what does it say about your attention to detail or work ethic?</p>
<p><strong>Experience:</strong> For a person that has recently graduated, experience in the field is the single largest hindrance both when it comes to securing a position and to receiving a salary they are happy with. The best advice I can find for people in this position is to look to the open source community for help. There are many projects that are desperate for developers and it&#8217;s a great way to get familiar with working in a team, coordinating with people over a distributed area, and releasing code for public consumption. In lieu of paid work experience, open source is a great way to fill in a resume (and it can be quite profitable for some, if you play your cards right).</p>
<p><strong>Salary:</strong> In some companies pay is a minor issue thanks to clearly structured systems such as that <a href="http://www.joelonsoftware.com/articles/fog0000000038.html">proposed</a> by Joel Spolsky; for others is can be a source of pain, envy, and jealousy. This is a topic that I truly hate; it&#8217;s uncomfortable at best and quite painful at worst. While I can&#8217;t offer much advice, here are a few things to think about:</p>
<ul>
<li>Money is not an effective motivator. In an ideal environment it should just stay out-of-the-way and allow developers to live a comfortable life; in reality the role it plays is a bit different. More often than not, it&#8217;s a distraction that gets in the way and outweighs the factors that do motivate people.</li>
<li>Companies follow a few different pay systems, and once set moving to different system is nearly impossible. Here are a few I&#8217;ve seen:
<ul>
<li>Clearly Structured: This system places developers on a scale, and developers at a given level receive the same salary (see <a href="http://fogcreek.com/">Fog Creek</a>).</li>
<li>Structured + Negotiated: This is the most common system I&#8217;ve seen; it mixes a structured level system with negotiated modifications that can apply a certain percentage increase from the normal base salary for that level or other benefits (extended vacation, etc).</li>
<li>Negotiated: Pay is based on negotiation skills and need; this can lead to odd situations such as where a junior developer can make more than a senior developer due to the need to fill a position quickly. This system requires strict secrecy when it comes to salary information to avoid nasty surprises, unlike the clearly structured system where salary information can be openly shared.</li>
</ul>
</li>
<li>Are large salary increases possible? Some companies have no issue with large increases in salary for a promotion (20%+) while in others exceeding 5% for any reason is a major challenge. If a developer is coming in on the low-end of the scale (i.e. due to lack of experience, such as a recent graduate), is there a real possibility of moving up? In my experience, people stay near the end they start at &#8211; those that start at the bottom will stay there until they move to a different company.</li>
</ul>
<p><strong>Interview Questions:</strong> If you are conducing an interview, make a list of questions and write them down. It&#8217;s quite embarrassing to suddenly realize that you are out of questions just a few minutes in (Need inspiration? Try <a href="http://en.wikipedia.org/wiki/Microsoft_interview">this</a> or <a href="http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html">this</a>). Many people have said much about this, but the most important thing I can point out is just don&#8217;t wing it. Plan carefully, make sure you know what you&#8217;re going to do and when before the candidate shows up.</p>
<p><strong>Interview Dress Code:</strong> I&#8217;ve been amazed at what I&#8217;ve seen people wear, everything from high-end suits to jeans. What&#8217;s appropriate? It really depends on the environment; a large corporation will expect an Armani suit where a startup is happier seeing jeans and an American Apparel t-shirt. When in doubt, I would go with a suit personally &#8211; but depending on the company that could cost you the job just as quickly as showing up in jeans.</p>
<p><strong>Interviews Go Both Ways:</strong> An interview shouldn&#8217;t be a one-way affair; the candidate should be interviewing the company as much as you are interviewing them. They should be asking questions about the environment, expectations, tools and resources provided as much as you are asking them about prior experience and knowledge. If a candidate doesn&#8217;t seem to care about the company or what the working conditions are like &#8211; think carefully before hiring them.</p>
<p><strong>Other Thoughts:</strong> I&#8217;ll not go into what I look for when it comes to personality or other personal traits as that would require far more than a blog post to cover. I&#8217;m also going to avoid things such as hobbies and the like; while they can tell you much about a person they can also lead to other complications. Any question in an interview can quickly lead to a land-mine and in the legal quagmire that is HR law and policies, trouble is easy to find. When in doubt, just don&#8217;t ask.</p>
<p>* This is based on my experience over the years; not necessarily the experiences in this round of hiring or the opinions or policies of my employer. In general, nothing in this refers to policies, preferences, or procedures of my employer. &lt;Standard Disclaimer /&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2010/06/19/on-hiring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrading Windows 7 Pro VL</title>
		<link>http://adamcaudill.com/2010/06/18/upgrading-windows-7-pro-vl/</link>
		<comments>http://adamcaudill.com/2010/06/18/upgrading-windows-7-pro-vl/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 03:42:05 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MSDN]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=600</guid>
		<description><![CDATA[<p>While performing some testing on a Windows 7 Professional workstation running a VL build from MSDN found that a feature I needed was missing &#8211; the new <a href="http://blogs.msdn.com/b/rds/archive/2009/07/01/using-multiple-monitors-in-remote-desktop-session.aspx">Multi-Monitor RDP</a> support. After a little <a href="http://windows.microsoft.com/en-us/windows7/Remote-Desktop-Connection-frequently-asked-questions#">research</a> I found that only the Ultimate and Enterprise editions support this feature; which thanks to Windows 7&#8242;s <a href="http://en.wikipedia.org/wiki/Windows_Anytime_Upgrade">Anytime Upgrade</a> [...]]]></description>
			<content:encoded><![CDATA[<p>While performing some testing on a Windows 7 Professional workstation running a VL build from MSDN found that a feature I needed was missing &#8211; the new <a href="http://blogs.msdn.com/b/rds/archive/2009/07/01/using-multiple-monitors-in-remote-desktop-session.aspx">Multi-Monitor RDP</a> support. After a little <a href="http://windows.microsoft.com/en-us/windows7/Remote-Desktop-Connection-frequently-asked-questions#">research</a> I found that only the Ultimate and Enterprise editions support this feature; which thanks to Windows 7&#8242;s <a href="http://en.wikipedia.org/wiki/Windows_Anytime_Upgrade">Anytime Upgrade</a> feature I assumed this would be no issue.</p>
<p>But, it was an issue.</p>
<p>It turns out that the build of Windows 7 I was using was missing <code>WindowsAnytimeUpgradeUI.exe</code> and the other related files needed to make the Anytime Upgrade work &#8211; and copying the files from another box doesn&#8217;t work. It seems this build simply can&#8217;t be upgraded in this fashion. So I tried a few other tricks, hoping to find something that would work:</p>
<ul>
<li>Reactivate Windows with an Ultimate key; fails with an error indicating that a Professional key is required.</li>
<li>Run Ultimate edition installer from Windows; fails with <a href="http://adamcaudill.com/files/2010-06-18_0332.png" rel="lightbox">this error</a> indicating that you can&#8217;t perform edition upgrades.</li>
</ul>
<p>So being stubborn and determined not to re-install Windows to make this feature work, I started looking for other options. Thanks to a hack for <a href="http://www.gmtaz.com/how-to-upgrade-windows-7-rc-ultimate-to-rtm-enterprise/comment-page-1/">upgrading the RC builds to Final</a>, I found what I needed.</p>
<p>I edited the <code>EditionID</code> and <code>ProductName</code> to reflect Ultimate instead of Professional, rebooted, and then ran the Ultimate installer from within Windows. This time the installer ran without issue and after an hour and a couple reboots it was done. This in-place upgrade/repair procedure allows you to jump to a different edition with fairly little pain. A couple of Windows settings needed to be corrected (primarily display related) and Visual Studio 2010 had to be re-installed, though otherwise everything worked just as it did before.</p>
<p>This is the only method for upgrading these Windows 7 builds that I&#8217;ve found, the only other option is to re-install Windows from scratch.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2010/06/18/upgrading-windows-7-pro-vl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android &amp; Windows 7 64bit</title>
		<link>http://adamcaudill.com/2010/04/19/android-windows-7-64bit/</link>
		<comments>http://adamcaudill.com/2010/04/19/android-windows-7-64bit/#comments</comments>
		<pubDate>Mon, 19 Apr 2010 05:13:56 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=572</guid>
		<description><![CDATA[<p>Setting up the Android SDK on Windows 7 64bit, with a 64bit JDK / JRE is a bit less straightforward than one would expect, thankfully though the solution is quite simple. There are two settings that need to be adjusted to make this work &#8211; otherwise you&#8217;ll get an error indicating that Java can&#8217;t be [...]]]></description>
			<content:encoded><![CDATA[<p>Setting up the Android SDK on Windows 7 64bit, with a 64bit JDK / JRE is a bit less straightforward than one would expect, thankfully though the solution is quite simple. There are two settings that need to be adjusted to make this work &#8211; otherwise you&#8217;ll get an error indicating that Java can&#8217;t be found.</p>
<p>Step 1: Modify your <code>PATH</code> to include the <code>bin</code> folder of the JRE. Mine looks like this:</p>
<p style="padding-left: 30px;"><code>C:\Program Files\Java\jre6\bin</code></p>
<p>Step 2: Set the <code>ANDROID_SWT</code> variable (you&#8217;ll probably need to add it) to the <code>\tools\lib\x86_64</code> folder of the Android SDK. Mine looks like this:</p>
<p style="padding-left: 30px;"><code>C:\Android\SDK\tools\lib\x86_64</code></p>
<p>With these two changes, everything seems to work as expected. Why this is required on 64bit but not 32bit I&#8217;m not sure, but this does seem to solve the problem.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2010/04/19/android-windows-7-64bit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cancel GoDaddy&#8217;s Domain Privacy</title>
		<link>http://adamcaudill.com/2009/10/03/cancel-godaddys-domain-privacy/</link>
		<comments>http://adamcaudill.com/2009/10/03/cancel-godaddys-domain-privacy/#comments</comments>
		<pubDate>Sat, 03 Oct 2009 16:26:49 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[GoDaddy]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=523</guid>
		<description><![CDATA[<p>While trying to renew a few domain names recently, I found that cancelling the Privacy service that GoDaddy offers (via <a href="https://www.domainsbyproxy.com/">Domains By Proxy</a>) is much more difficult than I had expected. The $8.99/year service conceals your name, address, and phone number from the public WHOIS listing.</p> <p>Being concerned about privacy as most people are (or at [...]]]></description>
			<content:encoded><![CDATA[<p>While trying to renew a few domain names recently, I found that cancelling the Privacy service that GoDaddy offers (via <a href="https://www.domainsbyproxy.com/">Domains By Proxy</a>) is much more difficult than I had expected. The $8.99/year service conceals your name, address, and phone number from the public WHOIS listing.</p>
<p>Being concerned about privacy as most people are (or at least should be) it seemed a reasonable option but when multiplied by quite a few domains, it gets rather expensive. So during this last round of renewals I decided to cancel the service; figuring it would be no harder than removing the item from the shopping cart. To my surprise, it wasn&#8217;t nearly so easy.</p>
<p>Turns out that you have to sign into the DomainsByProxy web site with a Customer ID and password to cancel the service; so I tried the obvious and used my GoDaddy ID and password, though no such luck. I searched my email archives and didn&#8217;t find a single email from DomainsByProxy, at this point I was pretty sure whatever email address they had on file wasn&#8217;t valid, which is bad news for me. <span style="background-color: #ffffff; ">While there is an option to <a href="https://www.domainsbyproxy.com/RetrieveAccount.aspx?prog_id=&amp;myaurl=/login.aspx">recover your customer ID</a>, if their records aren&#8217;t accurate then it&#8217;s of no real use.</span></p>
<p>But there is hope.</p>
<p>It took a fair bit of reading and testing, but I finally found a method to get to your account IDs, and it&#8217;s fairly simple:</p>
<ol>
<li>Go to the <a href="http://www.godaddy.com/gdshop/dbp/landing.asp">Private Registration Page</a> on GoDaddy&#8217;s site (make sure you&#8217;re logged in to your GoDaddy account)</li>
<li>Type in some random characters into the search box</li>
<li>On the results page, click &#8220;Continue to Registration&#8221;</li>
<li>Click &#8220;No Thanks&#8221; on the ad page</li>
<li>Scroll down to the section labeled &#8220;<em>3. Select Your Domains By Proxy® Account</em>&#8220;</li>
</ol>
<p>You should now see your customer IDs for the DomainsByProxy web site. The web site only shows the first four account IDs, if you have more than that you can contact DomainsByProxy and have them merge the account IDs you know. Just continue the process until you have all of your accounts merged into one.</p>
<p>Unless you&#8217;ve changed your password on the DomainsByProxy web site, your GoDaddy password should work. From there, you can update your information &#8211; or like me, cancel the service completely. Now you are free to renew the domain without paying the extra annual fee or transfer to another registrar.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2009/10/03/cancel-godaddys-domain-privacy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Avatars &#8211; Why roll your own?</title>
		<link>http://adamcaudill.com/2009/06/19/avatars-why-roll-your-own/</link>
		<comments>http://adamcaudill.com/2009/06/19/avatars-why-roll-your-own/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 20:24:56 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gravatar]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/?p=431</guid>
		<description><![CDATA[<p>I&#8217;ve been working on a project recently that uses avatars, while planning out this specific feature it occurred to me &#8211; why should we re-invent the wheel? There&#8217;s already at least one service that specializes in doing it right: <a href="http://en.gravatar.com/">Gravatar</a>.</p> <p>While building something as simple as avatar support takes a relatively small amount of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working on a project recently that uses avatars, while planning out this specific feature it occurred to me &#8211; why should we re-invent the wheel? There&#8217;s already at least one service that specializes in doing it right: <a href="http://en.gravatar.com/">Gravatar</a>.</p>
<p>While building something as simple as avatar support takes a relatively small amount of time, when working against a tight deadline or a tight budget every minute counts. In the world of an ISV (especially a young one) the balance of user satisfaction and development time is critical. Using a service such as Gravatar is a great way to give the users what they want with minimal impact to the timeline.</p>
<p>With a <a href="http://en.gravatar.com/site/implement">super-simple implementation</a> we were able to get it running within a few minutes &#8211; compare that to at least a few hours to build a custom system. Plus, reduced server load as we aren&#8217;t hosting the images and a cleaner, simpler interface as it&#8217;s one less option the user has to look through.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2009/06/19/avatars-why-roll-your-own/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenDNS</title>
		<link>http://adamcaudill.com/2007/02/02/opendns/</link>
		<comments>http://adamcaudill.com/2007/02/02/opendns/#comments</comments>
		<pubDate>Sat, 03 Feb 2007 00:45:16 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[OpenDNS]]></category>
		<category><![CDATA[Tips and Tricks]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/2007/02/02/opendns/</guid>
		<description><![CDATA[<p>Looking for a bit of a speed boost? <a href="http://www.opendns.com/">OpenDNS</a> might just help. Using the OpenDNS network, instead of your ISP&#8217;s DNS servers seems to really boost the speed of the name resolution process (which is often the slowest part of connecting to another computer).</p> <p>From what I&#8217;ve seen so far, there&#8217;s been a fairly [...]]]></description>
			<content:encoded><![CDATA[<p>Looking for a bit of a speed boost? <a href="http://www.opendns.com/">OpenDNS</a> might just help. Using the OpenDNS network, instead of your ISP&#8217;s DNS servers seems to really boost the speed of the name resolution process (which is often the slowest part of connecting to another computer).</p>
<p>From what I&#8217;ve seen so far, there&#8217;s been a fairly significant speed boost on some sites, primarily those that include content from several domains. The boost isn&#8217;t that great when you look at the overall loading process, but it does reduce the annoying lag when the browser starts loading. So far, I&#8217;ve been happy with the service (which is free), and I really like that the offer various customizations and statistics (if you want to open an account, also free).</p>
<p>On top of the various options and statistics, they also offer <a href="http://www.opendns.com/at_home/benefits.php#smarter">spelling correction</a> and <a href="http://www.opendns.com/at_home/benefits.php#safer">anti-phishing</a> features. It may just be DNS, but this is DNS the way it should be done. And if that&#8217;s not good enough, even <a href="http://photomatt.net/2006/07/18/opendns/">Matt likes them</a>. <img src='http://adamcaudill.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>You mileage will obviously vary, but I think this is pretty cool.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2007/02/02/opendns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make XP Pretty</title>
		<link>http://adamcaudill.com/2006/09/23/make-xp-pretty/</link>
		<comments>http://adamcaudill.com/2006/09/23/make-xp-pretty/#comments</comments>
		<pubDate>Sat, 23 Sep 2006 21:33:19 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows XP]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/2006/09/23/make-xp-pretty/</guid>
		<description><![CDATA[<p>While going through my (long) list of RSS-feeds that I monitor, I found this gem of an article: <a href="http://www.downloadsquad.com/2006/09/23/vista-transformation-pack-vista-ize-your-xp/">Vista Transformation Pack: Vista-ize your XP</a>. The <a href="http://www.windowsxlive.net/?p=137">Vista Transformation Pack</a> is a clever little application that moves your XP desktop several steps closer to the beauty that is Vista. While the &#8216;transformation&#8217; doesn&#8217;t give you [...]]]></description>
			<content:encoded><![CDATA[<p>While going through my (long) list of RSS-feeds that I monitor, I found this gem of an article: <a href="http://www.downloadsquad.com/2006/09/23/vista-transformation-pack-vista-ize-your-xp/">Vista Transformation Pack: Vista-ize your XP</a>. The <a href="http://www.windowsxlive.net/?p=137">Vista Transformation Pack</a> is a clever little application that moves your XP desktop several steps closer to the beauty that is Vista. While the &#8216;transformation&#8217; doesn&#8217;t give you all of the new UI goodies that come with Vista, it does add a fair bit of eye candy.</p>
<p>I&#8217;m not typically one to promote UI tweaks like this, but after playing with the settings, I&#8217;ve now have a great looking setup without the instability that still goes with Vista.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2006/09/23/make-xp-pretty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Running RegEdit as SYSTEM</title>
		<link>http://adamcaudill.com/2006/09/17/running-regedit-as-system/</link>
		<comments>http://adamcaudill.com/2006/09/17/running-regedit-as-system/#comments</comments>
		<pubDate>Sun, 17 Sep 2006 23:59:49 +0000</pubDate>
		<dc:creator>Adam Caudill</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Debugging]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://adamcaudill.com/2006/09/17/running-regedit-as-system/</guid>
		<description><![CDATA[<p>While facing an interesting research challenge, digging into the inner working of Windows, I realized that I needed to change a registry value. That&#8217;s simple enough, I fire up RegEdit, make the change, then politely as RegEdit knows how, it told me that I couldn&#8217;t change the value! Being one that hates when my computer [...]]]></description>
			<content:encoded><![CDATA[<p>While facing an interesting research challenge, digging into the inner working of Windows, I realized that I needed to change a registry value. That&#8217;s simple enough, I fire up RegEdit, make the change, then politely as RegEdit knows how, it told me that I <em>couldn&#8217;t change the value</em>! Being one that hates when <em>my</em> computer tells <em>me</em> I can&#8217;t do something, I had to find another option.</p>
<p>So after some research, I found my answer: <a title="Windows XP Service Controller" href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sc.mspx?mfr=true">sc</a>. This is a great little utility (included with Windows), and made the task of running an application as SYSTEM*  much easier. At this point some of you may be wondering why I didn&#8217;t just use <a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/runas.mspx?mfr=true">RunAs</a> instead, as it&#8217;s designed to allow execution as another user. Well, from all that I&#8217;ve found, there is no way to get RunAs to spawn a process as SYSTEM, one of the downsides of SYSTEM not being a true user.</p>
<p>Another option that I found (somewhat) attractive initially is <a title="GUI-Based RunAsEx" href="http://www.codeproject.com/system/RunUser.asp">RunAsEx</a>, an open source, GUI based version of RunAs. This could be useful, but I found it to be more hassle than it was worth. Still might be useful for somethings, but with all the bugs I found in it, I knew there was a better way.</p>
<p>Now, back to the solution I chose: Using sc to create a service that will execute the application I&#8217;m after. This works because by default all services execute under the SYSTEM user context, so all we have to do is create a service to call the application we need. Surprisingly simple, and it works quite well.</p>
<p>Creating the service looks something like this:</p>
<p><code>SC CREATE AcDebugSvc binPath= "regedit.exe" type= own type= interact</code> <em>**</em></p>
<p>This creates the service, so that now all you have to do is start the service (<code>SC START AcDebugSvc</code> ***) and you&#8217;ll see your copy of RegEdit. If you check in Task Manager, you&#8217;ll be able to confirm that it is actually running as SYSTEM. This is an extremely powerful debugging tool, as it allows you to instantly execute any application as the most powerful user that Windows offers.</p>
<p>Once you are done with your work, just delete the service (<code>SC DELETE AcDebugSvc</code>) and call it a day, that simple. This can also easily be scripted if you tire of typing the commands so often, and it can also be used with most applications. Using this for the Command Prompt (<code>binPath= "cmd.exe /K start"</code>) and for Task Manager (<code>binPath= "taskmgr.exe"</code>) both strike me as being quite useful.</p>
<p>* <strong>WARNING</strong>: As I hope most of you know, System is a very powerful account, it&#8217;s almost limitless in what it can do. If you aren&#8217;t careful while working under this user context; you may end up with a rather expensive paperweight instead of a computer. You have been warned.</p>
<p>** Note: As odd as it is, the spaces after the equals and before the value of the parameters is quite important, the call will fail if you omit them.</p>
<p>*** Note: You&#8217;ll get an error message (&#8220;<code>The service did not respond to the start or control request in a timely fashion.</code>&#8220;) when you call this, it&#8217;s nothing to worry about. The reason that it occurs is that to respond to the message it receives the target application must be designed to operate as a service. Since we are using this for other purposes we, we don&#8217;t really care.</p>
]]></content:encoded>
			<wfw:commentRss>http://adamcaudill.com/2006/09/17/running-regedit-as-system/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

