<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://www.nerdliness.com">
<channel>
 <title>Nerdliness.com</title>
 <link>http://www.nerdliness.com</link>
 <description>We're three nerds doing our part to make the world just a little less stupid.</description>
 <language>en</language>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Nerdlinesscom" /><feedburner:info uri="nerdlinesscom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Nerdlinesscom" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsalloy.com/?rss=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.newsalloy.com/subrss3.gif">Subscribe with NewsAlloy</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.yourminis.com/subscribe.aspx?u=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.yourminis.com/images/addtoyourminisbadge.gif">Subscribe with Yourminis.com</feedburner:feedFlare><feedburner:feedFlare href="http://download.attensa.com/app/get_attensa.html?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.attensa.com/blogs/attensa/WindowsLiveWriter/BadgeredintoBadges_10C02/attensa_feed_button5.gif">Subscribe with Attensa for Outlook</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://hub.netomat.net/account/account.autoSubscribe.jspa?urls=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.netomat.net/blogger/images/icon_netomat_feedbutton.gif">Subscribe with netomat Hub</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.flurry.com/pushRssFeed.do?r=fb&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.flurry.com/images/flurry_rss_logo2.gif">Subscribe with Flurry</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FNerdlinesscom" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><item>
 <title>Get a job, hippie!</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/czYwCHC-ERE/get-job-hippie</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Aardvark is hiring&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Don't worry.&amp;nbsp; I&amp;nbsp;don't think we're going to get in the habit of writing about every job posting we hear about, but&amp;nbsp;being a fan of this particular company and their service, I thought this one was worth passing along.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nerdliness.com/article/2009/03/17/know-stuff-try-aardvark" target="_blank"&gt;Aardvark&lt;/a&gt;, the company we were first introduced to back in March, is looking for smart, talented people.&amp;nbsp; The kind of people who read this blog.&amp;nbsp; People like you.&lt;/p&gt;
&lt;p&gt;Here's the jist of the email they just sent out:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm writing to let you know that we're hiring, and I thought you might know some exceptionally talented people who would want to build Social Search at Aardvark.&lt;br /&gt;
&lt;br /&gt;
We're specifically looking for software engineers, a mobile lead, and research scientists... and we're always looking for extraordinary people for any other role, as well.&lt;br /&gt;
&lt;br /&gt;
If you know anyone who may be interested, you can send them our job site: &lt;a target="_blank" href="http://vark.com/jobs"&gt;http://vark.com/jobs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So go forth and apply, my friends.&amp;nbsp; Just tell them Justin from Nerdliness.com sent you.&amp;nbsp; &lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Fn_aOUCdaIjZwiYv65iVYl0H01M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fn_aOUCdaIjZwiYv65iVYl0H01M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Fn_aOUCdaIjZwiYv65iVYl0H01M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fn_aOUCdaIjZwiYv65iVYl0H01M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=czYwCHC-ERE:pHnVrBqgRVg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=czYwCHC-ERE:pHnVrBqgRVg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=czYwCHC-ERE:pHnVrBqgRVg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=czYwCHC-ERE:pHnVrBqgRVg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=czYwCHC-ERE:pHnVrBqgRVg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=czYwCHC-ERE:pHnVrBqgRVg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=czYwCHC-ERE:pHnVrBqgRVg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=czYwCHC-ERE:pHnVrBqgRVg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=czYwCHC-ERE:pHnVrBqgRVg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=czYwCHC-ERE:pHnVrBqgRVg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/czYwCHC-ERE" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/news">News</category>
 <pubDate>Fri, 25 Sep 2009 22:33:59 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">76 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/09/25/get-job-hippie</feedburner:origLink></item>
<item>
 <title>Are we Simler?</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/m0h-vs4na1c/are-we-simler</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Let's make this short and to the point:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;I&amp;nbsp;haz &lt;a target="_blank" href="http://www.simler.com/"&gt;Simler&lt;/a&gt; invites.&lt;/li&gt;
    &lt;li&gt;You wants &lt;a target="_blank" href="http://www.simler.com/"&gt;Simler&lt;/a&gt; invites.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Wouldn't it be nice to get what you want for a change?&lt;/p&gt;
&lt;p&gt;Just leave a comment on this here post telling us why monkeys are so damn awesome and I'll give you one of my ten.&amp;nbsp; Easy.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Oh, and make sure you include your email address in the comment form thingie so I can hook you up.&amp;nbsp; Nobody sees it but me, my stalkers, and the government agents who planted the chip in my skull during the 90s and have been monitoring all my thoughts ever since.&lt;/p&gt;
&lt;p&gt;Don't know what the hell we're talking about?&amp;nbsp; Just go read the &lt;a target="_blank" href="http://siliconflorist.com/2009/09/17/simler-talking-similar/"&gt;Silicon Florist post about Simler&lt;/a&gt; from a few days ago.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_1_tyVgElsCsARwzvlXNCvNOjtY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_1_tyVgElsCsARwzvlXNCvNOjtY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_1_tyVgElsCsARwzvlXNCvNOjtY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_1_tyVgElsCsARwzvlXNCvNOjtY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m0h-vs4na1c:G8BUiMqGecc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m0h-vs4na1c:G8BUiMqGecc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m0h-vs4na1c:G8BUiMqGecc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m0h-vs4na1c:G8BUiMqGecc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m0h-vs4na1c:G8BUiMqGecc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m0h-vs4na1c:G8BUiMqGecc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m0h-vs4na1c:G8BUiMqGecc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m0h-vs4na1c:G8BUiMqGecc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m0h-vs4na1c:G8BUiMqGecc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m0h-vs4na1c:G8BUiMqGecc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/m0h-vs4na1c" height="1" width="1"/&gt;</description>
 <pubDate>Mon, 21 Sep 2009 23:24:41 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">75 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/09/21/are-we-simler</feedburner:origLink></item>
<item>
 <title>And we're back...</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/RaJaentQuXY/and-we039re-back</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Well, that was relatively painless, wasn't it?&lt;/p&gt;
&lt;p&gt;We're now up and running at &lt;a href="http://www.networkredux.com"&gt;Network Redux&lt;/a&gt;, a Portland-based hosting company we were introduced to after they hosted a &lt;a href="http://portland.beerandblog.com/2009/08/26/free-redux-win-hosting-for-life-at-beer-and-blog/"&gt;Beer and Blog&lt;/a&gt; event a couple weeks ago.&amp;nbsp; Clearly, we haven't been over here long enough to really give a detailed opinion, but I&amp;nbsp;have to say that first impressions are great.&amp;nbsp; The site seems zippier, their support's been fantastic (and available on &lt;a href="http://twitter.com/networkredux"&gt;Twitter&lt;/a&gt;)...&amp;nbsp; so far, so good. &lt;/p&gt;
&lt;p&gt;You might notice their banner at the top and wonder if this here post is part of some clandestine plot to drive customers their way, that they've been greasing our palms with bottles and bucks.&amp;nbsp; Well, not exactly.&lt;/p&gt;
&lt;p&gt;While we &lt;em&gt;can&lt;/em&gt; totally be bought, that's not why we're shoing them love. Yeah, if you followed that Beer and Blog link above you saw that they gave free hosting accounts to everyone who attended.&amp;nbsp; They also picked up the tab for many, many IPAs we polished off.&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Truth is, simply, that they seem to deliver.&amp;nbsp; Even with the shared hosting package they've hooked us up with, we're seeing better performance than we did with our previous hosts.&amp;nbsp; And if our needs outgrow this hosting package, Network Redux will be the first place we consider when it's time for us to actually shell out some greenbacks.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XNTPs5MCMYSmlxZvKEqvQojDrs4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XNTPs5MCMYSmlxZvKEqvQojDrs4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XNTPs5MCMYSmlxZvKEqvQojDrs4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XNTPs5MCMYSmlxZvKEqvQojDrs4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RaJaentQuXY:l8nwyzrl9y4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RaJaentQuXY:l8nwyzrl9y4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RaJaentQuXY:l8nwyzrl9y4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RaJaentQuXY:l8nwyzrl9y4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RaJaentQuXY:l8nwyzrl9y4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RaJaentQuXY:l8nwyzrl9y4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RaJaentQuXY:l8nwyzrl9y4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RaJaentQuXY:l8nwyzrl9y4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RaJaentQuXY:l8nwyzrl9y4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RaJaentQuXY:l8nwyzrl9y4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/RaJaentQuXY" height="1" width="1"/&gt;</description>
 <pubDate>Thu, 17 Sep 2009 15:19:33 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">73 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/09/17/and-we039re-back</feedburner:origLink></item>
<item>
 <title>Moving day!</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/0JgepeG2_1o/moving-day</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;It's moving day here at Nerdliness!&amp;nbsp; &lt;/p&gt;
&lt;p&gt;We'll be moving the site to its new home with &lt;a href="http://www.networkredux.com" target="_blank"&gt;Network Redux&lt;/a&gt; shortly.&amp;nbsp; Assuming everything goes according to Hoyle, I'd expect the move to be finished within, oh, let's say an hour.&lt;/p&gt;
&lt;p&gt;Of course, just because we'll be finished with the file/database migration doesn't mean that YOU, gentle reader, will hit the new host right away.&amp;nbsp; DNS&amp;nbsp;propagation will probably take a bit for some of you, meaning you may be reading this message on our old host instead of our new one.&lt;/p&gt;
&lt;p&gt;So here's the deal.&amp;nbsp; When the move's complete, I'll throw up another post that says we're in our new home, we've unpacked, and you're all invited over for cookies. Until then, assume you're still visiting the old site, and any comments left will be lost in the back of our virtual U-Haul van.&lt;/p&gt;
&lt;p&gt;See you all at &lt;a href="http://www.networkredux.com" target="_blank"&gt;Network Redux&lt;/a&gt;!&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fHuYHzslqLudzLBI9VBswwo3KLg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fHuYHzslqLudzLBI9VBswwo3KLg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fHuYHzslqLudzLBI9VBswwo3KLg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fHuYHzslqLudzLBI9VBswwo3KLg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=0JgepeG2_1o:UUqjJDAScJE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=0JgepeG2_1o:UUqjJDAScJE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=0JgepeG2_1o:UUqjJDAScJE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=0JgepeG2_1o:UUqjJDAScJE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=0JgepeG2_1o:UUqjJDAScJE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=0JgepeG2_1o:UUqjJDAScJE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=0JgepeG2_1o:UUqjJDAScJE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=0JgepeG2_1o:UUqjJDAScJE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=0JgepeG2_1o:UUqjJDAScJE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=0JgepeG2_1o:UUqjJDAScJE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/0JgepeG2_1o" height="1" width="1"/&gt;</description>
 <pubDate>Wed, 16 Sep 2009 20:06:14 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">72 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/09/16/moving-day</feedburner:origLink></item>
<item>
 <title>Quick Drupal Tips and Tricks</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/gvNY5dfhYJ0/quick-drupal-tips-and-tricks</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Easy enough to copy and paste&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;It's been a LONG time since my last post (roughly a year) so I thought it was time to finally post something new. I've been lucky enough to build quite a few Drupal themes lately and below are some bits of code that I use on a dailly basis when adding to or developing custom themes. The nice part is everything below should be easy enough to copy and paste!  &lt;strong&gt;*Note: All code below is for Drupal 6.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Views horizontal scrollbar&lt;/h2&gt;
&lt;p&gt;You know that annoying horizontal scroll bar that appears on your browser everytime you hover over a View on your site? This short bit of CSS gets rid of that. Place the following code in your theme's CSS file and away goes the horizontal scroll.  &lt;code&gt; div.view div.views-admin-links {   width: auto; } &lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Admin page columns&lt;/h2&gt;
&lt;p&gt;Ever built a theme only to have the &amp;quot;/admin&amp;quot; columns display one on top of each other? That's typically due to not enough width in the content area to properly float the two columns. Add this bit of CSS to your theme's CSS file and you will no longer have the problem of floating your admin page columns.  &lt;code&gt; div.admin .left, div.admin .right {   margin-left: 1%;   margin-right: 1%; } &lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Rounded tabs from Zen&lt;/h2&gt;
&lt;p&gt;I'm a big fan of the rounded &amp;quot;edit&amp;quot; and &amp;quot;view&amp;quot; tabs on the Zen theme and wanted to incorporate them into my own themes. There's a couple of files you'll need to edit but it's really quite simple copy and paste. Be sure to &lt;a href="http://nerdliness.com/sites/default/files/tabs.zip"&gt;download the tabs images&lt;/a&gt; and place them in your themes folder in the &amp;quot;images/tabs&amp;quot; folder so the paths below match up.&lt;/p&gt;
&lt;h3&gt;CSS For Tabs&lt;/h3&gt;
&lt;p&gt;&lt;code&gt; /* styling for node tabs (e.g., View, Edit) */ #content-tabs {   margin: 0 0 1em 0; }  #content-tabs ul.primary {   background: url(images/tabs/tab-bar.png) repeat-x left bottom;   border-width: 0;   line-height: normal;   list-style: none;   margin: 0;   padding: 0 0 0 10px;   white-space: nowrap; }  #content-tabs ul.primary li {   float: left;   margin: 0;   padding: 0; }  #content-tabs ul.primary li a {   background-color: transparent;   background: url(images/tabs/tab-left.png) no-repeat left -38px;   border-width: 0;   color: #777;   display: block;   font-weight: bold;   height: 24px;   margin: 0;   padding: 0 0 0 5px; /* width of tab-left.png */   text-decoration: none; }  #content-tabs ul.primary li a .tab {   background: url(images/tabs/tab-right.png) no-repeat right -38px;   border-width: 0;   display: block;   height: 20px; /* 24px (parent) - 4px (padding) */   line-height: 20px;   margin: 0;   padding: 4px 13px 0 6px; }  #content-tabs ul.primary li a:hover, #content-tabs ul.primary li a:focus  {   background-color: transparent;   background: url(images/tabs/tab-left.png) no-repeat left -76px;   border-width: 0;   color: #4e4e4e; }  #content-tabs ul.primary li a:hover .tab {   background: url(images/tabs/tab-right.png) no-repeat right -76px; }  #content-tabs ul.primary li.active a, #content-tabs ul.primary li.active a:hover, #content-tabs ul.primary li.active a:focus  {   background-color: transparent;   background: url(images/tabs/tab-left.png) no-repeat left 0;   border-width: 0;   color: #000; }  #content-tabs ul.primary li.active a .tab, #content-tabs ul.primary li.active a:hover .tab {   background: url(images/tabs/tab-right.png) no-repeat right 0; }  #content-tabs ul.secondary {   background: url(images/tabs/tab-secondary-bg.png) repeat-x left bottom;   border-bottom: 1px solid #c0c0c0;   font-size:0.8em;   list-style: none;   margin: 0;   padding: 0;   white-space: nowrap; }  #content-tabs ul.secondary li {   border-right: none;   float: left;   margin: 0 5px 0 0;   padding: 3px 0; }  #content-tabs ul.secondary a {   background: url(images/tabs/tab-secondary.png) repeat-x left -56px;   border: 1px solid #c0c0c0;   color: #777;   display: block;   height: 24px;   margin: 0;   padding: 0;   text-decoration: none; }  #content-tabs ul.secondary a .tab {   display: block;   height: 18px; /* 24px (parent) - 6px (padding) */   line-height: 18px;   margin: 0;   padding: 3px 8px; }  #content-tabs ul.secondary a:hover, #content-tabs ul.secondary a:focus {   background: url(images/tabs/tab-secondary.png) repeat-x left bottom; }  #content-tabs ul.secondary a.active, #content-tabs ul.secondary a.active:hover, #content-tabs ul.secondary a.active:focus {   background: url(images/tabs/tab-secondary.png) repeat-x left top;   border: 1px solid #c0c0c0;   color: #000; } &lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;CSS for tabs - IE7&lt;/h3&gt;
&lt;p&gt;&lt;code&gt; #content-tabs ul.primary li a:hover {   color: #555;   cursor: pointer;   text-decoration: none; }  #content-tabs ul.secondary li a:hover{   color: #555;   cursor: pointer;   text-decoration: none; } &lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;CSS for tabs - IE6&lt;/h3&gt;
&lt;p&gt;&lt;code&gt; #content-tabs ul.primary li a, #content-tabs ul.primary li a .tab, #content-tabs ul.secondary li a, #content-tabs ul.secondary li a .tab {   display: inline; /* Otherwise the blocks mistakenly get 100% width in IE5 */   display: inline-block; /* Otherwise the blocks mistakenly get 100% width in IE6 */ }  #content-tabs ul.primary, #content-tabs ul.secondary {   width: 100%; /* Otherwise IE5 treats the ul as floated */   width: auto; /* Reset to auto width for IE6 */ }  #content-tabs ul.primary li a {   background: url(images/tabs/tab-left-ie6.png) no-repeat left -38px; }  #content-tabs ul.primary li a .tab {   background: url(images/tabs/tab-right-ie6.png) no-repeat right -38px; }  #content-tabs ul.primary li a:hover {   background: url(images/tabs/tab-left-ie6.png) no-repeat left -76px;   color: #555;   cursor: pointer; /* Minor fix for primary and secondary tabs in IE */   text-decoration: none; }  #content-tabs ul.secondary li a:hover{   color: #555;   cursor: pointer; /* Minor fix for primary and secondary tabs in IE */   text-decoration: none; }  #content-tabs ul.primary li a:hover .tab {   background: url(images/tabs/tab-right-ie6.png) no-repeat right -76px; }  #content-tabs ul.primary li.active a, #content-tabs ul.primary li.active a:hover {   background: url(images/tabs/tab-left-ie6.png) no-repeat left 0; }  #content-tabs ul.primary li.active a .tab, #content-tabs ul.primary li.active a:hover .tab {   background: url(images/tabs/tab-right-ie6.png) no-repeat right 0; } &lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Template.php&lt;/h3&gt;
&lt;p&gt;&lt;code&gt; /**  * Adds class of &amp;quot;tab&amp;quot; to tab menu items so they can be styled.  */ function phptemplate_menu_item_link($link) {   if (empty($link['options'])) {     $link['options'] = array();   }    // If an item is a LOCAL TASK, render it as a tab   if ($link['type'] &amp;amp; MENU_IS_LOCAL_TASK) {     $link['title'] = '&lt;span class="tab"&gt;'. check_plain($link['title']) .'&lt;/span&gt;';     $link['options']['html'] = TRUE;   }    if (empty($link['type'])) {     $true = TRUE;   }    return l($link['title'], $link['href'], $link['options']); }   /**  * Duplicate of theme_menu_local_tasks() but adds clear-block to tabs.  */ function phptemplate_menu_local_tasks() {   $output = '';    if ($primary = menu_primary_local_tasks()) {     $output .= &amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;\n&amp;quot;. $primary .&amp;quot;&lt;/ul&gt;
    &lt;p&gt;\n&amp;quot;;   }   if ($secondary = menu_secondary_local_tasks()) {     $output .= &amp;quot;&lt;/p&gt;
    &lt;ul&gt;\n&amp;quot;. $secondary .&amp;quot;&lt;/ul&gt;
        &lt;p&gt;\n&amp;quot;;   }    return $output; }   After making these changes go to the Performance page and clear your site's cache &amp;quot;/admin/settings/performance&amp;quot;.&lt;/p&gt;
        &lt;h2&gt;Hover working on non-links in IE6&lt;/h2&gt;
        &lt;p&gt;Since IE6 isn't capable of handling hovers on anything other than links (a href), it requires a specific bit of jQuery to get things working right. Thankfully Drupal 6 ships with jQuery so we can leverage it's power for the site's needs.   For this example I am using a background image for my submit buttons on the site and I wanted to have the hover work for all browser, including IE6.  You'll need to create a &amp;quot;script.js&amp;quot; file and add this bit of code. The reason I said to create a &amp;quot;script.js&amp;quot; file is that Drupal 6 picks that up by default, just as how it picks up the &amp;quot;style.css&amp;quot; file automatically.&lt;/p&gt;
        &lt;h3&gt;script.js&lt;/h3&gt;
        &lt;p&gt;&lt;code&gt; Drupal.behaviors.myModuleBehavior = function (context) {   // IE6 &amp;amp; less-specific functions   // Add hover class to primary menu li elements on hover   if ($.browser.msie &amp;amp;&amp;amp; ($.browser.version &amp;lt; 7)) {     $('.form-submit').hover(function() {       $(this).addClass('hover');       }, function() {         $(this).removeClass('hover');     });   }; }; &lt;/code&gt;  Now that we have the code in place for the script, it's time to edit the CSS to make it all come together. Normally we do the &amp;quot;.form-submit:hover&amp;quot; to make the style change per hover on the submit button. Since IE6 doesn't understand that, we need to change that a little bit. We need to add a &amp;quot;form-submit.hover&amp;quot; along with the &amp;quot;form-submit:hover&amp;quot;. The above Javascript code goes in and makes things work so IE6 can understand what we are trying to do.&lt;/p&gt;
        &lt;h3&gt;CSS&lt;/h3&gt;
        &lt;p&gt;&lt;code&gt;  .form-submit {   background: url(images/input-submit.png) repeat-x top center;   color: #000; }  .form-submit:hover, .form-submit.hover {   background-position: bottom center;   color: #fff; }  &lt;/code&gt;  Well that should do it for now. I've got a LOT more tips and tricks with Drupal theming, just need to get them out of my mind an up here. Hopefully I'll get around to soon. If you have any tips or tricks and it's easy enough to copy and paste please leave a comment below. Would love to hear what other's are using with their themes.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ldyZTr6mrFpeCRv-xBOzJB_TfBc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ldyZTr6mrFpeCRv-xBOzJB_TfBc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ldyZTr6mrFpeCRv-xBOzJB_TfBc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ldyZTr6mrFpeCRv-xBOzJB_TfBc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=gvNY5dfhYJ0:WyXlKI21FAU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=gvNY5dfhYJ0:WyXlKI21FAU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=gvNY5dfhYJ0:WyXlKI21FAU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=gvNY5dfhYJ0:WyXlKI21FAU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=gvNY5dfhYJ0:WyXlKI21FAU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=gvNY5dfhYJ0:WyXlKI21FAU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=gvNY5dfhYJ0:WyXlKI21FAU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=gvNY5dfhYJ0:WyXlKI21FAU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=gvNY5dfhYJ0:WyXlKI21FAU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=gvNY5dfhYJ0:WyXlKI21FAU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/gvNY5dfhYJ0" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/x-html-0">(X)HTML</category>
 <category domain="http://www.nerdliness.com/category/css-0">CSS</category>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/javascript-0">JavaScript</category>
 <category domain="http://www.nerdliness.com/category/jquery">jQuery</category>
 <enclosure url="http://www.nerdliness.com/sites/default/files/files/tabs.zip" length="11919" type="application/zip" />
 <pubDate>Tue, 02 Jun 2009 16:12:41 +0000</pubDate>
 <dc:creator>jeremy</dc:creator>
 <guid isPermaLink="false">71 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/06/02/quick-drupal-tips-and-tricks</feedburner:origLink></item>
<item>
 <title>The C# Version of Our ASP.NET AJAX CascadingDropDown VB Database Post</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/oUCwmKGPAe0/c-version-our-aspnet-ajax-cascadingdropdown-vb-database-post</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;One of our most popular posts on this site, at least in terms of search engine traffic, is our &lt;a target="_blank" href="http://www.nerdliness.com/article/2008/02/15/using-asp-net-ajax-cascadingdropdown-visual-basic-and-database"&gt;Using ASP.NET&amp;nbsp;AJAX&amp;nbsp;CascadingDropDown With Visual Basic and a Database&lt;/a&gt; article from February 2008.&amp;nbsp; Long story short, in that article I&amp;nbsp;broke down a Microsoft ASP.NET&amp;nbsp;AJAX tutorial, translating their C# code into Visual Basic and used a MS&amp;nbsp;SQL&amp;nbsp;database for the datasource.&amp;nbsp; Good times.&lt;/p&gt;
&lt;p&gt;Seems that some folks out there, people more inclined to use C#, actually like OUR&amp;nbsp;example better and have spent time translating our code back into that language.&amp;nbsp; Oh, how the tides have turned.&lt;/p&gt;
&lt;p&gt;One of those C#ers, a Mr. Bradley Hall, was kind enough to post his C#&amp;nbsp;version of that sample code in the comments of that post.&amp;nbsp; With his permission, I'm throwing it up here, too.&amp;nbsp; Thanks again, Bradley.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;code&gt;
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using AjaxControlToolkit;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;


[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService]
public class nbaplayers : System.Web.Services.WebService {

    [WebMethod]
    public CascadingDropDownNameValue[] GetConferences(String knownCategoryValues, String category)
    {
        String strConnection = ConfigurationManager.ConnectionStrings["nerdlinessConnection"].ConnectionString;
        SqlConnection sqlConn = new SqlConnection(strConnection);
        String strConfQuery = "SELECT * FROM CONFERENCE";
        SqlCommand cmdFetchConf = new SqlCommand(strConfQuery, sqlConn);

        SqlDataReader dtrConf;
        List&lt;CascadingDropDownNameValue&gt; myConferences = new List&lt;CascadingDropDownNameValue&gt;();

        sqlConn.Open();
        dtrConf = cmdFetchConf.ExecuteReader();

        while(dtrConf.Read())
        {
            String strConfName = dtrConf["conf_name"].ToString();
            String strConfId = dtrConf["conf_id"].ToString();

            myConferences.Add(new CascadingDropDownNameValue(strConfName, strConfId));
        }

        // Cleanup objects.
        cmdFetchConf.Dispose();
        dtrConf.Close();
        dtrConf.Dispose();
        sqlConn.Close();
        sqlConn.Dispose();

        return myConferences.ToArray();
    }

    [WebMethod]
    public CascadingDropDownNameValue[] GetTeams(String knownCategoryValues, String category)
    {
        String strConnection = ConfigurationManager.ConnectionStrings["nerdlinessConnection"].ConnectionString;
        SqlConnection sqlConn = new SqlConnection(strConnection);
        String strTeamQuery = "SELECT * FROM TEAM WHERE conf_id = @confid";
        SqlCommand cmdFetchTeam = new SqlCommand(strTeamQuery, sqlConn);

        SqlDataReader dtrTeam;
        StringDictionary kvTeam = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);

        Int32 intConfId;

        if (!kvTeam.ContainsKey("Conference") || !Int32.TryParse(kvTeam["Conference"], out intConfId))
        {
            return null;
        }

        cmdFetchTeam.Parameters.AddWithValue("@confid", intConfId);

        List&lt;CascadingDropDownNameValue&gt; myTeams = new List&lt;CascadingDropDownNameValue&gt;();

        sqlConn.Open();
        dtrTeam = cmdFetchTeam.ExecuteReader();

        while (dtrTeam.Read())
        {
            String strTeamName = dtrTeam["team_name"].ToString();
            String strTeamId = dtrTeam["team_id"].ToString();

            myTeams.Add(new CascadingDropDownNameValue(strTeamName, strTeamId));
        }

        // Cleanup objects.
        cmdFetchTeam.Dispose();
        dtrTeam.Close();
        dtrTeam.Dispose();
        sqlConn.Close();
        sqlConn.Dispose();

        return myTeams.ToArray();
    }

    [WebMethod]
    public CascadingDropDownNameValue[] GetPlayers(String knownCategoryValues, String category)
    {
        String strConnection = ConfigurationManager.ConnectionStrings["nerdlinessConnection"].ConnectionString;
        SqlConnection sqlConn = new SqlConnection(strConnection);
        String strPlayerQuery = "SELECT * FROM PLAYER WHERE team_id = @teamid";
        SqlCommand cmdFetchPlayer = new SqlCommand(strPlayerQuery, sqlConn);

        SqlDataReader dtrPlayer;
        StringDictionary kvPlayer = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);

        Int32 intTeamId;

        if ((!kvPlayer.ContainsKey("Team")) || (!Int32.TryParse(kvPlayer["Team"], out intTeamId)))
        {
            return null;
        }

        cmdFetchPlayer.Parameters.AddWithValue("@teamid", intTeamId);

        List&lt;CascadingDropDownNameValue&gt; myPlayers = new List&lt;CascadingDropDownNameValue&gt;();

        sqlConn.Open();
        dtrPlayer = cmdFetchPlayer.ExecuteReader();

        while (dtrPlayer.Read())
        {
            String strPlayerName = dtrPlayer["player_name"].ToString();
            String strPlayerId = dtrPlayer["player_id"].ToString();

            myPlayers.Add(new CascadingDropDownNameValue(strPlayerName, strPlayerId));
        }

        // Cleanup objects.
        cmdFetchPlayer.Dispose();
        dtrPlayer.Close();
        dtrPlayer.Dispose();
        sqlConn.Close();
        sqlConn.Dispose();

        return myPlayers.ToArray();
    }
    
}

&lt;/code&gt;
&lt;p&gt;Now I hate to insult Bradley in any way, but I should point out that this is his code, not ours, and that if you aren't a C# aficionado you'll have to trust him that it's does what you'd expect.  And, of course, use it at your own risk.&lt;/p&gt;
&lt;p&gt;Disclaimer aside, it looks great by my limited C# experience, and again...&amp;nbsp; thanks, Bradley.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/jsrf5haSBzsUAksdEuNF2sifoWU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jsrf5haSBzsUAksdEuNF2sifoWU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/jsrf5haSBzsUAksdEuNF2sifoWU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/jsrf5haSBzsUAksdEuNF2sifoWU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=oUCwmKGPAe0:sQdvSF_skKw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=oUCwmKGPAe0:sQdvSF_skKw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=oUCwmKGPAe0:sQdvSF_skKw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=oUCwmKGPAe0:sQdvSF_skKw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=oUCwmKGPAe0:sQdvSF_skKw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=oUCwmKGPAe0:sQdvSF_skKw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=oUCwmKGPAe0:sQdvSF_skKw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=oUCwmKGPAe0:sQdvSF_skKw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=oUCwmKGPAe0:sQdvSF_skKw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=oUCwmKGPAe0:sQdvSF_skKw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/oUCwmKGPAe0" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/ajax">AJAX</category>
 <category domain="http://www.nerdliness.com/category/c">C#</category>
 <category domain="http://www.nerdliness.com/category/ms-sql-0">MS SQL</category>
 <category domain="http://www.nerdliness.com/category/web-services">Web Services</category>
 <pubDate>Fri, 27 Mar 2009 15:43:10 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">69 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/03/27/c-version-our-aspnet-ajax-cascadingdropdown-vb-database-post</feedburner:origLink></item>
<item>
 <title>Wait a minute...  those aren't my stats!</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/98Orcj05z4Y/wait-minute-those-aren039t-my-stats</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Using Google Analytics Include Filters to Remove the Other Guy's Data&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Traffic here at Nerdliness is generally pretty level.&amp;nbsp; Sure, there's the occasional spike on days we post new content, and the overall trend is in the upward direction, but viewed over a monthly timeline the graphs are roughly flat.&lt;/p&gt;
&lt;p&gt;A couple of weeks ago, I&amp;nbsp;was doing my daily OCD-ish perusal of the Nerdliness.com Google Analytics reports and started seeing something odd:&amp;nbsp; a substantial bump in visitors.&amp;nbsp; My first thought was, of course, that Someone Important had recently discovered our sheer awesomeness and was preaching our gospel, but reality soon set in.&lt;/p&gt;
&lt;p&gt;After investigating a little further, I&amp;nbsp;noticed that the Content reports showed that all this traffic was directed at a page that doesn't exist.&amp;nbsp; I&amp;nbsp;looked through our Apache access and error logs, trying to find any references to those URLs and came up with nothing.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;On the off chance that I&amp;nbsp;might have actually made some sort of mistake, I also compared the Google Analytics report to our Google AdSense data.&amp;nbsp; Our &lt;a href="http://www.nerdliness.com/monkeytoes"&gt;404 page&lt;/a&gt; has a couple of AdSense blocks on it, so I figured that, if it was the result of a bad link and visitors getting a 404 error, we'd see a proportional increase in AdSense impressions.&lt;/p&gt;
&lt;p&gt;Nothing.&lt;/p&gt;
&lt;p&gt;Looked around at every report, log, and portent I&amp;nbsp;could think of and found nothing.&amp;nbsp; Double-checked our AdSense code snippet, looked good.&amp;nbsp; At that point, I was reasonably sure that it wasn't on our end and started to suspect that, perhaps, someone else was using our GA&amp;nbsp;code.&lt;/p&gt;
&lt;p&gt;So I&amp;nbsp;emailed Google Analytics support.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(Quick side note:&amp;nbsp; GA&amp;nbsp;support contact link was a pain in the pooper to find.&amp;nbsp; If you ever need to contact them yourself, you first have to go through their &lt;a target="_blank" href="http://www.google.com/support/googleanalytics/bin/static.py?page=troubleshooter.cs&amp;amp;problem=gatsc"&gt;Google Analytics Troubleshooter&lt;/a&gt; and just through a few hoops.&amp;nbsp; Assuming you don't find your answer, you should get a contact form at the end.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Good news is that they were very quick to respond, replying to my ticket well within the promised 24 hours.&amp;nbsp; Good on you, Google.)&lt;/p&gt;
&lt;p&gt;GA&amp;nbsp;support didn't 100% confirm that someone was using our code, but their canned message did suggest that was the most likely cause:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Finding information about traffic to domains that are not yours in your reports is possibly the result of someone accidentally entering the wrong code on their own site, or borrowing/displaying some of your website's code for their website.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Even better, they included a possible fix:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you're concerned about this data corrupting your own reports, Analytics can easily filter on a specific domain so you can avoid this problem. We recommend creating an 'Include' filter on your own domain:&lt;br /&gt;
&lt;br /&gt;
Filter Type: Custom filter &amp;gt; Include&lt;br /&gt;
Filter Field: Hostname&lt;br /&gt;
Filter Pattern: &lt;a href="http://your-domain-name.com/" target="_blank"&gt;your-domain-name.com&lt;/a&gt;&lt;br /&gt;
Case Sensitive: No&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sweet.&lt;/p&gt;
&lt;p&gt;In case you don't know, you get to the Filter setup by:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Log in to Google Analytics (duh).&lt;/li&gt;
    &lt;li&gt;Click the Edit link for the domain you want to Filter.&amp;nbsp; It's in the far right column, under the Actions heading.&lt;/li&gt;
    &lt;li&gt;Click the &amp;quot;+Add Filter&amp;quot; link.&amp;nbsp; It's in the third section down with the heading &amp;quot;Filters Applied to Profile.&amp;quot;&amp;nbsp; The link is on the far right, on the same grey background as the heading title.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once there, just follow the Google Analytics Support instructions above.&lt;/p&gt;
&lt;p&gt;Now, it doesn't look like the filter will do anything to historical data, just info that comes in after the filter is in place.&amp;nbsp; That said, I think that our new Google Analytics setup will include setting up this input filters as soon as we set up a new domain, just in case.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Fr8LNkDuQCTDSuvibuU9nFuVHPE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fr8LNkDuQCTDSuvibuU9nFuVHPE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Fr8LNkDuQCTDSuvibuU9nFuVHPE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Fr8LNkDuQCTDSuvibuU9nFuVHPE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=98Orcj05z4Y:90A-CqBauuI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=98Orcj05z4Y:90A-CqBauuI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=98Orcj05z4Y:90A-CqBauuI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=98Orcj05z4Y:90A-CqBauuI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=98Orcj05z4Y:90A-CqBauuI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=98Orcj05z4Y:90A-CqBauuI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=98Orcj05z4Y:90A-CqBauuI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=98Orcj05z4Y:90A-CqBauuI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=98Orcj05z4Y:90A-CqBauuI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=98Orcj05z4Y:90A-CqBauuI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/98Orcj05z4Y" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/google">Google</category>
 <pubDate>Thu, 26 Mar 2009 15:51:42 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">68 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/03/26/wait-minute-those-aren039t-my-stats</feedburner:origLink></item>
<item>
 <title>My Oracle Sequence/Datapump Shenanigans</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/BmT1nvsKFoU/my-oracle-sequencedatapump-shenanigans</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;I&amp;nbsp;love sharing my screw-ups with you all.&amp;nbsp; One of my favorite things, right up there with raindrops on roses and whiskers on kittens.&amp;nbsp; It's therapeutic for me and, hopefully, helpful for you in the God-I-hope-I-can-avoid-HIS-idiotic-mistakes way.&amp;nbsp; Win/win.&lt;/p&gt;
&lt;p&gt;Thankfully, it happens so often I've got enough material to keep this blog afloat for months.&amp;nbsp; Take our recent Oracle issues at the office.&lt;/p&gt;
&lt;p&gt;We have a fairly large Oracle database in one of our remote offices that's home to about 200GB of GIS&amp;nbsp;data.&amp;nbsp; In addition to that production version, we maintain a development copy of the data for, well, development.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Occasionally, we need to move data between the two instances, and my prefered method for doing so involves using the Oracle Datapump utilities (expdp for exporting, impdp for importing).&amp;nbsp; My process looks something like this:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Dump source database to disk via expdp.&lt;/li&gt;
    &lt;li&gt;Copy dump file to destination server.&lt;/li&gt;
    &lt;li&gt;Drop the schemas I need to refresh.&lt;/li&gt;
    &lt;li&gt;Import the specific schemas via impdp.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I could just export the specific schemas that I'm interested in, but I&amp;nbsp;like to get the full backup just in case there's some object I forgot I needed, etc. &lt;/p&gt;
&lt;p&gt;Couple quick explanations for any non-Oracle types out there.&amp;nbsp; First, in Oracle, a &amp;quot;schema&amp;quot;&amp;nbsp;and a &amp;quot;user&amp;quot;&amp;nbsp;are essentially interchangeable terms.&amp;nbsp; Schemas own objects, can have roles/privileges granted to them, etc.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;For example, the TestUser schema could be granted the CONNECT&amp;nbsp;role, thereby giving it the ability to, well, connect to the database.&amp;nbsp; The TestUser role might also be granted the ability to create objects like tables, views, etc., so you might find yourself querying the TestUser.TestTable table. &lt;/p&gt;
&lt;p&gt;Second, Oracle has an object called a Sequence that doesn't exist in certain other databases (&amp;lt;cough&amp;gt;MS&amp;nbsp;SQL&amp;lt;cough&amp;gt;).&amp;nbsp; Like the name implies, a Sequence is an object you can use to create unique, sequential-ish* values to insert into tables. &amp;nbsp;Something you might insert, for example, into an ID&amp;nbsp;field.&lt;/p&gt;
&lt;p&gt;Got it?&amp;nbsp; Everything making sense?&amp;nbsp; Ok, on to My Screw Up.&lt;/p&gt;
&lt;p&gt;The other day, I needed to refresh several Schemas in our Dev environment with Production data and, as usual, I did so using those 4 basic steps I mentioned earlier.&amp;nbsp; Export, copy, drop, import.&amp;nbsp; Seemed to work like a champ.&lt;/p&gt;
&lt;p&gt;Until, that is, users started playing with Dev again.&lt;/p&gt;
&lt;p&gt;Suddenly, they'd receive various contraint violations when trying to insert into tables. In a nutshell, some of the tables had unique constraints on ID&amp;nbsp;fields so a user or application couldn't accidentally insert records with the same ID.&amp;nbsp; The users and applications would get those ID&amp;nbsp;values by using the NextVal function of existing sequences.&lt;/p&gt;
&lt;p&gt;Now, as I mentioned, Oracle GUARANTEES&amp;nbsp;that a sequence will never ever give out the same value twice (unless, of course, you went and fiddled with the Sequence by reseeding it, dropping/recreating, etc).&amp;nbsp; And yet, a database that worked fine in Production seemed to be doing just that.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Or rather, it seems that somehow the Sequences and Tables using them were getting out of sync.&lt;/p&gt;
&lt;p&gt;The weird thing was that it didn't happen all the time.&amp;nbsp; We had some 2000 sequences in this database, and not all of them were acting like this.&amp;nbsp; Some applications would work fine after one database refresh, and fail completely after another.&amp;nbsp; No rhyme or reason.&lt;/p&gt;
&lt;p&gt;We hit our heads against this for days, trying to get to the bottom of it before we figured out what was happening.&lt;/p&gt;
&lt;p&gt;Remember how I mentioned that the Production database was pretty large, about 200GB in size?&amp;nbsp; Well, with our hardware, Oracle Data Dump would take about 1 hour to completely export the data.&amp;nbsp; And, because we were lazy, we were performing the export during normal working hours, meaning that users were actively hitting the database during that hour long export process.&lt;/p&gt;
&lt;p&gt;Furthermore, after looking at the export logs, we realized that the expdp process dumped out the Sequence data toward the beginning of the process and dumped the table data toward the end.&lt;/p&gt;
&lt;p&gt;See what was happening?&lt;/p&gt;
&lt;p&gt;Let's say that we started the export at noon.&amp;nbsp; In our mythical database, we've got a TestUser schema with a TestSequence object used to populate the TestId field in TestTable.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Before the export begins, TestSequence's Current Value would be 100, it's NextVal would be 101, and the MAX(TestId)&amp;nbsp;in TestUser.TestTable should be 100.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;So the export kicks off and dumps the TestSequence info to disk at around 12:01.&amp;nbsp; It then goes on to dump other objects to disk.&amp;nbsp; Constraints, views, etc.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Now it gets to the tables, maybe 15 minutes later.&amp;nbsp; It starts processing those tables, starting with the largest ones.&amp;nbsp; TestUser.TestTable is a smaller table, so maybe expdp doesn't dump it to disk until 12:45.&lt;/p&gt;
&lt;p&gt;Meanwhile, endusers have been actively using the database and inserting rows into TestUser.TestTable, using TestUser.TestSequence to get the TestID data.&amp;nbsp; So maybe now TestSequence's Current Value is up to 105.&amp;nbsp; More importantly, the MAX(TestId) in TestTable is also up to 105 when it's finally written to the dumpfile.&lt;/p&gt;
&lt;p&gt;Now, when I copy that dump file over to the destination server and import it, it imports TestSequence with the data it had when it was first exported (CurrVal: 100, NextVal: 101) and the TestTable with the data &lt;em&gt;it&lt;/em&gt; had when it was exported (Max(TestID):&amp;nbsp;105).&lt;/p&gt;
&lt;p&gt;See the problem?&amp;nbsp; When someone in Dev next tries to insert into the copy of TestTable, it gets the value 101 from TestSequence.&amp;nbsp; However,&amp;nbsp;that table already had that value inserted.&amp;nbsp; User ends up with an ORA-00001:&amp;nbsp;unique constraint violated message, and I&amp;nbsp;get my lunch interrupted with phone calls.&lt;/p&gt;
&lt;p&gt;Simple fix, of course, once we figured out the problem:&amp;nbsp;don't export while users are connected.&amp;nbsp; Either schedule the dump to occur during after hour maintenance windows, or lock everyone out for that hour.&lt;/p&gt;
&lt;p&gt;Alternatively, we could have taken a second export of the source database, one that only dumps the Sequence info.&amp;nbsp; Then, after importing the first, full file, import the second sequence-only one.&lt;/p&gt;
&lt;p&gt;*Oracle guarantees that Sequence values will be unique, but not necessarily sequential. Has to do with how Oracle handles caching sequence values for different sessions, etc. &amp;nbsp;If you need the values to be sequential, you'll need to write your own function.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/39ThoDl46hjz7j_OUShu87ZLlds/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/39ThoDl46hjz7j_OUShu87ZLlds/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/39ThoDl46hjz7j_OUShu87ZLlds/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/39ThoDl46hjz7j_OUShu87ZLlds/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=BmT1nvsKFoU:vXYU5ZLd6TU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=BmT1nvsKFoU:vXYU5ZLd6TU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=BmT1nvsKFoU:vXYU5ZLd6TU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=BmT1nvsKFoU:vXYU5ZLd6TU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=BmT1nvsKFoU:vXYU5ZLd6TU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=BmT1nvsKFoU:vXYU5ZLd6TU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=BmT1nvsKFoU:vXYU5ZLd6TU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=BmT1nvsKFoU:vXYU5ZLd6TU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=BmT1nvsKFoU:vXYU5ZLd6TU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=BmT1nvsKFoU:vXYU5ZLd6TU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/BmT1nvsKFoU" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/oracle">Oracle</category>
 <pubDate>Wed, 18 Mar 2009 18:21:21 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">67 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/03/18/my-oracle-sequencedatapump-shenanigans</feedburner:origLink></item>
<item>
 <title>Know stuff?  Try Aardvark</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/m5SwxpK6lOo/know-stuff-try-aardvark</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;New Social Search Service Let's You IM For Answers&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Last week, I was lucky enough to get an invite to test out a new &amp;quot;Social&amp;nbsp;Search&amp;quot;&amp;nbsp;application called &lt;a href="http://vark.com/sxsw" target="_blank"&gt;Aardvark&lt;/a&gt; that was recently released into the wild.&amp;nbsp; Well, not completely into the wild (more on that in a sec), but wild enough that a no-talent hack like me managed to get an invitation (thanks again, &lt;a href="http://twitter.com/marshallk"&gt;@marshallk&lt;/a&gt; and &lt;a href="http://twitter.com/davidadewumi"&gt;@davidadewumi&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;So here's how it works:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;You sign up.&lt;/li&gt;
    &lt;li&gt;You tell Aardvark what types of questions you'd like to answer, rough categories like &amp;quot;Technology&amp;quot; or &amp;quot;Seattle.&amp;quot;&lt;/li&gt;
    &lt;li&gt;People ask questions through their IM&amp;nbsp;client (Google Talk, AIM, Windows Live Messenger).&lt;/li&gt;
    &lt;li&gt;Aardvark forwards that question along to a user on the network who's registered to answer questions about that topic.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can tell Aardvark what times of day you're available to answer questions, and you always have the choice to Pass on one you can't answer.&lt;/p&gt;
&lt;p&gt;A typical exchange might look something like this:&lt;/p&gt;
&lt;p class="rtecenter"&gt;&lt;img src="http://www.nerdliness.com/sites/default/files/images/aardvark.jpg" alt="Aardvark Google Talk exchange" /&gt;&lt;/p&gt;
&lt;p class="rteleft"&gt;Asking questions is just as easy as answering them.&amp;nbsp; You just IM&amp;nbsp;a question to the &lt;strong&gt;aardvark.im&lt;/strong&gt; contact and poof, Aardvark does the rest.&amp;nbsp;&lt;/p&gt;
&lt;p class="rteleft"&gt;All in all, it's pretty damn cool, and extremely useful.&amp;nbsp; I&amp;nbsp;can't wait to see what happens once they get more users with a wider knowledge base onboard.&amp;nbsp; Other than that, my only Wish List item would be Twitter support.&lt;/p&gt;
&lt;p class="rteleft"&gt;Now, getting back to that releasing-into-the-wild thing.&amp;nbsp; Right now, Aardvark isn't open to the public, so there are only a couple ways to get in on the fun:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;See them at &lt;a href="http://www.sxsw.com/" target="_blank"&gt;SxSW&lt;/a&gt;.&amp;nbsp; Unfortunately, I&amp;nbsp;believe today is the last day for the Interactive part of that show, so it's probably too late for that option.&lt;/li&gt;
    &lt;li&gt;Find someone with invitations to share.&amp;nbsp; Someone, perhaps, who's devastatingly handsome... with a really nerdy blog...&amp;nbsp; who wrote this post...&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, yeah.&amp;nbsp; I have a few invitations still that I'd be happy to share.&amp;nbsp; Just email email me (&lt;a href="mailto:justin@nerdliness.com?subject=Aardvark%20Invite%2C%20please!"&gt;justin@nerdliness.com&lt;/a&gt;) or leave a comment here if you're interested and I'll get back to you with the details.&amp;nbsp; I only ask that you a)&amp;nbsp;actually use the service and b) name your next child after me.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eGnI6f9ARBbaRk_TU-juFXwS5AE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eGnI6f9ARBbaRk_TU-juFXwS5AE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eGnI6f9ARBbaRk_TU-juFXwS5AE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eGnI6f9ARBbaRk_TU-juFXwS5AE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m5SwxpK6lOo:t1C1i8pvTxQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m5SwxpK6lOo:t1C1i8pvTxQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m5SwxpK6lOo:t1C1i8pvTxQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m5SwxpK6lOo:t1C1i8pvTxQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m5SwxpK6lOo:t1C1i8pvTxQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m5SwxpK6lOo:t1C1i8pvTxQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m5SwxpK6lOo:t1C1i8pvTxQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m5SwxpK6lOo:t1C1i8pvTxQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=m5SwxpK6lOo:t1C1i8pvTxQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=m5SwxpK6lOo:t1C1i8pvTxQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/m5SwxpK6lOo" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/advice">General Advice</category>
 <category domain="http://www.nerdliness.com/category/news">News</category>
 <pubDate>Tue, 17 Mar 2009 16:23:44 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">66 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/03/17/know-stuff-try-aardvark</feedburner:origLink></item>
<item>
 <title>Open Source Bridge Proposal Deadline Coming</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/2DKAznXYxe0/open-source-bridge-proposal-deadline-coming</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Look, I know this isn't our normal type of post.&amp;nbsp; No code snippets, no real world examples, etc.&amp;nbsp; Barely even a trace of wit and/or style.&lt;/p&gt;
&lt;p&gt;Ok, maybe the lack of style thing really is in keeping with our normal posts. &amp;nbsp;Whatever.&lt;/p&gt;
&lt;p&gt;Point is that this is Important Stuff and, therefore, you need to know:&lt;/p&gt;
&lt;p&gt;The deadline for submitting proposals for &lt;a href="http://opensourcebridge.org" target="_blank"&gt;Open Source Bridge&lt;/a&gt; is fast approaching, as in you-need-to-get-yours-in-in-under-20-days-as-of-this-writing fast.&amp;nbsp; Or, more specifically, by &lt;strong&gt;March 31&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;So what, exactly, &lt;em&gt;is&lt;/em&gt; Open Source Bridge?&amp;nbsp; Well, my under-rock dwelling friend, it is:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt; Open Source Bridge is a new conference for developers working with open source technologies. It will take place June 17-19 in Portland, OR, with five tracks connecting people across projects, languages, and backgrounds to explore how we do our work, and why we participate in open source. The conference structure is designed to provide developers with an opportunity to learn from people they might not connect with at other events. &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Them's their words, of course.&amp;nbsp; Me?&amp;nbsp; I like to think of it as The OSCON Replacement That Will&amp;nbsp;No Doubt Be Better Than Its Predecessor, So San Jose Can Just Keep That Bloody Thing Because We Don't Need Them In Portland, Anyway, Conference.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Granted, &amp;quot;Open Source Bridge&amp;quot; rolls off the tongue a little easier.&lt;/p&gt;
&lt;p&gt;So go to the Open Source Bridge site.&amp;nbsp; Submit a proposal!&amp;nbsp;&amp;nbsp;Volunteer!&amp;nbsp;&amp;nbsp;Sponsor!&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And if you can't do any of those things, just make sure to register and get your bums to Portland in &lt;strong&gt;JUNE&lt;/strong&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/xLWneVxkgJ1wNOQyQeKnkogNB8w/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xLWneVxkgJ1wNOQyQeKnkogNB8w/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/xLWneVxkgJ1wNOQyQeKnkogNB8w/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/xLWneVxkgJ1wNOQyQeKnkogNB8w/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2DKAznXYxe0:CdYcnHVthKc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2DKAznXYxe0:CdYcnHVthKc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2DKAznXYxe0:CdYcnHVthKc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2DKAznXYxe0:CdYcnHVthKc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2DKAznXYxe0:CdYcnHVthKc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2DKAznXYxe0:CdYcnHVthKc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2DKAznXYxe0:CdYcnHVthKc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2DKAznXYxe0:CdYcnHVthKc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2DKAznXYxe0:CdYcnHVthKc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2DKAznXYxe0:CdYcnHVthKc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/2DKAznXYxe0" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/linux">Linux</category>
 <category domain="http://www.nerdliness.com/category/mysql">MySQL</category>
 <category domain="http://www.nerdliness.com/category/postgresql">PostgreSQL</category>
 <pubDate>Thu, 12 Mar 2009 17:22:00 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">65 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2009/03/12/open-source-bridge-proposal-deadline-coming</feedburner:origLink></item>
<item>
 <title>Upgrading from Drupal 5.x to Acquia Drupal 1.0.3-ISR</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/6X2SCju8x3o/upgrading-drupal-5x-acquia-drupal-103isr</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;div class="content"&gt;
&lt;div class="field field-type-text field-field-article-body"&gt;
&lt;div class="field-items"&gt;
&lt;div class="field-item odd"&gt;
&lt;p&gt;My God, we've been behind the 8 ball.&lt;/p&gt;
&lt;p&gt;Seriously, did you realize that there have been something like 1.8 million Drupal releases since we last upgraded? Here we are sitting on Drupal 5.2 when the rest of the world is runnin' 6.6. Clearly, time to upgrade.&lt;/p&gt;
&lt;p&gt;This afternoon, we decided to jump from Drupal 5.2 to &lt;a target="_blank" href="http://acquia.com/"&gt;Acquia Drupal&lt;/a&gt;, and this here article is the first of two that will document the process.&lt;/p&gt;
&lt;p&gt;In this post, we're just talking about the actual Drupal upgrade process. No coding, no theming. Just updating Drupal to a version created in the last, oh, decade or so. Later, &lt;a target="_blank" href="../../../../../../user/jeremy"&gt;Jeremy&lt;/a&gt; will tackle updating your 5.x themes to work with 6.x.&lt;/p&gt;
&lt;p&gt;Ok, so first thing's first.  Before you do squat, there are a couple of files you'll want read.&lt;/p&gt;
&lt;p&gt;First, check out the UPGRADE.txt file in your root Drupal directory. That bad boy is the Bible of your upgrade process, and you should have a pretty good idea of what's in there before you get going.&lt;/p&gt;
&lt;p&gt;Likewise, if you're installing the Acquia flavor, get familiar with the&lt;br /&gt;
&lt;a target="_blank" href="https://acquia.com/files/downloads/acquia_getting_started_1-0_ISR_02.pdf"&gt;Acquia Getting Started with Acquia Drupal&lt;/a&gt; doc.&lt;/p&gt;
&lt;p&gt;There are steps in there that aren't covered by a normal Drupal upgrade and, while this here post will talk about some of them, your own installation and upgrade experience could be drastically different. This post is just a supplement and, frankly, might not apply to certain installations.&lt;/p&gt;
&lt;p&gt;We're also going a slightly different route in our migration. For instance, we're skipping the &amp;quot;&lt;strong&gt;Place the site in 'Off-line' mode&lt;/strong&gt;&amp;quot; step because we're doing a copy-upgrade-rename thing rather than upgrading the live version of the site in place. That works for us, since we're a low traffic site and our comments are few and far between. You popular kids (God, I hate you guys...) might be better served putting the live site in &lt;strong&gt;Off-Line&lt;/strong&gt; mode anyway, just so you don't lose any comments made while you're fiddling around with the copy.&lt;/p&gt;
&lt;p&gt;Oh, and before you even start, make sure that there are 6.x versions of any modules you're using before you get too far into this. Wouldn't it suck to update your page only to find out that your favorite, my-site-depends-on-it module doesn't have a 6.x flavor? Yeah. It would.&lt;/p&gt;
&lt;p&gt;So, without further ado, let's get rollin'.&lt;/p&gt;
&lt;p&gt;Like I mentioned, we aren't going to just update our site in place. Frankly, the idea scares me. Instead, we're going to make a copy of our site and database and update that. After we've finished, we'll swap the copied-and-updated site for the live one, then crack open a cold one to toast our success.&lt;/p&gt;
&lt;p&gt;And here's how we do it:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Make a copy of current Drupal install directory.&lt;/li&gt;
&lt;/ol&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cp -R &amp;lt;drupal directory&amp;gt; &amp;lt;copy directory&amp;gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
2.&amp;nbsp;&amp;nbsp; Make a copy of the database for the upgrade.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; Easy as pie:
&lt;ul&gt;
    &lt;li&gt;Create a new database using whatever means you normally would.&amp;nbsp; My provider has a little control panel tool I use.&amp;nbsp; Maybe you do it from the command line, maybe you use phpMyAdmin.&amp;nbsp; Whatever.&amp;nbsp; Just create a blank database.&lt;/li&gt;
    &lt;li&gt;Create a new MySQL user and give it the necessary rights to the new database.&amp;nbsp; Or grant those priveleges to your old user.&amp;nbsp; Whatever makes you happy (I went with Option B, just because I like to minimize the number of users I have to manage.&amp;nbsp; Up to you.)&amp;nbsp;&lt;/li&gt;
    &lt;li&gt;Export the data from your live database.&amp;nbsp; I used phpMyAdmin for this.&amp;nbsp; Just logon and click the Export button.&amp;nbsp; Select your database and choose the SQL format.&amp;nbsp; I left all the other options at their default values.&lt;/li&gt;
    &lt;li&gt;Modify the export file to point to the new database.&amp;nbsp; In my case, I changed the &amp;quot;USE&amp;quot; statement on line 22 of my dump to point to the new file.&amp;nbsp; I also deleted the &amp;quot;CREATE DATABASE&amp;quot; line because my host makes me use their aforementioned tool for the process.&amp;nbsp; Your mileage may vary.&lt;/li&gt;
    &lt;li&gt;Import the data file.&amp;nbsp; With phpMyAdmin, you just click the Import tab, browse to the file you want to import (the one you just exported/modified) and click Go.&amp;nbsp; Done.&lt;br /&gt;
    &lt;br /&gt;
    &amp;nbsp;&amp;nbsp; &amp;nbsp;That's it.&amp;nbsp; You should now have a copy of your DB.&amp;nbsp; Of course, there are other methods.&amp;nbsp; Feel free to share your fav in the comments.&lt;br /&gt;
    &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;3. Update the &lt;strong&gt;settings.php&lt;/strong&gt; file in the new directory to point to the new database.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;IMPORTANT&lt;/strong&gt;.&amp;nbsp; If you don't go to your &lt;strong&gt;settings.php&lt;/strong&gt; file (&lt;strong&gt;/sites/default/settings.php&lt;/strong&gt;) and edit the &lt;strong&gt;$db_url&lt;/strong&gt; line, any changes you make from this point forward will happen on your live database.&amp;nbsp; That could be very, very bad if things blow up on you.&amp;nbsp; Edit that &lt;strong&gt;$db_url&lt;/strong&gt; line to point to the new database name you created in the last step.&amp;nbsp; If you created a new user, change that, too.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
4.&amp;nbsp; Confirm that you're using the new database, etc. &amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Ok, I'm anal about this kind of thing.&amp;nbsp; I want to be 100% certain I'm about to jack with my copy rather than the real site.&amp;nbsp; In my case, I created a new subdomain that points to the new directory, so when I browse to &amp;quot;&lt;strong&gt;http://nerdtest.nerdliness.com&lt;/strong&gt;,&amp;quot; Apache serves up the files in my &lt;strong&gt;./nerdtest&lt;/strong&gt; directory instead of my original &lt;strong&gt;./nerdliness&lt;/strong&gt; one.&amp;nbsp; Make sense?&lt;br /&gt;
&lt;br /&gt;
How you do this will depend on your host.&amp;nbsp; In my case, I get a handy little control panel with a &amp;quot;create subdomain&amp;quot; link that takes care of the Apache and DNS changes.&amp;nbsp; If you're hosting yourself, you might have to make your own &lt;strong&gt;httpd.conf&lt;/strong&gt; and DNS record changes.&amp;nbsp; Or if you have another host, you'll need to check with them.&amp;nbsp; Sorry, but there are as many different steps for this part as there are hosting providers.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Anyway.&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
After creating the subdomain, browse to your site copy and make a small change.&amp;nbsp; Maybe leave yourself a comment or make a test post.&amp;nbsp; Whatever you do, make sure it only appears on the subdomain and not on the original.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.&amp;nbsp; Get your modules in order.&lt;br /&gt;
Ok, we've been bad.&amp;nbsp; We had a ton of modules chillin' in our &lt;strong&gt;/modules&lt;/strong&gt; directory instead of in the &lt;strong&gt;/sites/all/modules&lt;/strong&gt; 'hood where they belong.&amp;nbsp; The longest part of this process involved moving those user contributed, third party modules into their correct location.&lt;br /&gt;
&lt;br /&gt;
The Acquia guide has a good list of core Drupal modules that need to stay in the &lt;strong&gt;/modules&lt;/strong&gt; directory, but it isn't all-inclusive.&amp;nbsp; Before you start moving all the modules from &lt;strong&gt;/modules&lt;/strong&gt; to &lt;strong&gt;/sites/all/modules&lt;/strong&gt;, make sure you're moving the right ones.&amp;nbsp; Check out the docs online for the full list.&amp;nbsp; In my case, I just had one window opened to my Drupal Admin page and made sure I didn't touch any modules that were listed under the Core - Required or Core - Optional headings.&lt;br /&gt;
&lt;br /&gt;
Make sure you check out your site after making all thes moves, just to be safe.&amp;nbsp; Would hate to try to update after you've already moved out some core module that you shouldn't have touched only to find that nothing works right.&lt;br /&gt;
&lt;br /&gt;
6.&amp;nbsp; More module maintenance...&lt;br /&gt;
Acquia includes fancy-pants versions of some important modules, so you need to 86 any versions you have installed already before you do The Upgrade.&amp;nbsp; Make sure you deactive and remove them before you continue.&amp;nbsp; There's a full list of modules in the Acquia Getting Started guide, starting on Page 24, and it includes stuff you're almost certainly using (CCK, anyone? How 'bout Views?)&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Note&lt;/strong&gt;:&amp;nbsp; there's a special case around the Printer-Friendly Pages and Filefield Meta modules. Didn't apply to us, might apply to you.&amp;nbsp; Make sure you RTFAcquiaGettingStartedGuide, page 25 (&amp;quot;Special Cases:&amp;nbsp; Printer-Friendly Pages Module and Filefield Meta Module&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7.&amp;nbsp; Download/unpack the Acquia Drupal goods.&lt;br /&gt;
Browse to &lt;a href="http://acquia.com/downloads" target="_blank"&gt;http://acquia.com/downloads&lt;/a&gt; and download the current &amp;quot;&lt;strong&gt;Update Existing&lt;/strong&gt;&amp;quot; version.&amp;nbsp; Copy that bad boy over to your web server and untar it.&lt;br /&gt;
&lt;br /&gt;
8.&amp;nbsp; Update!&lt;br /&gt;
Now the real fun starts.&lt;br /&gt;
&lt;br /&gt;
First, since we downloaded the &amp;quot;&lt;strong&gt;Update Existing&lt;/strong&gt;&amp;quot; version of Acquia, the directory created when we untarred that file is missing some key elements from our actual site.&amp;nbsp; We need to copy those over before we do anything else.&amp;nbsp; Basically, we need to copy our &lt;strong&gt;.htaccess&lt;/strong&gt; and &lt;strong&gt;robots.txt&lt;/strong&gt; files, our entire sites directory (and its contents), as well as any other customized files that live outside those folders.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;cp &amp;lt;copy directory&amp;gt;/.htaccess &amp;lt;acquia directory&amp;gt;/&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cp &amp;lt;&lt;/strong&gt;&lt;strong&gt;copy directory&lt;/strong&gt;&lt;strong&gt;&amp;gt;/robots.txt &amp;lt;acquia directory&amp;gt;/&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;cp -R &amp;lt;&lt;/strong&gt;&lt;strong&gt;copy directory&lt;/strong&gt;&lt;strong&gt;&amp;gt;/sites &amp;lt;acquia directory&amp;gt;/&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
9.&amp;nbsp; Rename your directories&lt;br /&gt;
Now that our customized files are in the Acquia untar directory, we just need to rename our copy directory to something new, then rename the Acquia directory to the same name our copy directory used to have.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Good God, that doesn't make much sense, does it?&lt;br /&gt;
&lt;br /&gt;
Ok, so say we untarred the Acquia files to a directory called &amp;quot;&lt;strong&gt;acquia&lt;/strong&gt;,&amp;quot; and our old working Drupal directory was &amp;quot;&lt;strong&gt;nerdtest&lt;/strong&gt;.&amp;quot;&amp;nbsp; Now, we're going to rename &amp;quot;&lt;strong&gt;nerdtest&lt;/strong&gt;&amp;quot; something like &amp;quot;&lt;strong&gt;old_nerdtest&lt;/strong&gt;,&amp;quot; then rename &amp;quot;&lt;strong&gt;acquia&lt;/strong&gt;&amp;quot; to &amp;quot;&lt;strong&gt;nerdtest&lt;/strong&gt;.&amp;quot;&amp;nbsp; Got it?&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mv &amp;lt;&lt;/strong&gt;&lt;strong&gt;copy directory&lt;/strong&gt;&lt;strong&gt;&amp;gt; &amp;lt;new name for &lt;/strong&gt;&lt;strong&gt;copy directory&lt;/strong&gt;&lt;strong&gt;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;mv &amp;lt;acquia directory&amp;gt; &amp;lt;&lt;/strong&gt;&lt;strong&gt;copy directory&lt;/strong&gt;&lt;strong&gt;&amp;gt;&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
10.&amp;nbsp; Run the &lt;strong&gt;update.php&lt;/strong&gt; file&lt;br /&gt;
Just browse to the &lt;strong&gt;/update.php&lt;/strong&gt; file on your site and do what it says.&lt;br /&gt;
&lt;br /&gt;
11.&amp;nbsp; Pray.&lt;br /&gt;
&lt;br /&gt;
12.&amp;nbsp; Check for errors&lt;br /&gt;
You should get a progress report immediately after the update that mentions any specific errors.&amp;nbsp; Also check the &lt;strong&gt;Status Report&lt;/strong&gt; page (&lt;strong&gt;/admin/reports/status&lt;/strong&gt;).&amp;nbsp; Make sure you follow any advice given on this update results page.&lt;br /&gt;
&lt;br /&gt;
In our case, we had a couple issues.&amp;nbsp; First, the &lt;strong&gt;Status Report&lt;/strong&gt; mentioned that the &amp;quot;&lt;strong&gt;files&lt;/strong&gt;&amp;quot; directory didn't exist.&amp;nbsp; Sure enough, we'd forgotten to copy that over from our previous install back in step 8.&amp;nbsp; Easily fixed with a little &amp;quot;&lt;strong&gt;cp -R &amp;lt;new name for copy directory&amp;gt;/files &amp;lt;copy directory&amp;gt;&lt;/strong&gt;&amp;quot; action.&lt;br /&gt;
&lt;br /&gt;
Second, we noticed this blurb:&lt;br /&gt;
&lt;/p&gt;
&lt;blockquote&gt; Updates for CCK-related modules are not run until the modules are enabled on the administer modules page. When you enable them, you'll need to return to update.php and run the remaining updates. &lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
Piece of cake.&amp;nbsp; All we had to do at that point was go into the &lt;strong&gt;Administer Modules&lt;/strong&gt; page, enable those CCK modules, then rerun the &lt;strong&gt;/update.php&lt;/strong&gt; script.&amp;nbsp; No problems.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
13.&amp;nbsp; Update and reactivate modules&lt;br /&gt;
You'll probably find that several modules you used with 5.x have big red X's next to them in the Admin page now.&amp;nbsp; Yeah.&amp;nbsp; Sucks, huh?&amp;nbsp; Probably should have checked for newer versions of those modules ahead of time, right?&amp;nbsp; Like we warned you about before you even started?&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Anyway, now's the time to download and install those newer versions.&amp;nbsp; You know how.&amp;nbsp; And this time, remember to put them in &lt;strong&gt;/sites/all/modules&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
15.&amp;nbsp; Bring the site &amp;quot;On-Line&amp;quot;&lt;br /&gt;
We didn't put ours in Off-Line mode, but if YOU did, make sure you bring it back up.&lt;br /&gt;
&lt;br /&gt;
16.&amp;nbsp; Test.&lt;br /&gt;
Browse around, check everything out.&amp;nbsp; If it all looks good, fantastic!&amp;nbsp; If not, well...&amp;nbsp; Can't really help you there.&amp;nbsp; Our's went just fine.&amp;nbsp; :)&lt;/p&gt;
&lt;p&gt;Ok, maybe &amp;quot;fine&amp;quot;&amp;nbsp;is a bit too...&amp;nbsp; um... Pollyanna of a word.  We had some issues with some permissions (anonymous users couldn't see content for some reason) and formatting (former header/footer blocks ended up in the sidebar), etc.&amp;nbsp; But all of those were things that were pretty easy fixes.&amp;nbsp; Nothing major.&lt;br /&gt;
&lt;br /&gt;
If YOU&amp;nbsp;have something major come up though, leave comments.&amp;nbsp; We (or someone reading this) might be able to help.&lt;br /&gt;
&lt;br /&gt;
17.&amp;nbsp; Go live!&lt;br /&gt;
If everything looks good, it's time to bring it live.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Remember that we did this with a copy of the site, so we need to change a couple directory names.&amp;nbsp; It's really the same exact process as in step 9, just with different directories:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mv &amp;lt;drupal directory&amp;gt; &amp;lt;some other name&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;mv &amp;lt;copy directory&amp;gt; &amp;lt;drupal directory&amp;gt;&lt;/strong&gt;&lt;br /&gt;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Also, if you put yours in Maintenance Mode, remember to disable that.&lt;/p&gt;
&lt;p&gt;And that's pretty much it.&amp;nbsp; Really not too difficult.&amp;nbsp; I'm sure we'll continue to find little pieces here and there that need some massaging every now and then, but overall the process was relatively painless.&lt;/p&gt;
&lt;p&gt;Now if we could just get Jeremy to update our old theme...&amp;nbsp; Not like he's got a full time job and a newborn daughter keeping him busy or anything...&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2a-HkGOAUd5LkdQCg2LGdbXFzLA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2a-HkGOAUd5LkdQCg2LGdbXFzLA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2a-HkGOAUd5LkdQCg2LGdbXFzLA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2a-HkGOAUd5LkdQCg2LGdbXFzLA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6X2SCju8x3o:QwokziF2GUU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6X2SCju8x3o:QwokziF2GUU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6X2SCju8x3o:QwokziF2GUU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6X2SCju8x3o:QwokziF2GUU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6X2SCju8x3o:QwokziF2GUU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6X2SCju8x3o:QwokziF2GUU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6X2SCju8x3o:QwokziF2GUU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6X2SCju8x3o:QwokziF2GUU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6X2SCju8x3o:QwokziF2GUU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6X2SCju8x3o:QwokziF2GUU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/6X2SCju8x3o" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/linux">Linux</category>
 <category domain="http://www.nerdliness.com/category/mysql">MySQL</category>
 <pubDate>Wed, 26 Nov 2008 21:33:06 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">64 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/11/26/upgrading-drupal-5x-acquia-drupal-103isr</feedburner:origLink></item>
<item>
 <title>Because Network Solutions Sucks</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/RBykT9cOdSA/because-network-solutions-sucks</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;One man's frustration is not lost in vain.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;The Drupal community, and open-source community at that, has always had the altruistic goal of being accessible to all. The hope is that as freelancers and tech gurus go out into the world, maybe we can help by making better, more secure websites.

And then you have piece-of-crap hosting like that of Network Solutions.

Now, I only bring this up because as I work with clients to get their internet presence setup, sometimes you're stuck working with their choice of hosting provider, hosting package, and admin credentials.

This means crazy php.ini setups, no ssh access (because the cheap plans don't enable this), and passwords like '1234myfirstname'. Never the eternal pessimist, I figured I'd leave a few words of encouragement and one small tip to those that run into this.

First, don't give up. Although you can't convince your client to pay you monthly hosting fees on &lt;em&gt;your&lt;/em&gt; leased vps (who hasn't tried that?), continue to make their internet presence more than a site built by iPowerweb. Yeah, you may have to wrestle with a table-filled layout, but a little progress is better than no progress.

Second, scour the drupal forums for a solution. Sometimes it may take a couple of days, but it seems like everytime I run into a roadblock, someone else has as well. A forked, non-hacked core, Drupal install on a POS hosting provider is STILL better than an MS Access-driven site hosted by 1and1. :-)

Third...if you're on Network Solutions, and get the dreaded email of 'we will not turn off register_globals or magic_quotes_gpc because it would affect other shared hosted sites', take a deep breath, laugh at them uncontrollably, blog about it, then put this piece of code in the &lt;strong&gt;cgi-bin&lt;/strong&gt; of your vhost within a text file called 'php.ini':

&lt;code&gt;register_globals = off
magic_quotes_gpc = off&lt;/code&gt;

Yeah, this whole blog post was all about solving the Drupal install message of 'TURN THIS CRAP OFF', but I figured the it was better suited for the community to at least know I didn't give up! Why it ignores this directive in .htaccess or the ini_set() in the settings.php is beyond me, but....it does work.

Thanks go to &lt;a href="http://drupal.org/node/210311"&gt;this forum post&lt;/a&gt;, btw.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tx3SBk3lT3RuPuyDjrT28aHMdD8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tx3SBk3lT3RuPuyDjrT28aHMdD8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/tx3SBk3lT3RuPuyDjrT28aHMdD8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tx3SBk3lT3RuPuyDjrT28aHMdD8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RBykT9cOdSA:Oc64x9oowHM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RBykT9cOdSA:Oc64x9oowHM:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RBykT9cOdSA:Oc64x9oowHM:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RBykT9cOdSA:Oc64x9oowHM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RBykT9cOdSA:Oc64x9oowHM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RBykT9cOdSA:Oc64x9oowHM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RBykT9cOdSA:Oc64x9oowHM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RBykT9cOdSA:Oc64x9oowHM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=RBykT9cOdSA:Oc64x9oowHM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=RBykT9cOdSA:Oc64x9oowHM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/RBykT9cOdSA" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/php">PHP</category>
 <category domain="http://www.nerdliness.com/category/wtf">WTF</category>
 <pubDate>Tue, 29 Jul 2008 21:38:58 +0000</pubDate>
 <dc:creator>fredric</dc:creator>
 <guid isPermaLink="false">63 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/07/29/because-network-solutions-sucks</feedburner:origLink></item>
<item>
 <title>jQuery fun with lists and more lists</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/g5Q6pJmv_HE/jquery-fun-lists-and-more-lists</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;jQuery - So simple even a designer can do it!&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;This week I had the task of taking a rather long and complicated list and shortening it down into categories with sub lists. &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; seemed like the best way to go as I've seen &lt;a href="http://www.webdesignerwall.com/demo/jquery/accordion1.html"&gt;accordion style&lt;/a&gt; sliding list and things of that sort before. The only thing I hadn't come across was a list with a drop down menu which controlled the list and content below...so I set out to build one as well as teach myself some jQuery (I knew what it was, just never wrote my own jQuery code before).

So the idea here was I wanted a list to appear on the right side of my div which contained categories in which I could click on and have the content on the page, in lists, expand to show the selected list all while sliding away the previously displayed list.

This screenshot/mockup will help better explain the desired look and feel as well as functionality I was going for.

&lt;div align="center"&gt;&lt;img src="/files/idea.jpg" alt="idea"/&gt;&lt;/div&gt;

Sounds quite tricky but after a bit of messing around with some basic jQuery code and functionality I was able to get everything working somewhat well.

I first started out by building the header area with the "MOST RECENT" list and "SORT BY CATEGORY" text. I made it so when you click on the "MOST RECENT" link it would drop down a menu with the category listings. These category listings control what is shown on the page, it controls what list will appear when you click on your desired category.

So once I got the header portion built, I then begin making a list wrapped in custom divs for each of the category lists' content. Being that I have five categories I had to make 5 custom wrapped divs. For these divs were controlled by the category drop down list on right.

Now that I had my header portion and my category lists it was time to add some CSS to hide these lists until jQuery told them to show themselves. When the page loads I wanted one list to appear, the "MOST RECENT" list, so I didn't hide that list in CSS so it would display right away. I hid the other lists but not the first one.

&lt;code&gt;
#list-item2.sortlist,
#list-item3.sortlist,
#list-item4.sortlist,
#list-item5.sortlist {
	display: none;	
}
&lt;/code&gt;

Now that the lists were hiding through CSS it was time to make them show by using jQuery. But first I needed to make the category drop down list actual function. So when the user clicks on the text for "MOST RECENT" it is to drop down and reveal categories which are also clickable and that changes the list which is displayed to the user.

Here is the magic jQeury code for that:
&lt;code&gt;
$("#sort").click(function(){
	$("#sort-options").slideToggle("slow");
	$(this).toggleClass("active"); return false;
});
&lt;/code&gt;

What that says is when you click on the div "sort" it will expand or contract the div "sort-options" and give it a class of "active" or none. Of course these div names and id's are all specified in my HTML, so they actually relate to a working div.

The "active" class here is what allows me to change the red arrow pointing down to a red arrow pointing up. So "active" shows an arrow pointing down and no class shows an arrow pointing up.

Since the drop down category menu is working correctly it's now time to make the category options/links actually do something.

Here is yet more magic jQuery code to do just that:
&lt;code&gt;
$("#sort_item1").click(function(event) {
event.preventDefault();
	$("#sort-options").slideToggle();
	$("#list-item1").slideDown();
	$("#list-item2").slideUp();
	$("#list-item3").slideUp();
	$("#list-item4").slideUp();
	$("#list-item5").slideUp();
	$("#sort em").empty();	
	$("#sort em").append("Most Recent");	
	$("#sort").toggleClass("active"); return false;
});
&lt;/code&gt;

What's going on here is if the user clicks on the "a href id" of "sort_item1", which in this case is "MOST RECENT", all lists wrapped in the appropriate divs are to slide up and collapse/disappear and the text in the top portion of the category area (next to the red arrow) is to be removed and replaced with the text "MOST RECENT".

The stripping of text and adding is done by these two lines of code:
&lt;code&gt;
	$("#sort em").empty();	
	$("#sort em").append("Most Recent");	
&lt;/code&gt;

Pretty neat isn't it. You can take out text and replace it based on what the user clicks on in the category list. I took this chunk of code about and copied/pasted it for each category and changed which lists were to slide up and down and which text was to be replaced with what. 

Be sure to &lt;a href="http://nerdliness.com/files/jquerylist/index.html"&gt;check out a working example&lt;/a&gt; of what I was trying to explain above. I'm sure that if you view it in action and read/re-read my post it will make more sense. It took me a little time to really understand what all was going on with each click but once I got things in order it all seemed to fall into place and be more understandable.

All of this &lt;a href="http://nerdliness.com/files/jquerylist/jquerylist.zip"&gt;code is available for download&lt;/a&gt; so you can mess with it and use it anywhere you'd like. I included all of the HTML/CSS/jQuery code/images as well so those can also be used anywhere else as well.

I'm sure there are better ways to go about this but this is what I was able to come up with and understand. It works in all browsers I have tested it in too such as IE6, IE7, FireFox (Mac and PC) and Safari. Of course there are some IE specific CSS code to make some text and boxes align correctly, but that's just about the norm anyways.

I've just scratched the surface as to what jQuery is capable of and I can't wait to see what else it can do. This is just a pretty effect which simplifies the use of categories and lists, jQuery can handle much more complex code and situations that this, so I plan on  continuing to learn more about it in hopes of applying it to my future projects.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8F-FU77I09rjaUwyhfZNafVdtMs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8F-FU77I09rjaUwyhfZNafVdtMs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8F-FU77I09rjaUwyhfZNafVdtMs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8F-FU77I09rjaUwyhfZNafVdtMs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=g5Q6pJmv_HE:0aRHvhLIINQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=g5Q6pJmv_HE:0aRHvhLIINQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=g5Q6pJmv_HE:0aRHvhLIINQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=g5Q6pJmv_HE:0aRHvhLIINQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=g5Q6pJmv_HE:0aRHvhLIINQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=g5Q6pJmv_HE:0aRHvhLIINQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=g5Q6pJmv_HE:0aRHvhLIINQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=g5Q6pJmv_HE:0aRHvhLIINQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=g5Q6pJmv_HE:0aRHvhLIINQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=g5Q6pJmv_HE:0aRHvhLIINQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/g5Q6pJmv_HE" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/x-html-0">(X)HTML</category>
 <category domain="http://www.nerdliness.com/category/css-0">CSS</category>
 <category domain="http://www.nerdliness.com/category/advice">General Advice</category>
 <category domain="http://www.nerdliness.com/category/jquery">jQuery</category>
 <pubDate>Sat, 22 Mar 2008 07:23:00 +0000</pubDate>
 <dc:creator>jeremy</dc:creator>
 <guid isPermaLink="false">60 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/03/22/jquery-fun-lists-and-more-lists</feedburner:origLink></item>
<item>
 <title>Using ASP.NET AJAX CascadingDropDown with Visual Basic and a Database</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/AYGG8NxjkHU/using-asp-net-ajax-cascadingdropdown-visual-basic-and-database</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;This morning, I had the chance to play around with another ASP.NET AJAX control:&amp;nbsp; the &lt;strong&gt;CascadingDropDown &lt;/strong&gt;control.&amp;nbsp; Like the name implies, it's a nifty little AJAX-enabled control that dynamically enables and populates a &lt;strong&gt;DropDownList &lt;/strong&gt;based on the value selected in a previous list.&amp;nbsp; Kinda like the coding version of those old skool &amp;quot;Choose Your Own Adventure&amp;quot; books.&lt;br /&gt;
&lt;br /&gt;
You've seen this kind of thing in action plenty of times, I'm sure.&amp;nbsp; Remember the last time you filled out a registration form that had you pick a country, then you suddenly had a &amp;quot;State/Province&amp;quot; list that only included regions within that country?&amp;nbsp; Well, this is Microsoft's implementation.&amp;nbsp; Check it out:&amp;nbsp; &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CascadingDropDown/CascadingDropDown.aspx" target="_blank"&gt;http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CascadingDropDown/CascadingDropDown.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
As with most of the ASP.NET AJAX stuff, there's also a great &amp;quot;How Do I...&amp;quot; video (&lt;a href="http://www.asp.net/learn/ajax-videos/video-77.aspx" target="_blank"&gt;http://www.asp.net/learn/ajax-videos/video-77.aspx&lt;/a&gt;) from Joe Stagner (&lt;a href="http://www.joeon.net" target="_blank"&gt;http://www.joeon.net&lt;/a&gt;).&amp;nbsp; Thing is, though, that the video uses an XML file for its data source.&amp;nbsp; Not real helpful for me, seeing that my data was coming from an actual SQL database.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The sample website has another page that claims to show how to use the CascadingDropDown with a database backend (&lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Walkthrough/CCDWithDB.aspx" target="_blank"&gt;http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Walkthrough/CCDWithDB.aspx&lt;/a&gt;), but I frankly find it wanting.&amp;nbsp; First of all, it's not really a &amp;quot;tutorial&amp;quot; in the sense that it doesn't really walk you through how to do what I wanted to do step-by-step.&amp;nbsp; It assumes you know what you're doing to a certain extent, an assumption which we here at Nerdliness.com have proven time and time again can be fatal.&lt;br /&gt;
&lt;br /&gt;
The second problem with it is that the sample uses C#, with no Visual Basic equivalent.&amp;nbsp; Now, I'm not a real developer.&amp;nbsp; I don't even play one on TV.&amp;nbsp; Hell, I'd be lucky to be the dude they bring in to double for the developer-on-TV when they need to adjust the lighting and all that.&amp;nbsp; Sure, maybe I could be the key grip on the developer show but...&amp;nbsp; Ok, you get the point.&amp;nbsp; I'm sticking with VB.NET.&lt;br /&gt;
&lt;br /&gt;
So let's show the newbs how it's done.&amp;nbsp; We're going to create three &lt;strong&gt;DropDownLists &lt;/strong&gt;and, using the &lt;strong&gt;CascadingDropDown &lt;/strong&gt;control, populate the second list based on what was selected in the first, and the third based on what's selected in the second.&lt;br /&gt;
&lt;br /&gt;
In this example, we're asking people to pick their favorite NBA player (for you hardcore nerdlings, the &amp;quot;NBA&amp;quot; is the National Basketball Association...&amp;nbsp; you know, that sport with all the really tall guys throwing a ball into a hoop).&amp;nbsp; In the first &lt;strong&gt;DropDownList&lt;/strong&gt;, we'll ask them to pick the conference (Eastern or Western).&amp;nbsp; The second &lt;strong&gt;DropDownList &lt;/strong&gt;will be populated with teams in that conference.&amp;nbsp; Once they pick a team, they'll be able to choose from a couple of players on that team using the third &lt;strong&gt;DropDownList&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
The data will be stored in three tables called, amazingly enough, CONFERENCE, TEAM, and PLAYER.&amp;nbsp; This E-R diagram should give you an idea of what those relationships look like:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img vspace="5" hspace="5" border="1" align="middle" alt="" src="/userfiles/image/images/ccdsample/nerd_schema.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As for the data in each, well, I'm lazy, so I'm not going to include all the teams and all the players.&amp;nbsp; Just a representative example to show how it works (see attached for a dump of the tables).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;table width="430" cellspacing="1" cellpadding="1" border="0" align="center"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td align="left"&gt;&lt;strong&gt;CONFERENCE&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;&lt;strong&gt;PLAYER&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Eastern&lt;/td&gt;
            &lt;td&gt;Lamarcus Aldridge&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Western&lt;/td&gt;
            &lt;td&gt;Carlos Boozer&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
            &lt;td&gt;Kobe Bryant&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;TEAM&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;Tim Duncan&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Boston Celtics&lt;/td&gt;
            &lt;td&gt;Kevin Garnett&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Detroit Pistons&lt;/td&gt;
            &lt;td&gt;Pau Gasol&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Los Angeles Lakers&lt;/td&gt;
            &lt;td&gt;Manu Ginobili&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Orlando Magic&lt;/td&gt;
            &lt;td&gt;Dwight Howard&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Phoenix Suns&lt;/td&gt;
            &lt;td&gt;Steve Nash&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Portland Trailblazers&lt;/td&gt;
            &lt;td&gt;Shaq&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;San Antonio Spurs&lt;/td&gt;
            &lt;td&gt;Paul Pierce&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;Utah Jazz&lt;/td&gt;
            &lt;td&gt;Tayshaun Prince&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
            &lt;td&gt;Brandon Roy&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
            &lt;td&gt;Hedo Turkoglu&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
            &lt;td&gt;Rasheed Wallace&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;&amp;nbsp;&lt;/td&gt;
            &lt;td&gt;Deron Williams&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;(Sure, it's West-heavy.&amp;nbsp; But is it my fault that's where all the talent is?)&lt;br /&gt;
&lt;br /&gt;
That's all stored in a local SQL Server 2005 Express instance, but that doesn't really matter.&amp;nbsp; You could be pulling it from SQL 2000, Oracle, MySQL, etc., just as long as you configure the connection in your web service appropriately.&amp;nbsp; Obviously, I can't really tell you how your connection will look, not knowing anything about your setup.&lt;br /&gt;
&lt;br /&gt;
Finally, a last assumption...&amp;nbsp; I'm using Visual Studio 2008 for this example, but from what I've seen I don't think there's much difference between it and previous versions (as far as this example is concerned, that is).&amp;nbsp; If you're using a previous version, make sure you've gone through all the getting-ready-to-use-ASP.NET-AJAX stuff in videos 1 and 2 here:&amp;nbsp; &lt;a href="http://www.asp.net/learn/ajax-videos/" target="_blank"&gt;http://www.asp.net/learn/ajax-videos/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Let's get to it.&amp;nbsp;&amp;nbsp; First, I have a simple &lt;strong&gt;default.aspx&lt;/strong&gt; file with the aforementioned &lt;strong&gt;DropDownLists&lt;/strong&gt;.&amp;nbsp; Then, I've added one &lt;strong&gt;CascadingDropDown &lt;/strong&gt;control for each of the &lt;strong&gt;DropDownLists &lt;/strong&gt;in our little group.&amp;nbsp; Of course, all that's in addition to the stuff we need to make ASP.NET AJAX work at all (registering the AjaxControlTookit assembly at the top, and adding a ScriptManager control).&lt;br /&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;blockcode type="asp"&gt;
&lt;%@ Page Language="VB" AutoEventWireup="false" EnableEventValidation="false" CodeFile="Default.aspx.vb" Inherits="_Default" %&gt;

&lt;%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;
&lt;head runat="server"&gt;
    &lt;title&gt;Nerdliness.com CCD Visual Basic Test&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;        
    
    &lt;form id="form1" runat="server"&gt;
    &lt;asp:ScriptManager ID="ScriptManager1" runat="server"&gt;&lt;/asp:ScriptManager&gt;
    &lt;div&gt;
                
        Conference:  &lt;asp:DropDownList ID="ddlConference" runat="server" /&gt;&lt;br /&gt;
        Team:  &lt;asp:DropDownList ID="ddlTeam" runat="server" /&gt;&lt;br /&gt;
        Player:  &lt;asp:DropDownList ID="ddlPlayer" runat="server" /&gt;&lt;br /&gt;
                
        &lt;cc1:CascadingDropDown 
            id="CascadingDropDown1" 
            runat="server"
            category="Conference"
            prompttext="Select a Conference..."
            ServiceMethod="GetConferences"
            ServicePath="nbaplayers.asmx"
            TargetControlId="ddlConference"
        /&gt;
                
        &lt;cc1:CascadingDropDown 
            id="CascadingDropDown2" 
            runat="server" 
            category="Team"
            prompttext="Select a Team..." 
            ServiceMethod="GetTeams" 
            ServicePath="nbaplayers.asmx"
            TargetControlId="ddlTeam"
            ParentControlID="ddlConference"
        /&gt;
        
        &lt;cc1:CascadingDropDown 
            id="CascadingDropDown3" 
            runat="server" 
            category="Player"
            prompttext="Select a Player..." 
            ServiceMethod="GetPlayers" 
            ServicePath="nbaplayers.asmx"
            TargetControlId="ddlPlayer"
            ParentControlID="ddlTeam"
        /&gt;        
          
    &lt;/div&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;
&lt;/blockcode&gt;
&lt;p&gt;
The properties of the &lt;strong&gt;CascadingDropDown &lt;/strong&gt;controls are all pretty straightforward and you can probably get the idea of what each does just by the name (see &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CascadingDropDown/CascadingDropDown.aspx" target="_blank"&gt;http://www.asp.net/AJAX/AjaxControlToolkit/Samples/CascadingDropDown/CascadingDropDown.aspx&lt;/a&gt; for more detailed info).&amp;nbsp; Only things that really need to be pointed out here are the &lt;strong&gt;TargetControlId &lt;/strong&gt;property (shows the relationship between our &lt;strong&gt;CascadingDropDown &lt;/strong&gt;controls and their matching &lt;strong&gt;DropDownList &lt;/strong&gt;controls), the &lt;strong&gt;ServiceMethod &lt;/strong&gt;property (the method we'll soon create in our web service), and the &lt;strong&gt;ServicePath &lt;/strong&gt;property (the path to our soon-to-be-created web service).&amp;nbsp; Also note the &lt;strong&gt;ParentControlId &lt;/strong&gt;on the last two, pointing to the &lt;strong&gt;DropDownList &lt;/strong&gt;above it in our little heirarchy.&amp;nbsp; Without them, there's no way for our little controls to know how they're related.&lt;br /&gt;
&lt;br /&gt;
One other thing about our .aspx file...&amp;nbsp; According to the ASP.NET AJAX sample site, you need to turn off &lt;strong&gt;EventValidation &lt;/strong&gt;for this whole thing to work:&lt;/p&gt;
&lt;blockquote&gt;Finally, in order for the values to be submitted, EventValidation needs to be disabled for the page. EventValidation ensures that the values in each control match the values that were present when the page was rendered, but since these drop downs are populating on the client side, this is never true. Were hoping to find a way to resolve this issue but please ensure that you understand the potential risks of this and validate the data appropriately in your post back when using this control. &lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
You'll notice I did just that in the &lt;code&gt;&amp;lt;%@ Page %&amp;gt;&lt;/code&gt; directive (&lt;code&gt;EnableEventValidation=&amp;quot;false&amp;quot;&lt;/code&gt;).&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
This whole file is really just our presentation layer.&amp;nbsp; Nothing really interesting happening here.&amp;nbsp; The good stuff goes down inside our web service.&amp;nbsp; It's also where the ASP.NET AJAX sample page gets tricky.&lt;br /&gt;
&lt;br /&gt;
I mentioned before that the sample page (&lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Walkthrough/CCDWithDB.aspx" target="_blank"&gt;http://www.asp.net/AJAX/AjaxControlToolkit/Samples/Walkthrough/CCDWithDB.aspx&lt;/a&gt;) makes a couple of assumptions I didn't like.&amp;nbsp; First, they assume you're using C# and don't include a VB snippet.&amp;nbsp; Bad form, I say.&amp;nbsp; Worse, though, is the fact that they make the assumption that you've already created methods for pulling the data from your database, and they use arbitrary names for methods that don't usually exist through their example:&lt;/p&gt;
&lt;blockquote&gt;So imagine you've got a database with tables for the Make (manufacturer), Model, and Color information, and you're accessing that database through a DataSet to which you've added methods for getting each set of values. &lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
But if you're a newb, or a strict VB dev guy (sure, maybe that's redundant), you might have a hard time making heads or tails out of their code.&amp;nbsp; Trying typing in &lt;code type="vbnet"&gt;Cars.ColorDataTable colorTable = adapter.GetColorsForModel(modelId);&lt;/code&gt; and see what IntelliSense does.&amp;nbsp; Trust me, you'll have lots of colorful squiggly lines and errors in your future.&lt;br /&gt;
&lt;br /&gt;
So here's how we roll at Nerdliness.com.&amp;nbsp; In our web service, we're going to use a &lt;strong&gt;SqlDataReader &lt;/strong&gt;to pull the info we want from the previously defined CONFERENCE, TEAM, and PLAYER tables instead of using a &lt;strong&gt;DataSet &lt;/strong&gt;with methods defined behind the scenes.&amp;nbsp; Frankly, I think this is a bit more straight forward and easier to read, especially for someone new to coding.&lt;br /&gt;
&lt;br /&gt;
And here's the full codebehind file:&lt;br /&gt;

nbaplayers.vb

&lt;blockcode type="vbnet"&gt;
Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Collections
Imports System.Collections.Generic
Imports System.Collections.Specialized
Imports AjaxControlToolkit
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration


' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
&lt;System.Web.Script.Services.ScriptService()&gt; _
&lt;WebService(Namespace:="http://nerdliness.com/")&gt; _
&lt;WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)&gt; _
&lt;Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()&gt; _
Public Class nbaplayers
    Inherits System.Web.Services.WebService

    &lt;WebMethod()&gt; _
    Public Function GetConferences(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
        Dim strConnection As String = ConfigurationManager.ConnectionStrings("nerdlinessConnection").ConnectionString
        Dim sqlConn As SqlConnection = New SqlConnection(strConnection)
        Dim strConfQuery As String = "SELECT * FROM CONFERENCE"
        Dim cmdFetchConf As SqlCommand = New SqlCommand(strConfQuery, sqlConn)

        Dim dtrConf As SqlDataReader
        Dim myConferences As New List(Of CascadingDropDownNameValue)

        sqlConn.Open()
        dtrConf = cmdFetchConf.ExecuteReader

        While dtrConf.Read()
            Dim strConfName As String = dtrConf("conf_name").ToString
            Dim strConfId As String = dtrConf("conf_id").ToString

            myConferences.Add(New CascadingDropDownNameValue(strConfName, strConfId))
        End While

        Return myConferences.ToArray
    End Function

    &lt;WebMethod()&gt; _
    Public Function GetTeams(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
        Dim strConnection As String = ConfigurationManager.ConnectionStrings("nerdlinessConnection").ConnectionString
        Dim sqlConn As SqlConnection = New SqlConnection(strConnection)
        Dim strTeamQuery As String = "SELECT * FROM TEAM WHERE conf_id = @confid"
        Dim cmdFetchTeam As SqlCommand = New SqlCommand(strTeamQuery, sqlConn)

        Dim dtrTeam As SqlDataReader
        Dim kvTeam As StringDictionary = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)

        Dim intConfId As Integer

        If Not kvTeam.ContainsKey("Conference") Or Not Int32.TryParse(kvTeam("Conference"), intConfId) Then
            Return Nothing
        End If

        cmdFetchTeam.Parameters.AddWithValue("@confid", intConfId)
        Dim myTeams As New List(Of CascadingDropDownNameValue)

        sqlConn.Open()
        dtrTeam = cmdFetchTeam.ExecuteReader

        While dtrTeam.Read()
            Dim strTeamName As String = dtrTeam("team_name").ToString
            Dim strTeamId As String = dtrTeam("team_id").ToString

            myTeams.Add(New CascadingDropDownNameValue(strTeamName, strTeamId))
        End While

        Return myTeams.ToArray
    End Function

    &lt;WebMethod()&gt; _
    Public Function GetPlayers(ByVal knownCategoryValues As String, ByVal category As String) As CascadingDropDownNameValue()
        Dim strConnection As String = ConfigurationManager.ConnectionStrings("nerdlinessConnection").ConnectionString
        Dim sqlConn As SqlConnection = New SqlConnection(strConnection)
        Dim strPlayerQuery As String = "SELECT * FROM PLAYER WHERE team_id = @teamid"
        Dim cmdFetchPlayer As SqlCommand = New SqlCommand(strPlayerQuery, sqlConn)

        Dim dtrPlayer As SqlDataReader
        Dim kvPlayer As StringDictionary = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)

        Dim intTeamId As Integer

        If Not kvPlayer.ContainsKey("Team") Or Not Int32.TryParse(kvPlayer("Team"), intTeamId) Then
            Return Nothing
        End If

        cmdFetchPlayer.Parameters.AddWithValue("@teamid", intTeamId)

        Dim myPlayers As New List(Of CascadingDropDownNameValue)

        sqlConn.Open()
        dtrPlayer = cmdFetchPlayer.ExecuteReader

        While dtrPlayer.Read()
            Dim strPlayerName As String = dtrPlayer("player_name").ToString
            Dim strPlayerId As String = dtrPlayer("player_id").ToString

            myPlayers.Add(New CascadingDropDownNameValue(strPlayerName, strPlayerId))
        End While

        Return myPlayers.ToArray
    End Function

End Class
&lt;/blockcode&gt;   Ok, so first thing to note are the different namespaces we imported at the top of the file.&amp;nbsp; Make sure you do the same.&lt;br /&gt;
&lt;br /&gt;
Second, notice that we've uncommented the &amp;quot;&lt;code type="vbnet"&gt;&amp;lt;System.Web.Script.Services.ScriptService()&amp;gt; _&lt;/code&gt;&amp;quot; line.&amp;nbsp; In Visual Studio 2008, that line's already sitting in the new web service when you first add it to your project, but in previous versions you have to add it yourself.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Now the meat of the web service comes in the form of our three WebMethods:&amp;nbsp; &lt;strong&gt;GetConferences&lt;/strong&gt;, &lt;strong&gt;GetTeams&lt;/strong&gt;, and &lt;strong&gt;GetPlayers&lt;/strong&gt;.&amp;nbsp; You might recall those names from the properties of our &lt;strong&gt;CascadingDropDown &lt;/strong&gt;controls in our &lt;strong&gt;default.aspx&lt;/strong&gt; file.&amp;nbsp; These are the methods we're using to gather the data from our tables and send it back to our controls.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The first method, &lt;strong&gt;GetConferences&lt;/strong&gt;, is a little simpler than the other two.&amp;nbsp; Since we're populating that right away and without caring what other &lt;strong&gt;DropDownLists &lt;/strong&gt;contain, we don't need a lot of the logic.&lt;br /&gt;
&lt;br /&gt;
Most of the logic in that method is dedicated to connecting to our database, creating our &lt;strong&gt;DataReader&lt;/strong&gt;, and pulling data.&amp;nbsp; We loop through the results returned by our &amp;quot;&lt;code type="sql"&gt;SELECT * FROM CONFERENCE&lt;/code&gt;&amp;quot; query and, for each line returned, add a line to the &lt;strong&gt;myConferences &lt;/strong&gt;collection.&amp;nbsp; We then convert &lt;strong&gt;myConferences &lt;/strong&gt;to an array and send that result back to our &lt;strong&gt;CascadingDropDown &lt;/strong&gt;control.&lt;br /&gt;
&lt;br /&gt;
The only non-standard issue stuff here involves that &lt;strong&gt;CascadingDropDownNameValue &lt;/strong&gt;bit.&amp;nbsp; Like the sample site says (typo and all):&lt;/p&gt;
&lt;blockquote&gt;Note that the values are returned as an array of CascadaingDropDownNameValue structures. This structure also includes an isDefaultValue boolean field that allows the specification of which value should be selected when the list is first displayed. &lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
So we create a list of &lt;strong&gt;CascadingDropDownNameValue &lt;/strong&gt;pairs in our &lt;strong&gt;WHILE &lt;/strong&gt;loop, then pass that list back to the control.&amp;nbsp; Control takes it, populates our list, then feeds that information into the web method used by the next &lt;strong&gt;DropDownList &lt;/strong&gt;in our chain whenever you select a value.&amp;nbsp; Pretty easy.&lt;br /&gt;
&lt;br /&gt;
The other two methods are nearly identical, save for the fact that one takes CONFERENCE input and gives TEAM output, and the other takes TEAM input and gives PLAYER output.&amp;nbsp; Let's just look at the GetTeams method, then.&lt;br /&gt;
&lt;br /&gt;
You'll notice that a good portion of this is the same as the first method.&amp;nbsp; That is, we create a &lt;strong&gt;SqlDataReader &lt;/strong&gt;and populate it based on our parameterized &amp;quot;&lt;code type="sql"&gt;SELECT * FROM TEAM WHERE conf_id = @confid&lt;/code&gt;&amp;quot; query.&amp;nbsp; That &lt;strong&gt;@confid&lt;/strong&gt; parameter will be supplied by the previous &lt;strong&gt;DropDownList&lt;/strong&gt;.&amp;nbsp; So if someone selects &amp;quot;Eastern&amp;quot; from the first list, we only want TEAMS that are in the Eastern conference, right?&lt;br /&gt;
&lt;br /&gt;
So what's the difference between this method and the previous?&amp;nbsp; This bit here:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="vbnet"&gt; Dim kvTeam As StringDictionary = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim intConfId As Integer&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not kvTeam.ContainsKey(&amp;quot;Conference&amp;quot;) Or Not Int32.TryParse(kvTeam(&amp;quot;Conference&amp;quot;), intConfId) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Return Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;/blockcode&gt;  Like the sample site says:&lt;/p&gt;
&lt;blockquote&gt;The knownCategoryValues parameter will return a string containing the currently selected category values, as well as the category to retrieve values for. &lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
and...&lt;/p&gt;
&lt;blockquote&gt;The CascadingDropDown class has a helper method for unpacking the category values...&amp;nbsp; This method will return a StringDictionary containing the name/value pairs of the currently selected values. &lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;
In English?&amp;nbsp; We're going to look at &lt;strong&gt;knownCategoryValues&lt;/strong&gt;, make sure it contains a key called &lt;strong&gt;Conference&lt;/strong&gt;, and pull out of it the &lt;strong&gt;conf_id&lt;/strong&gt; associated with the selected item.&amp;nbsp; We then use that &lt;strong&gt;conf_id&lt;/strong&gt; finish dynamically creating our SQL SELECT query:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="vbnet"&gt; cmdFetchTeam.Parameters.AddWithValue(&amp;quot;@confid&amp;quot;, intConfId) &lt;/blockcode&gt; &lt;br /&gt;
Execute that query and feed it into our &lt;strong&gt;DataReader&lt;/strong&gt;, loop through the results, add the appropriate info into another list of &lt;strong&gt;CascadingDropDownNameValues&lt;/strong&gt;, and send that back to the &lt;strong&gt;CascadingDropDown &lt;/strong&gt;control to enable and populate our &lt;strong&gt;ddlTeam DropDownList&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
And that's pretty much it.&amp;nbsp; Like I mentioned, the second and third methods are pretty much identical, so adding a fourth or fiftieth &lt;strong&gt;DropDownList &lt;/strong&gt;to the chain is a snap.&lt;br /&gt;
&lt;br /&gt;
Hope this clears up some things for any other poor saps out there looking to populate their &lt;strong&gt;CascadingDropDowns &lt;/strong&gt;with a database backend and using Visual Basic.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wbRQYw3KosAkLvr8m7NX1CfQeaU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wbRQYw3KosAkLvr8m7NX1CfQeaU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wbRQYw3KosAkLvr8m7NX1CfQeaU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wbRQYw3KosAkLvr8m7NX1CfQeaU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=AYGG8NxjkHU:a5I-3oHV3wU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=AYGG8NxjkHU:a5I-3oHV3wU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=AYGG8NxjkHU:a5I-3oHV3wU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=AYGG8NxjkHU:a5I-3oHV3wU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=AYGG8NxjkHU:a5I-3oHV3wU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=AYGG8NxjkHU:a5I-3oHV3wU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=AYGG8NxjkHU:a5I-3oHV3wU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=AYGG8NxjkHU:a5I-3oHV3wU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=AYGG8NxjkHU:a5I-3oHV3wU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=AYGG8NxjkHU:a5I-3oHV3wU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/AYGG8NxjkHU" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/ajax">AJAX</category>
 <category domain="http://www.nerdliness.com/category/asp-net">ASP.NET</category>
 <category domain="http://www.nerdliness.com/category/ms-sql-0">MS SQL</category>
 <category domain="http://www.nerdliness.com/category/vb">VB</category>
 <category domain="http://www.nerdliness.com/category/web-services">Web Services</category>
 <category domain="http://www.nerdliness.com/category/windows">Windows</category>
 <pubDate>Fri, 15 Feb 2008 18:29:29 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">59 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/02/15/using-asp-net-ajax-cascadingdropdown-visual-basic-and-database</feedburner:origLink></item>
<item>
 <title>Pulling Data from Active Directory with the ASP.NET AJAX AutoComplete Extender</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/YO8AswxcgF0/pulling-data-active-directory-asp-net-ajax-autocomplete-extender</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;h3&gt;Intro&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
From time to time, I get the chance to take off the &amp;quot;database guy&amp;quot; hat I usually wear around the office and pretend I'm a developer.&amp;nbsp; A good deal of that coding involves some sort of web-based tool or another so, being a Microsoft shop, I figured it was time for me to get up to speed on their implementation of AJAX.&amp;nbsp; For the last couple of weeks, I've been playing around with the AJAX Control Toolkit for ASP.NET (&lt;a target="_blank" href="http://www.asp.net/ajax/"&gt;http://www.asp.net/ajax/&lt;/a&gt;) and today had the chance to put one of those controls (the AutoComplete extender) to work.&lt;br /&gt;
&lt;br /&gt;
I needed to create a web-based company address/phone book to throw on our intranet site.&amp;nbsp; We've nearly doubled the number of employees on the payroll over the past several months, and with everybody spread across about a dozen or so field offices, it can be a pain finding somebody when you need them, especially when you don't know their full name.&amp;nbsp; If only there was some way to allow users to type in the parts they knew and dynamically generate a list of users with names that fit that criteria...&amp;nbsp; something that might automatically complete their search string...&lt;br /&gt;
&lt;br /&gt;
In case you don't know (or know it by some other name, if you're a non-Microsoft person), the AutoComplete extender attaches to a TextBox control and, as the user begins to type, gives a list of suggestions he can click if he's too lazy to type in the whole phrase.&amp;nbsp; You've seen it in the Google toolbar, etc.&amp;nbsp; Pretty damn handy tool, if you ask me.&amp;nbsp; You can see a sample of it (along with a list of properties) at &lt;a target="_blank" href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/AutoComplete/AutoComplete.aspx"&gt;http://www.asp.net/AJAX/AjaxControlToolkit/Samples/AutoComplete/AutoComplete.aspx&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
That ASP.net website is chock full of well done, bite-sized how-to videos to help you learn to use the various Microsoft AJAX controls.&amp;nbsp; In fact, that's where I started and it's the first place I go when I want to learn about a new piece of the puzzle.&amp;nbsp; The videos are typically about 10-30 minutes long, with just enough information to give point you in the right direction.&amp;nbsp; Perfect for those of us with short atten...&amp;nbsp; Oh, look!&amp;nbsp; Something shiny!&lt;br /&gt;
&lt;br /&gt;
Sorry.&amp;nbsp; Anyway...&amp;nbsp; All the information people needed to access was in Active Directory (names, phone numbers, and email addresses), so really all we needed to do was give our users a way to search and access the data they wanted.&amp;nbsp; Unfortunately, the sample &amp;quot;How Do I...&amp;quot; video for that control doesn't really delve into populating your control with data from a simple database, much less from Active Directory.&amp;nbsp; Had to do a little digging for that.&amp;nbsp; It did, though, give me the basic foundation I needed to set up the control and create a web service to supply it with info of some kind.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Description and Caveats&lt;/h3&gt;
&lt;p&gt;Ok, so enough of the intro crap.&amp;nbsp; Let's get to the goods.&amp;nbsp; We're going to create a simple ASP.NET website that consists of one TextBox control with a linked AutoComplete extender, a button to kick off our email/phone search event, and a couple of labels to display the results.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
When someone types a few letters in the TextBox, our AutoComplete extender will send those characters to our web service.&amp;nbsp; That web service will perform the Active Directory lookup using the System.DirectoryServices namespace and return the collection of values back to that control.&amp;nbsp; After someone selects the user they want, they can hit our button to search Active Directory for that person's email address and phone number (we'll use the web service for that lookup, too).&amp;nbsp; And if they exist, they'll see them in our labels.&lt;br /&gt;
&lt;br /&gt;
Couple of caveats here.&amp;nbsp; I'm using Visual Studio 2005 with the AJAX Control Toolkit installed seperately.&amp;nbsp; I'm assuming you already have a similar setup on your rig, otherwise you'll need to follow the instructions on the ASP.net site to get your ducks in a row.&amp;nbsp; Watch the first two videos here if you need a hand:&amp;nbsp; &lt;a target="_blank" href="http://www.asp.net/learn/ajax-videos/"&gt;http://www.asp.net/learn/ajax-videos/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Second caveat is that, to look up Active Directory info, well, you'll need access to an Active Directory domain.&amp;nbsp; Definitely beyond the scope of this article.&amp;nbsp; I'm also assuming you'll be able to figure out your own LDAP path.&amp;nbsp; My example is going to be pretty basic and assumes you'll want to search your entire Active Directory domain from the root on down.&lt;br /&gt;
&lt;br /&gt;
Finally, I'm going to assume that you have basic knowledge of Visual Studio in general.&amp;nbsp; That is, you know how to create a new website, how to add controls from the Toolbox, where the Solution Explorer is, etc.&amp;nbsp; I'll throw in a link to my project files at the end if you're lazy.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Default.aspx&lt;/h3&gt;
&lt;p&gt;Ok, let's get on with it.&amp;nbsp; First of all, let's create our site, our blank web service, and add our various references.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
In my case, since I was starting from scratch, I just chose to create a new web site using the AJAX Control Toolkit Web Site template added to Visual Studio when I installed the AJAX Control Toolkit.&amp;nbsp; Piece of cake.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
In my Default.aspx page, I added the controls I mentioned above.&amp;nbsp; Here's the source for that page, if you just want to copy and paste:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="asp"&gt; &amp;lt;%@ Page Language=&amp;quot;VB&amp;quot; AutoEventWireup=&amp;quot;true&amp;quot; CodeFile=&amp;quot;Default.aspx.vb&amp;quot; Inherits=&amp;quot;_Default&amp;quot; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.1//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Phone and Email Looker Upper&amp;lt;/title&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form id=&amp;quot;form1&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ajaxToolkit:ToolkitScriptManager ID=&amp;quot;ScriptManager1&amp;quot; runat=&amp;quot;server&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID=&amp;quot;txtUserName&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/asp:TextBox&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID=&amp;quot;btnGetInfo&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Get Info&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ajaxToolkit:AutoCompleteExtender &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID=&amp;quot;AutoCompleteExtender1&amp;quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; runat=&amp;quot;server&amp;quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServiceMethod=&amp;quot;findUser&amp;quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServicePath=&amp;quot;activeDirectorySearch.asmx&amp;quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TargetControlID=&amp;quot;txtUserName&amp;quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; MinimumPrefixLength=&amp;quot;3&amp;quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ajaxToolkit:AutoCompleteExtender&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID=&amp;quot;lblEmail&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Email Address:&amp;quot;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID=&amp;quot;lblEmailResult&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/asp:Label&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID=&amp;quot;lblPhone&amp;quot; runat=&amp;quot;server&amp;quot; Text=&amp;quot;Phone Number:&amp;quot;&amp;gt;&amp;lt;/asp:Label&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID=&amp;quot;lblPhoneResult&amp;quot; runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/asp:Label&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;/blockcode&gt; &lt;br /&gt;
Really straight-forward if you've done any ASP.NET.&amp;nbsp; Take a second to look closer at the AutoCompleteExtender if this is your first time playing with it.&amp;nbsp; Couple of those properties you'll want to keep in mind:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt; ServiceMethod=&amp;quot;findUser&amp;quot;&lt;/strong&gt;&lt;br /&gt;
This is the name of the WebMethod we'll create in our web service that will ultimately perform our Active Directory lookup and return the results.&amp;nbsp; If you name your webmethod something else, make sure you change this property to match.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt; ServicePath=&amp;quot;activeDirectorySearch.asmx&amp;quot;&lt;/strong&gt;&lt;br /&gt;
The URL for our web service.&amp;nbsp; Mine's hosted locally, so no problem using that relative path.&amp;nbsp; Of course, if you put it somewhere else you'll need to modify this URL, too.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt; TargetControlID=&amp;quot;txtUserName&amp;quot; &lt;/strong&gt;&lt;br /&gt;
The name of the control we're binding this extender to.&amp;nbsp; When someone types in txtUserName, this AutoComplete extender will work its mojo.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt; MinimumPrefixLength=&amp;quot;3&amp;quot;&lt;/strong&gt;&lt;br /&gt;
The minimum number of characters your user has to type before the web service is called.&amp;nbsp; I've found that my Active Directory searches can be fairly slow, so I don't want to look for a ridiculously short string.&amp;nbsp; At the same time, there are plenty of people with three letter names, so I want to make sure they get returned.&lt;br /&gt;
&lt;br /&gt;
There are a bunch of other properties that might be worth your time.&amp;nbsp; Check out&amp;nbsp; &lt;a href="http://www.asp.net/AJAX/AjaxControlToolkit/Samples/AutoComplete/AutoComplete.aspx" target="_blank"&gt;http://www.asp.net/AJAX/AjaxControlToolkit/Samples/AutoComplete/AutoComplete.aspx&lt;/a&gt; for more info.&lt;/p&gt;
&lt;h3&gt;Default.aspx.vb&lt;/h3&gt;
&lt;p&gt;Our code behind file will be pretty simple, too.&amp;nbsp; After all, there's just the one button to deal with (the rest of our logic is in the web service).&amp;nbsp; Mine looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="vbnet"&gt; Imports System.Collections.Generic&lt;br /&gt;
Imports System.Web.Services&lt;br /&gt;
&lt;br /&gt;
Partial Class _Default&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.Web.UI.Page&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Protected Sub btnGetInfo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGetInfo.Click&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dictContact As New Dictionary(Of String, String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim srvSearch As activeDirectorySearch = New activeDirectorySearch&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dictContact = srvSearch.findContactInfo(txtUserName.Text)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strEmail As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strPhone As String&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each line As KeyValuePair(Of String, String) In dictContact&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If line.Key = &amp;quot;mail&amp;quot; Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strEmail &amp;amp;= line.Value.ToString&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ElseIf line.Key = &amp;quot;telephonenumber&amp;quot; Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strPhone &amp;amp;= line.Value.ToString&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblPhoneResult.Text = strPhone&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblEmailResult.Text = strEmail&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;br /&gt;
End Class &lt;/blockcode&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Not much to it, but a couple of things we need.&amp;nbsp; First, make sure you import System.Collections.Generic and System.Web.Services.&amp;nbsp; The former is needed for the dictionary objects I'm creating to hold the user info, and the latter is needed to make the call to our web service (activeDirectorySearch).&lt;br /&gt;
&lt;br /&gt;
All we're doing here is taking the string in the txtUsername.Text property and feeding that to the findContactInfo() webmethod we'll be creating.&amp;nbsp; That webmethod returns a dictionary (hash table, key/value pairs, whatever you wanna call it) with the email address and phone number (if any) in Active Directory for the person whose name appears in the text box.&amp;nbsp; It then iterates through the dictionary and creates a string to&amp;nbsp; hold our results.&amp;nbsp; Those are then assigned to the Text properties of our result labels.&amp;nbsp; Admittedly, the formatting is kinda hinky, but we're going more for functionality here.&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h3&gt;activeDirectorySearch.vb&lt;/h3&gt;
&lt;p&gt;Ok, let's create our web service.&amp;nbsp; If you haven't done this before, it's pretty simple:&amp;nbsp; just right-click your project in Solution Explorer, choose Add New Item..., and select Web Service.&amp;nbsp; Give it a name, click Add, and you're set.&amp;nbsp; In my case, the name is activeDirectorySearch, but if you name yours differently make sure you edit your code behind file above to match.&lt;br /&gt;
&lt;br /&gt;
This is probably the most complex part of the project, and even it isn't that hard.&amp;nbsp; Here's the code:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="vbnet"&gt; Imports System.Web&lt;br /&gt;
Imports System.Web.Services&lt;br /&gt;
Imports System.Web.Services.Protocols&lt;br /&gt;
Imports System.DirectoryServices&lt;br /&gt;
Imports System.Collections.Generic&lt;br /&gt;
&lt;br /&gt;
&amp;lt;WebService(Namespace:=&amp;quot;http://localhost/&amp;quot;)&amp;gt; _&lt;br /&gt;
&amp;lt;WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)&amp;gt; _&lt;br /&gt;
&amp;lt;Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()&amp;gt; _&lt;br /&gt;
&amp;lt;System.Web.Script.Services.ScriptService()&amp;gt; _&lt;br /&gt;
Public Class activeDirectorySearch&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Inherits System.Web.Services.WebService&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WebMethod()&amp;gt; _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function findUser(ByVal prefixText As String) As String()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim directory As DirectoryEntry = New DirectoryEntry(&amp;quot;LDAP://DC=nerdliness,DC=com&amp;quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim filter As String = &amp;quot;(&amp;amp;(cn=*&amp;quot; &amp;amp; prefixText &amp;amp; &amp;quot;*)(!objectClass=computer)(!objectClass=nTFRSMember))&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strCats() As String = {&amp;quot;cn&amp;quot;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim items As New List(Of String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dirUser As DirectorySearcher = New DirectorySearcher(directory, filter, strCats, SearchScope.Subtree)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim results As SearchResultCollection = dirUser.FindAll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strOut As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each result As SearchResult In results&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each prop As DictionaryEntry In result.Properties&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If prop.Key = &amp;quot;cn&amp;quot; Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each individualValue As Object In prop.Value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(individualValue.ToString)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return items.ToArray()&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Function findContactInfo(ByVal strUser As String) As Dictionary(Of String, String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim directory As DirectoryEntry = New DirectoryEntry(&amp;quot;LDAP://DC=nerdliness,DC=com&amp;quot;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim filter As String = &amp;quot;(cn=*&amp;quot; &amp;amp; strUser &amp;amp; &amp;quot;*)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strCats() As String = {&amp;quot;mail&amp;quot;, &amp;quot;telephonenumber&amp;quot;}&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim items As New Dictionary(Of String, String)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dirUser As DirectorySearcher = New DirectorySearcher(directory, filter, strCats, SearchScope.Subtree)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim results As SearchResultCollection = dirUser.FindAll&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim strOut As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each result As SearchResult In results&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each prop As DictionaryEntry In result.Properties&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If prop.Key = &amp;quot;mail&amp;quot; Or prop.Key = &amp;quot;telephonenumber&amp;quot; Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each individualValue As Object In prop.Value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; items.Add(prop.Key.ToString, individualValue.ToString)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return items&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;br /&gt;
&lt;br /&gt;
End Class &lt;/blockcode&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First, notice that we added two other namespaces at the top:&amp;nbsp; &lt;strong&gt;System.DirectoryServices&lt;/strong&gt; and &lt;strong&gt;System.Collections.Generic&lt;/strong&gt;.&amp;nbsp; As before, System.Collections.Generic is needed for our item and dictionary objects.&amp;nbsp; System.DirectoryServices, on the other hand, gives us the ability to pull our info out of Active Directory and iterate through it.&lt;br /&gt;
&lt;br /&gt;
NOTE:&amp;nbsp; You can't just add that &amp;quot;&lt;strong&gt;Imports System.DirectoryServices&lt;/strong&gt;&amp;quot; line and call it good.&amp;nbsp; If you try it, you'll get a wonderful little warning:&lt;/p&gt;
&lt;blockquote&gt; &amp;quot;Namespace or type specified in the Imports 'System.DirectoryServices' doesn't contain any public member or cannot be found.&amp;nbsp; Make sure the namespace or the type is defined and contains at least one public member.&amp;nbsp; Make sure the imported element name doesn't use any aliases.&amp;quot;&lt;br /&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
To get around that, you need to add a reference to System.DirectoryServices.&amp;nbsp; Just right-click your project in Solution Explorer and choose Add Reference...&amp;nbsp; Scroll down the list in the .NET tab and look for that component name.&amp;nbsp; Select it, click Add, and carry on.&lt;br /&gt;
&lt;br /&gt;
Another gotcha...&amp;nbsp;&amp;nbsp;&amp;nbsp; make sure you add that line that's immediately above &amp;quot;&lt;strong&gt;Public Class activeDirectorySearch&lt;/strong&gt;&amp;quot;, the one that says:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt; &amp;lt;System.Web.Script.Services.ScriptService()&amp;gt; _&lt;/strong&gt;&lt;br /&gt;
&lt;br /&gt;
Without it, this whole thing breaks down.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Finally, you'll need to customize the &lt;strong&gt;Namespace:=&amp;quot;http://localhost/&amp;quot;&lt;/strong&gt; line and the two &amp;quot;&lt;strong&gt;Dim directory as DirectoryEntry(&amp;quot;LDAP://DC=nerdliness,DC=com&lt;/strong&gt;&amp;quot; lines to match your situation.&amp;nbsp; As mentioned, my simple example is looking at the top of the mythical nerdliness.com Active Directory domain and searching from there.&amp;nbsp; You'll need to figure out your own LDAP path for your situation.&lt;br /&gt;
&lt;br /&gt;
Ok, other than that, we're really just got two webmethods named findUser and findContactInfo.&amp;nbsp; The first is the one we told our AutoComplete extender to use when we created our Default.aspx page.&amp;nbsp; The second is the one we referenced in our code behind file to find the contact info for a specific person when someone clicks our button.&lt;br /&gt;
&lt;br /&gt;
They're both pretty similar, with a couple of minor differences.&amp;nbsp; They both take a string as input, for instance, but while the first returns an array of strings, the second returns a dictionary.&amp;nbsp; While you could modify the second one to return the data however you like (provided you make the appropriate changes to your code behind file, of course), you're stuck with the first one.&amp;nbsp; The inputs and outputs for the web method used by the AutoComplete extender are VERY specific, down to the name of the input string.&amp;nbsp; Change that from prefixText to something else and you'll find things not working very quickly.&lt;br /&gt;
&lt;br /&gt;
Pretty much all the code in both methods is simply drilling down through the various collections returned from Active Directory until you get to the data you actually want.&amp;nbsp; Experiment around with that and you'll find you have access to a great deal of info kept in Active Directory.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
And that's really it...&amp;nbsp; You should be able to fire up that application let rock the house.&amp;nbsp; You might want to play with that filter part a little bit if you find that the query returns too many non-user results, but other than that everything should be solid.&amp;nbsp; &lt;br /&gt;
While I'm thinking about it, I need to give some love to RayV.&amp;nbsp; I bastardized the code he posted in this MSDN forum thread nearly two years ago to get my code working:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=372979&amp;amp;SiteID=1" target="_blank"&gt; http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=372979&amp;amp;SiteID=1&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WMGk5V6m63CxIPdjAJYy6Rp5TyI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WMGk5V6m63CxIPdjAJYy6Rp5TyI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WMGk5V6m63CxIPdjAJYy6Rp5TyI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WMGk5V6m63CxIPdjAJYy6Rp5TyI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YO8AswxcgF0:odR83SJdKtc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YO8AswxcgF0:odR83SJdKtc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YO8AswxcgF0:odR83SJdKtc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YO8AswxcgF0:odR83SJdKtc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YO8AswxcgF0:odR83SJdKtc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YO8AswxcgF0:odR83SJdKtc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YO8AswxcgF0:odR83SJdKtc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YO8AswxcgF0:odR83SJdKtc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YO8AswxcgF0:odR83SJdKtc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YO8AswxcgF0:odR83SJdKtc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/YO8AswxcgF0" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/active-directory">Active Directory</category>
 <category domain="http://www.nerdliness.com/category/ajax">AJAX</category>
 <category domain="http://www.nerdliness.com/category/asp-net">ASP.NET</category>
 <category domain="http://www.nerdliness.com/category/vb">VB</category>
 <category domain="http://www.nerdliness.com/category/web-services">Web Services</category>
 <category domain="http://www.nerdliness.com/category/windows">Windows</category>
 <pubDate>Tue, 05 Feb 2008 23:50:26 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">54 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/02/05/pulling-data-active-directory-asp-net-ajax-autocomplete-extender</feedburner:origLink></item>
<item>
 <title>And we thought the MySQL deal was bad news...</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/POJmqEcqoQ8/and-we-thought-mysql-deal-was-bad-news</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Just stumbled across this bit o' news that hit the street a little while ago:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.bloomberg.com/apps/news?pid=20601087&amp;amp;sid=aDjzDHqw48dA&amp;amp;refer=home"&gt;Microsoft Offers to Buy Yahoo for $44.6 Billion&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First of all..&amp;nbsp; Holy hell, that's a lot of money.&amp;nbsp; As the Bloomberg folks said:&lt;/p&gt;
&lt;blockquote&gt; Steve Ballmer is attempting the biggest-ever technology takeover after failing to compete with Google &lt;/blockquote&gt;
&lt;p&gt;I don't use any of Yahoo's services, not since I cured my online cribbage addiction about 10 years ago anyway, so I frankly don't care much about what might happen to their offerings if that acquisition goes through.&amp;nbsp; And judging by the fact that only 1.2% of our site's visitors&lt;a href="#footnote"&gt;**&lt;/a&gt; ended up here via Yahoo, well, that tells me y'all aren't exactly on their bandwagon, either.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;My biggest concern is what might happen with Google...&amp;nbsp; Surely the Google juggernaut couldn't sustain it's current rate of growth for much longer regardless, but a fully armed and operational MS/Yahoo battlestation might throw a bigger kink in things.&lt;/p&gt;
&lt;p&gt;Big winners in this are clearly the Yahoo shareholders.&amp;nbsp; So far today, Yahoo is up 8.35 (43.53%), while Microsoft and Google stock have dropped 2.09 (6.41% and 50.60 (8.97%), respectively.&amp;nbsp; Those numbers, of course, according to &lt;a href="http://finance.google.com/finance?q=yahoo"&gt;Google Finance&lt;/a&gt;. :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a name="footnote"&gt;&lt;/a&gt;** Nerdliness.com visitors are incredibly Google/Firefox biased.&amp;nbsp; Since we went live, the break down of our visitors by browser and search engine looks something like this:&lt;/p&gt;
&lt;p&gt;Google:&amp;nbsp; 97.6%&lt;br /&gt;
Yahoo:&amp;nbsp; 1.2%&lt;br /&gt;
MSN/Live: .8%&lt;/p&gt;
&lt;p&gt;Firefox: 68.49%&lt;br /&gt;
IE: 18.19%&lt;br /&gt;
Safari: 6.32%&lt;br /&gt;
Opera:&amp;nbsp; 4.03%&lt;/p&gt;
&lt;p&gt;Probably means that the ASP.NET articles we've been thinking about won't really go over too well around here, eh?&amp;nbsp; Oh, well.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3Bgi24m94SVB6whUvoEZFeHUJuw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3Bgi24m94SVB6whUvoEZFeHUJuw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3Bgi24m94SVB6whUvoEZFeHUJuw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3Bgi24m94SVB6whUvoEZFeHUJuw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=POJmqEcqoQ8:wllCoDQURRE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=POJmqEcqoQ8:wllCoDQURRE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=POJmqEcqoQ8:wllCoDQURRE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=POJmqEcqoQ8:wllCoDQURRE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=POJmqEcqoQ8:wllCoDQURRE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=POJmqEcqoQ8:wllCoDQURRE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=POJmqEcqoQ8:wllCoDQURRE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=POJmqEcqoQ8:wllCoDQURRE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=POJmqEcqoQ8:wllCoDQURRE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=POJmqEcqoQ8:wllCoDQURRE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/POJmqEcqoQ8" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/news">News</category>
 <pubDate>Fri, 01 Feb 2008 16:22:29 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">53 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/02/01/and-we-thought-mysql-deal-was-bad-news</feedburner:origLink></item>
<item>
 <title>6 Tips: In the Know</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/Jfhoz985qeQ/6-tips-know</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;So how do I stay 'in the know' and increase my Drupaliness?&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;I'll go ahead and warn the readers that this article won't have any fancy code snippets or super dark magic to turn your site into ten billion dollars of reoccurring ad revenue. What it WILL do is give you some great pointers in ramping up your Drupal knowledge as you begin to take over the world...one Drupal site at a time.&lt;/p&gt;
&lt;p&gt;Muahahahahahaha....but I digress.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.) Stay on the channels&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;While you probably need some clout to get anything answered or explained in #drupal, #drupal-support is where the n00bies flock...and flock often. Although I wouldn't consider myself any type of &amp;lt;air quote&amp;gt; expert &amp;lt;/air quote&amp;gt;, I can say that I have learned a lot by seeing some of the questions float through the channel. If you've got something interesting to add, be sure to speak up and give your support. The Open Source world is live and let live, so if you're on, say hi! I'm caramelson, btw.&lt;/p&gt;
&lt;p&gt;Other channels to check out are #drupal-dojo and #drupal-themes (for the themers in the house).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: For those that don't know what I mean by &amp;lt;air quote&amp;gt;channels&amp;lt;/ air quote&amp;gt;, I'm talking about &lt;a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat"&gt;IRC&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.) Groups&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Drupal groups is a cool thing. I've played with other CMS platforms before (Plone, Wordpress), and I can say that &lt;a href="http://groups.drupal.org"&gt;groups.drupal.org&lt;/a&gt; is a great bonus to this particular CMS community! You can find discussions tailored to just about anything. From local meetups to other Drupalers looking to make the next Facebook, you learn a lot from the ideas being tossed around. Some of the n00bie groups include Drupal Dojo and Drupal for Evil (semi-n00bie), and often have neat websites that have a host of tutorials, screencasts, and podcasts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.) Lullabot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This kind of goes without saying, but Lullabot is what we in the business call 'that fire'. Podcasts, video casts, teaching sessions, and a neat company mascot. What else is there?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.) Conferences&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Everyone probably knows about the grandaddy conference coming up in Boston, but don't forget to peruse the feeds for local ones! Even if you can't make it out, beg the crap out of someone who has some pull in organizing to stream it live on ustream.tv, perhaps even to post videos of the presentations. I'm hoping Crell comes through for me this year with Drupalcon 2008 since I'm not cool enough to go this year. :-(&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.) Drupal Planet Feed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Speaking of feeds, the mother of all feeds is that of Drupal Planet. Aggregating pretty much all of the 'it' list of Drupalers in one ginormous feed, it may be a good idea to stick that puppy in your Google reader. I will admit, some of it can be a little dense. But hey, no one ever said that genius was always entertaining. Alas, &lt;a href="http://drupal.org/planet"&gt;drupal.org/planet&lt;/a&gt; is where it's at.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.) Certs and Skillset&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This last one could go either way, but I've always believed that technology moves so fast that you can't simply believe that learning a language in 1998 is adequate enough to do some real damage in 2008. Stay current and don't be afraid to learn new functions and features. The list of applications at &lt;a href="http://gophp5.org"&gt;gophp5.org&lt;/a&gt; aren't coincidental. The Drupal community will continue to pump out new versions, use obscure built-in PHP functions like 'stream_filter_append', and n00bies will continue to live in ignorant bliss of all the new functionality hotness. I say no more! Bonus: look at getting a Zend certification.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/t_OLpnydLzvFQwLwEOJd3ZM2qRY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t_OLpnydLzvFQwLwEOJd3ZM2qRY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/t_OLpnydLzvFQwLwEOJd3ZM2qRY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/t_OLpnydLzvFQwLwEOJd3ZM2qRY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=Jfhoz985qeQ:NwrElh6kgpw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=Jfhoz985qeQ:NwrElh6kgpw:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=Jfhoz985qeQ:NwrElh6kgpw:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=Jfhoz985qeQ:NwrElh6kgpw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=Jfhoz985qeQ:NwrElh6kgpw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=Jfhoz985qeQ:NwrElh6kgpw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=Jfhoz985qeQ:NwrElh6kgpw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=Jfhoz985qeQ:NwrElh6kgpw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=Jfhoz985qeQ:NwrElh6kgpw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=Jfhoz985qeQ:NwrElh6kgpw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/Jfhoz985qeQ" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/advice">General Advice</category>
 <pubDate>Fri, 25 Jan 2008 05:47:18 +0000</pubDate>
 <dc:creator>fredric</dc:creator>
 <guid isPermaLink="false">52 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/01/24/6-tips-know</feedburner:origLink></item>
<item>
 <title>Sun acquiring MySQL</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/qZHBlhjvdKM/sun-acquiring-mysql</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;That's great, it starts with an earthquake, birds and snakes, an aeroplane...&amp;nbsp; Lenny Bruce is not afraid...&lt;/p&gt;
&lt;p&gt;Sorry, but that was the first thing that popped into my mind when I read &lt;a href="http://www.networkworld.com/news/2008/011608-bulletin-sun-to-acquire-mysql.html?nlhtspec=rn_011608&amp;amp;nladname=011608" target="_blank"&gt;this article&lt;/a&gt; this morning.&amp;nbsp; Yeah, I'm probably overreacting, but still the idea of everyone's favorite little open source database getting gobbled up by the folks that brought us Solaris is, well, a little disheartening.&lt;/p&gt;
&lt;p&gt;All sorts of speculation about what that means for the future of MySQL, but any major changes in licensing, packaging, support, etc., would have to be way out on the horizon.&amp;nbsp; And though the logical side of me seriously doubts that Sun would do anything to really screw up MySQL, the other part wonders just how likely it is that they'll want to take the &amp;quot;L&amp;quot; out of &amp;quot;LAMP.&amp;quot;&amp;nbsp; Or the &amp;quot;M&amp;quot;...&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Then again, if PostgreSQL took some of the market from MySQL, would that be such a bad thing?&amp;nbsp; If nothing else, it leaves the door open for all sorts of witty jokes about &amp;quot;LAPP&amp;quot; dances...&amp;nbsp; Especially here in Portland, where open source and strip clubs both play a big part in the local economy...&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XBTuSbAQNlbgacTrTznnJhzSSGg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XBTuSbAQNlbgacTrTznnJhzSSGg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XBTuSbAQNlbgacTrTznnJhzSSGg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XBTuSbAQNlbgacTrTznnJhzSSGg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=qZHBlhjvdKM:_vjeCVy16RQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=qZHBlhjvdKM:_vjeCVy16RQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=qZHBlhjvdKM:_vjeCVy16RQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=qZHBlhjvdKM:_vjeCVy16RQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=qZHBlhjvdKM:_vjeCVy16RQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=qZHBlhjvdKM:_vjeCVy16RQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=qZHBlhjvdKM:_vjeCVy16RQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=qZHBlhjvdKM:_vjeCVy16RQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=qZHBlhjvdKM:_vjeCVy16RQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=qZHBlhjvdKM:_vjeCVy16RQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/qZHBlhjvdKM" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/mysql">MySQL</category>
 <pubDate>Wed, 16 Jan 2008 18:46:41 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">51 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/01/16/sun-acquiring-mysql</feedburner:origLink></item>
<item>
 <title>Portland January Meetup Tonight</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/seN79pOJjEU/portland-january-meetup-tonight</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Cookies and Lullabots at Hotel deLuxe&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Just a little reminder for the Drupalers in the Portland/Vancouver area that the Lullabot folks will be hosting a meet-up this fine evening (Wednesday, January 9) at the &lt;a href="http://www.hoteldeluxeportland.com/"&gt;Hotel deLuxe&lt;/a&gt;.&amp;nbsp; If bathing in a sea of Drupal experts while eating free cookies isn't enough, Jeremy and I will be there, too.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IihAI1eqtgp8CyICEgob_aqsdlY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IihAI1eqtgp8CyICEgob_aqsdlY/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IihAI1eqtgp8CyICEgob_aqsdlY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IihAI1eqtgp8CyICEgob_aqsdlY/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=seN79pOJjEU:ZO982KEgsGI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=seN79pOJjEU:ZO982KEgsGI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=seN79pOJjEU:ZO982KEgsGI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=seN79pOJjEU:ZO982KEgsGI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=seN79pOJjEU:ZO982KEgsGI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=seN79pOJjEU:ZO982KEgsGI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=seN79pOJjEU:ZO982KEgsGI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=seN79pOJjEU:ZO982KEgsGI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=seN79pOJjEU:ZO982KEgsGI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=seN79pOJjEU:ZO982KEgsGI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/seN79pOJjEU" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/news">News</category>
 <pubDate>Wed, 09 Jan 2008 15:59:02 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">50 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/01/09/portland-january-meetup-tonight</feedburner:origLink></item>
<item>
 <title>Google Maps/Amazon/Banned Books Mashup - Part 2</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/OCNap7WpfrY/google-maps-amazon-banned-books-mashup-part-2</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Geocoding with Google Maps API&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;When we last heard from Our Hero, we&amp;rsquo;d begun the joyous process of creating a simple Google Maps/Amazon mashup.&amp;nbsp; We took a peek at what the finished product should look like, we obtained our Google Maps API key, and we created our database tables and populated them with some data.&amp;nbsp; All good things.&lt;br /&gt;
&lt;br /&gt;
We also talked about geocoding, that process of converting a street address into the coordinates (longitude and latitude) that Google Maps digs.&amp;nbsp; Our &lt;strong&gt;LOCATIONS &lt;/strong&gt;table has some street addresses and empty columns just hankerin&amp;rsquo; for some longitude and latitude info.&amp;nbsp; Let&amp;rsquo;s do us some geocodin&amp;rsquo;. &lt;br /&gt;
This zip file contains the source for all the codin' we're doing today:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.nerdliness.com/files/updatelnglat.zip"&gt;http://www.nerdliness.com/files/updatelnglat.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
You'll need those files to follow along at home.&amp;nbsp; While I'll break 'em down pretty much completely in the paragraphs to follow, I won't be reposting them in their entirety.&amp;nbsp; If you try to just copy-and-paste from the text below, you'll be sadly disappointed when your efforts blow up because of a missing variable declaration, etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;config.php&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
Ok, then.&amp;nbsp; First thing's first.&amp;nbsp; Before we get into the good stuff, we&amp;rsquo;re going to create a config file that will hold our database connection info (username, password, etc).&amp;nbsp; Call it config.php and put it in a scripts directory within the directory you normally put your HTML files.&amp;nbsp; In other words, if you put your goods in &lt;code type="bash"&gt;public_html/&lt;/code&gt; normally, this &lt;code type="bash"&gt;config.php&lt;/code&gt; will live in &lt;code type="bash"&gt;public_html/scripts/config.php&lt;/code&gt;. Of course, you can do whatever you want, but if you end up just using my code you&amp;rsquo;ll need to change the various references accordingly.&lt;br /&gt;
&lt;br /&gt;
Your &lt;code type="bash"&gt;config.php&lt;/code&gt; file should look something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; &amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
$dbhost= '[your_db_host_name]';&lt;br /&gt;
$dbname = '[your_db_name]';&lt;br /&gt;
$dbuser = '[your_db_user_name]';&lt;br /&gt;
$dbpasswd = '[your_db_password]';&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
$link = mysql_connect($dbhost, $dbuser, $dbpasswd)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; or die('Could not connect: ' . mysql_error());&lt;br /&gt;
&lt;br /&gt;
mysql_select_db($dbname) or die('Yo, where da database?');&lt;br /&gt;
&lt;br /&gt;
?&amp;gt; &lt;/blockcode&gt; &lt;br /&gt;
While this &lt;code type="bash"&gt;config.php&lt;/code&gt; file isn't completely necessary, it'll save you some grief later.&amp;nbsp; Sure, you could add this info into every file that connects to your database if you like, but we lazy nerds prefer to just throw it all into one file and reference it when needed.&lt;br /&gt;
&lt;br /&gt;
Don&amp;rsquo;t forget to replace everything in the brackets with the appropriate info for your setup.&amp;nbsp; Probably &amp;lsquo;&lt;strong&gt;localhost&lt;/strong&gt;&amp;rsquo; for the &amp;lsquo;&lt;strong&gt;[your_db_host_name]&lt;/strong&gt;&amp;rsquo; part, etc.&amp;nbsp; If you aren&amp;rsquo;t certain, you&amp;rsquo;ll need to contact your ISP or sys admin for the correct info.&amp;nbsp; And, again, I&amp;rsquo;m using MySQL, so you might need to modify this a bit if you use PostgreSQL or some other DBMS.&lt;/p&gt;
&lt;h3&gt;locationmassinsert.html&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
Now, in the root of the website, I have a file called &lt;code type="bash"&gt;locationmassinsert.html&lt;/code&gt; that's just a simple plain ol' HTML file:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="HTML"&gt; &amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script src=&lt;br /&gt;
&amp;quot;http://maps.google.com/maps?file=api&amp;amp;amp;v=2&amp;amp;amp;key=[your_google_maps_api_key]&amp;quot;&lt;br /&gt;
type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;scripts/getcoord.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body onLoad=&amp;quot;getLocFromXML()&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/html&amp;gt; &lt;/blockcode&gt; &lt;br /&gt;
Not much to it, is there?&amp;nbsp; It&amp;rsquo;s essentially just a wrapper that will call the functions we use to actually pull the data from our table, submit a query to Google to geocode an address, and update our original table with the returned info.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
You could do this a few different ways&amp;hellip;&amp;nbsp; Personally, I like just using a simple HTML page like this in case I want to call it remotely in the future.&amp;nbsp;&amp;nbsp; I just fire it up in my Firefox and watch it do the rest.&amp;nbsp; In real life, I&amp;rsquo;d probably password protect the page to keep people from launching a DDOS attack (Google limits the number of geocoding requests you can make in a day), but since I&amp;rsquo;m only using it to initially populate my table, I&amp;rsquo;m not going to worry about that.&amp;nbsp; Instead, I&amp;rsquo;ll just make it unreadable when I&amp;rsquo;m done or maybe pull off the server completely.&lt;br /&gt;
&lt;br /&gt;
Ok, so what are we doing here?&amp;nbsp;&amp;nbsp; Let's take a closer look at some of the lines in that page.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="html"&gt; &amp;lt;script src=&lt;br /&gt;
&amp;quot;http://maps.google.com/maps?file=api&amp;amp;amp;v=2&amp;amp;amp;key=[your_google_maps_api_key]&amp;quot;&lt;br /&gt;
type=&amp;quot;text/javascript&amp;quot;&amp;gt; &lt;/blockcode&gt; &lt;br /&gt;
That&amp;rsquo;s the big one.&amp;nbsp; It&amp;rsquo;s what gives us access to the various Google Maps functions Google lets us use to create these maps.&amp;nbsp; Make sure you replace the &amp;ldquo;&lt;strong&gt;[your_google_maps_api_key]&lt;/strong&gt;&amp;rdquo; part with the key you obtained early.&amp;nbsp; No need to surround it with quotation marks, just slap that long, ugly key in right after the equals sign.&lt;br /&gt;
&lt;br /&gt;
The second important part is this line:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="html"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;scripts/getcoord.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/blockcode&gt;&lt;br /&gt;
&lt;br /&gt;
One of the next steps will be to create that &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file, but for now just include the reference.&amp;nbsp; The &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file will hold all the JavaScript functions we&amp;rsquo;ll use to get our AJAX on and submit some requests to Google.&amp;nbsp; Without that reference, this last important line will error out:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="html"&gt;&amp;lt;body onLoad=&amp;quot;getLocFromXML()&amp;quot;&amp;gt;&lt;/blockcode&gt;&lt;br /&gt;
&lt;br /&gt;
All we&amp;rsquo;re saying is that, when this page loads in the browser, it should call the function named &amp;ldquo;&lt;strong&gt;getLocFromXML()&lt;/strong&gt;&amp;rdquo; we&amp;rsquo;ll define in the &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file.&amp;nbsp; Simple so far, huh?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;getcoord.js&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
If you&amp;rsquo;re new to JavaScript, this might look pretty much like gibberish at first.&amp;nbsp; You&amp;rsquo;ll get the hang of it, though, and pretty quickly.&lt;br /&gt;
&lt;br /&gt;
Our &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file contains three different functions:&amp;nbsp; &lt;strong&gt;getLocFromXML()&lt;/strong&gt;, &lt;strong&gt;codeAddress()&lt;/strong&gt;, and &lt;strong&gt;insertCoord()&lt;/strong&gt;.&amp;nbsp; Remember from a couple paragraphs ago that our &lt;code type="bash"&gt;locationmassinsert.html&lt;/code&gt; file does little more than call the &lt;strong&gt;getLocFromXML() &lt;/strong&gt;function we define in this &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file&amp;hellip;?&amp;nbsp;&amp;nbsp; Here&amp;rsquo;s what that function looks like:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; function getLocFromXML() {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ajaxRequest; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest = new XMLHttpRequest();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;Bad juju!&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
ajaxRequest.onreadystatechange = function(){&lt;br /&gt;
if(ajaxRequest.readyState == 4){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var xmldoc = ajaxRequest.responseXML.documentElement; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var locations = xmldoc.getElementsByTagName('location');&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; locations.length; i++) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var locationid = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('locationid')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var street1 = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('street1')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var city = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('city')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var state = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('state')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var zip = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('zip')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; address = street1 + ' ' + city + ' ' + state + ' ' + zip;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; codeAddress(address, locationid);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest.open(&amp;quot;GET&amp;quot;, &amp;quot;scripts/getxmlinfo.php&amp;quot;, true);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest.send(null);&lt;br /&gt;
} &lt;/blockcode&gt; &lt;br /&gt;
Looks a lot more complicated than it really is.&amp;nbsp; Helluva lot easier to understand this if we break it down.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The first couple of lines are pretty straightforward.&amp;nbsp; First, we say that we&amp;rsquo;re creating a new function called &amp;ldquo;&lt;strong&gt;getLocFromXML&lt;/strong&gt;&amp;rdquo; with the syntax &amp;ldquo;&lt;strong&gt;function getLocFromXML()&lt;/strong&gt;&amp;rdquo;.&amp;nbsp; Wow.&amp;nbsp; Hard.&lt;br /&gt;
&lt;br /&gt;
The next line is just about as complex.&amp;nbsp; &amp;ldquo;&lt;strong&gt;var ajaxRequest;&lt;/strong&gt;&amp;rdquo; just means that we&amp;rsquo;re declaring a variable called &amp;ldquo;&lt;strong&gt;ajaxRequest&lt;/strong&gt;&amp;rdquo;.&amp;nbsp; It&amp;rsquo;s nothing but a placeholder at this point, but it&amp;rsquo;ll mean the world to our app before all&amp;rsquo;s said and done.&lt;br /&gt;
&lt;br /&gt;
Now here&amp;rsquo;s where the magic happens.&amp;nbsp; The first part of our function is what the kids call a &amp;ldquo;Try/Catch&amp;rdquo; block.&amp;nbsp; Like the name implies, we&amp;rsquo;re telling the system to try a piece of code first.&amp;nbsp; If it works, great.&amp;nbsp; If not, catch the error and attempt the second piece of code instead.&amp;nbsp; If that doesn&amp;rsquo;t work, try another piece, catch its error, etc.&amp;nbsp; If they all fail, send an alert that just says &amp;ldquo;Bad juju!&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
All we&amp;rsquo;re really trying to do with that try/catch block is create an &lt;strong&gt;XMLHttpRequest &lt;/strong&gt;object, the thing we use to send requests to a web server (and receive a response) without having to reload the whole page.&amp;nbsp; This, folks, is the magic behind AJAX.&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The rest of that try/catch garbage is only in place to provide support for different browsers and their inability to follow standards&amp;hellip;&amp;nbsp; We say &amp;ldquo;Hey, browser!&amp;nbsp; Fetch me a &lt;strong&gt;XMLHttpRequest&lt;/strong&gt; object and call it &amp;lsquo;&lt;strong&gt;ajaxRequest&lt;/strong&gt;!&amp;rsquo;&amp;rdquo;&amp;nbsp; If it can do it, great.&amp;nbsp; We ignore the rest of that section.&amp;nbsp;&amp;nbsp; But what if it doesn&amp;rsquo;t know what an &lt;strong&gt;XMLHttpRequest &lt;/strong&gt;object is?&amp;nbsp; Well, then we tell it we want an &lt;strong&gt;ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;)&lt;/strong&gt; instead.&amp;nbsp; Still not working?&amp;nbsp; How &amp;lsquo;bout an &lt;strong&gt;ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;)&lt;/strong&gt;?&amp;nbsp; And if that doesn&amp;rsquo;t work, we give up on your sorry browser.&lt;br /&gt;
&lt;br /&gt;
Let&amp;rsquo;s move on to the next part, the section that begins with &amp;ldquo;&lt;strong&gt;ajaxRequest.onreadystatechange = function()&lt;/strong&gt;&amp;rdquo;.&amp;nbsp; Ok, so the &lt;strong&gt;XMLHttpRequest &lt;/strong&gt;object we called &lt;strong&gt;ajaxRequest &lt;/strong&gt;has a property called a &amp;ldquo;&lt;strong&gt;readyState&lt;/strong&gt;&amp;rdquo; that can be anything from 0-4, depending on what its current state is:&lt;/p&gt;
&lt;blockquote&gt; 0 = uninitialized&lt;br /&gt;
1 = loading&lt;br /&gt;
2 = loaded&lt;br /&gt;
3 = interactive&lt;br /&gt;
4 = complete &lt;/blockquote&gt;
&lt;p&gt;&lt;br /&gt;
When the &lt;strong&gt;readyState &lt;/strong&gt;changes over the course of the object&amp;rsquo;s lifetime, we can tell our code to do what we want it to do by using that nifty &lt;strong&gt;onreadystatechange &lt;/strong&gt;event handler.&amp;nbsp; Whenever &lt;strong&gt;ajaxRequest&lt;/strong&gt;&amp;rsquo;s state changes, the function we&amp;rsquo;re creating will be called.&amp;nbsp; The next dozen or so lines define exactly what the function is.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt;if(ajaxRequest.readyState == 4){&lt;/blockcode&gt;&lt;br /&gt;
&lt;br /&gt;
Pretty self-explanatory.&amp;nbsp; We only want our code to do its thang if the &lt;strong&gt;XMLHttpRequest &lt;/strong&gt;has completed, so we check that readyState right out of the gate.&amp;nbsp; If it equals 4, then carry on, my wayward son.&amp;nbsp; Otherwise, fuggetaboutit.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; var xmldoc = ajaxRequest.responseXML.documentElement; &lt;br /&gt;
var locations = xmldoc.getElementsByTagName('location'); &lt;/blockcode&gt; &lt;br /&gt;
Just declaring a couple of variables and assigning them values based on the properties of our &lt;strong&gt;ajaxRequest XMLHttpRequest &lt;/strong&gt;object.&amp;nbsp; &lt;strong&gt;xmldoc &lt;/strong&gt;will be an element of the XML our request receives later on, while &lt;strong&gt;locations &lt;/strong&gt;contain the elements within &lt;strong&gt;xmldoc &lt;/strong&gt;named &amp;ldquo;location&amp;rdquo; (this&amp;rsquo;ll make a little more sense later).&lt;br /&gt;
&lt;br /&gt;
Next, we get a little FOR loop:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; for (var i = 0; i &amp;lt; locations.length; i++) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var locationid = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('locationid')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var street1 = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('street1')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var city = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('city')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var state = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('state')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var zip = &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locations[i].getElementsByTagName('zip')[0].firstChild.nodeValue;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; address = street1 + ' ' + city + ' ' + state + ' ' + zip;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; codeAddress(address, locationid);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} &lt;/blockcode&gt; &lt;br /&gt;
While the variable &amp;ldquo;&lt;strong&gt;i&lt;/strong&gt;&amp;rdquo; is between 0 and the length of our &lt;strong&gt;locations &lt;/strong&gt;variable (the number of different &lt;strong&gt;location &lt;/strong&gt;elements), we want to execute the code within.&amp;nbsp; In this case, we&amp;rsquo;re creating various variables we&amp;rsquo;ll need for our geocoding process (&lt;strong&gt;locationid&lt;/strong&gt;, &lt;strong&gt;street1&lt;/strong&gt;, &lt;strong&gt;city&lt;/strong&gt;, etc.) and assigning them the values from our &lt;strong&gt;XMLHttpRequest&lt;/strong&gt;&amp;rsquo;s response.&amp;nbsp; Again, this&amp;rsquo;ll probably make more sense when you see what the response looks like later in the lesson.&lt;br /&gt;
&lt;br /&gt;
At the end of the loop, we concatenate a few of the variables together to create an &amp;ldquo;&lt;strong&gt;address&lt;/strong&gt;.&amp;rdquo;&amp;nbsp; We then call a function called &lt;strong&gt;codeAddress()&lt;/strong&gt;, giving it two pieces of information (the &lt;strong&gt;locationid &lt;/strong&gt;and our concatenated &lt;strong&gt;address&lt;/strong&gt;) for each of the &lt;strong&gt;location &lt;/strong&gt;elements.&amp;nbsp; Makes sense, right?&amp;nbsp; We need to geocode every address, so we call a function to do just that once for every physical address we care about.&amp;nbsp; We&amp;rsquo;ll look more closely at the &lt;strong&gt;codeAddress()&lt;/strong&gt; function itself shortly.&lt;br /&gt;
&lt;br /&gt;
The last couple of lines tell &lt;strong&gt;ajaxRequest &lt;/strong&gt;to actually open its connection and to where it should send its request:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; ajaxRequest.open(&amp;quot;GET&amp;quot;, &amp;quot;scripts/getxmlinfo.php&amp;quot;, true);&lt;br /&gt;
ajaxRequest.send(null); &lt;/blockcode&gt; &lt;br /&gt;
Yeah, you guessed it.&amp;nbsp; We&amp;rsquo;re going to create a file called &lt;code type="bash"&gt;getxmlinfo.php&lt;/code&gt; in the near future that&amp;rsquo;s actually going to handle this request.&amp;nbsp; It then return back to our function the XML containing the location elements we just talked about.&amp;nbsp; Since we&amp;rsquo;re using the HTTP GET method here, we don&amp;rsquo;t need to include any info with that &lt;strong&gt;.send(null)&lt;/strong&gt; line.&amp;nbsp; If we were using POST, well, that&amp;rsquo;d be another story (how&amp;rsquo;s that for foreshadowing?)&amp;hellip;&lt;br /&gt;
&lt;br /&gt;
On to the next function in our &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file, &lt;strong&gt;codeAddress()&lt;/strong&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; function codeAddress(address, locationid) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; geocoder = new GClientGeocoder();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; geocoder.getLocations(address, function(response) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!response || response.Status.code != 200) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;Sorry, we were unable to geocode that address&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; place = response.Placemark[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var lng = place.Point.coordinates[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; var lat = place.Point.coordinates[1];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; insertCoord(locationid, lng, lat);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;
} &lt;/blockcode&gt; &lt;br /&gt;
Clearly, this one&amp;rsquo;s a bit simpler than our &lt;strong&gt;getLocFromXML() &lt;/strong&gt;function.&amp;nbsp; Here we get our first taste of the Google Maps API, specifically the &lt;strong&gt;GclientGeocoder &lt;/strong&gt;(&lt;a target="_blank" href="http://code.google.com/apis/maps/documentation/reference.html#GClientGeocoder"&gt;http://code.google.com/apis/maps/documentation/reference.html#GClientGeocoder&lt;/a&gt; ) class.&lt;br /&gt;
&lt;br /&gt;
The first couple of lines are similar to our last function.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; function codeAddress(address, locationid) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; geocoder = new GClientGeocoder(); &lt;/blockcode&gt; &lt;br /&gt;
We&amp;rsquo;re creating a function called &lt;strong&gt;codeAddress &lt;/strong&gt;that requires two pieces of input to get its job done:&amp;nbsp; an &lt;strong&gt;address &lt;/strong&gt;and a &lt;strong&gt;locationid&lt;/strong&gt;.&amp;nbsp; I&amp;rsquo;m sure you remember that we sent those to this function when we called it above.&amp;nbsp; You&amp;rsquo;re smart like that.&lt;br /&gt;
&lt;br /&gt;
Next, we create a new object called &lt;strong&gt;geocoder &lt;/strong&gt;from the aforementioned &lt;strong&gt;GClientGeocoder()&lt;/strong&gt; class.&amp;nbsp;&amp;nbsp; (Note:&amp;nbsp; I declared &lt;strong&gt;geocoder&lt;/strong&gt;, along with a couple other variables, before all my functions.&amp;nbsp; You wouldn&amp;rsquo;t have seen that unless you already downloaded and perused the full &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file in the ZIP file I linked to earlier.)&lt;br /&gt;
&lt;br /&gt;
After that, we call use the GClientGeocoder&amp;rsquo;s &lt;strong&gt;getLocations &lt;/strong&gt;method to actually geocode the address in question.&amp;nbsp; In Google&amp;rsquo;s words:&lt;br /&gt;
&lt;br /&gt;
Sends a request to Google servers to geocode the specified address. A reply that contains status code, and if successful, one or more Placemark objects, is passed to the user-specified callback function.&lt;br /&gt;
&lt;br /&gt;
Here&amp;rsquo;s how we use that:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; geocoder.getLocations(address, function(response) { &lt;/blockcode&gt; &lt;br /&gt;
The &amp;ldquo;&lt;strong&gt;address&lt;/strong&gt;&amp;rdquo; part of &amp;ldquo;&lt;strong&gt;geocoder.getLocations(address, function(response)&lt;/strong&gt;&amp;rdquo; is the &lt;strong&gt;address &lt;/strong&gt;we passed to our function originally (the concatenated one from the &lt;strong&gt;getLocFromXML &lt;/strong&gt;function).&amp;nbsp; The &amp;ldquo;&lt;strong&gt;response&lt;/strong&gt;&amp;rdquo; in &amp;ldquo;&lt;strong&gt;function(response)&lt;/strong&gt;&amp;rdquo; is the data Google sends in response to our geocoding request.&lt;br /&gt;
&lt;br /&gt;
First thing we do with their response is check its status.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; if (!response || response.Status.code != 200) { &lt;/blockcode&gt; &lt;br /&gt;
That status can be any number of values Google&amp;rsquo;s created to tell you what happened when it tried to geocode your address (see &lt;a target="_blank" href="http://code.google.com/apis/maps/documentation/reference.html#GGeoStatusCode"&gt;http://code.google.com/apis/maps/documentation/reference.html#GGeoStatusCode&lt;/a&gt; for the list of values).&amp;nbsp; In our case, we only really care that we receive a successful response.&amp;nbsp; If it failed, we don&amp;rsquo;t care about the how and why for this example, but if you&amp;rsquo;re troubleshooting that information could be invaluable.&lt;br /&gt;
&lt;br /&gt;
Quick sidebar for the new-to-JavaScript among us.&amp;nbsp; The &lt;strong&gt;! &lt;/strong&gt;operator generally means &amp;ldquo;not&amp;rdquo; or &amp;ldquo;the opposite,&amp;rdquo; and the &lt;strong&gt;||&lt;/strong&gt; comparison operator means &amp;ldquo;or.&amp;rdquo;&amp;nbsp; In English, we&amp;rsquo;re saying &amp;ldquo;if we don&amp;rsquo;t get a response, or if we get a response that doesn&amp;rsquo;t equal 200, then do something&amp;hellip;&amp;rdquo;&amp;nbsp; In this case, if either happens, we pop up an alert that simply says &amp;ldquo;Sorry, we were unable to geocode that address.&amp;rdquo;&lt;br /&gt;
&lt;br /&gt;
If we get a good response back, though, we want to snag the longitude and latitude info from that response and insert that into our database:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; } else {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; place = response.Placemark[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var lng = place.Point.coordinates[0];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; var lat = place.Point.coordinates[1];&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; insertCoord(locationid, lng, lat);&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
} &lt;/blockcode&gt; &lt;br /&gt;
Remember that Google quote from above that talked about how a successful geocoding request will return one or more Placemark objects?&amp;nbsp; That&amp;rsquo;s what we&amp;rsquo;re looking for.&amp;nbsp; First, we assign our place variable the value of &lt;strong&gt;response.Placemark[0]&lt;/strong&gt;.&amp;nbsp; (That &amp;ldquo;&lt;strong&gt;[0]&lt;/strong&gt;&amp;rdquo; means the first of the &amp;ldquo;one or more Placemark objects.&amp;rdquo;&amp;nbsp; There&amp;rsquo;s a chance there could be multiple Placemarks, but we&amp;rsquo;re assuming that the first one is the one we want.&amp;nbsp; Also, keep in mind that the numbers start with zero, not one.&amp;nbsp; That can be confusing for some new programmers, but it&amp;rsquo;s pretty common.)&lt;br /&gt;
&lt;br /&gt;
Next, we pull the &lt;strong&gt;Point.coordinates[0]&lt;/strong&gt; property from our place object and assign it to our new &lt;strong&gt;lng &lt;/strong&gt;variable.&amp;nbsp; Likewise with &lt;strong&gt;Point.coordinates[1]&lt;/strong&gt; and our &lt;strong&gt;lat &lt;/strong&gt;variable.&amp;nbsp; How did we know which one was the longitude and which the latitude?&amp;nbsp; Simple:&amp;nbsp; we Googled Google and found an example of the Placemark object&amp;rsquo;s structure.&amp;nbsp; If you browse to &lt;a href="http://code.google.com/apis/maps/documentation/services.html#Geocoding_Structured" target="_blank"&gt;http://code.google.com/apis/maps/documentation/services.html#Geocoding_Structured&lt;/a&gt; you&amp;rsquo;ll see what we&amp;rsquo;re talking about.&amp;nbsp; The longitude is simply listed before the latitude in the Point.coordinates section.&lt;br /&gt;
&lt;br /&gt;
Finally, now that we have our actual coordinates, we can insert them back into our original &lt;strong&gt;LOCATIONS &lt;/strong&gt;table.&amp;nbsp; We do that by sending them to another function we&amp;rsquo;ve created called &lt;strong&gt;insertCoord()&lt;/strong&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; function insertCoord(locationid, loclng, loclat) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ajaxRequest;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest = new XMLHttpRequest();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest = new ActiveXObject(&amp;quot;Msxml2.XMLHTTP&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try{&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxRequest = new &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (e){&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&amp;quot;Your browser broke!&amp;quot;);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
ajaxRequest.open(&amp;quot;POST&amp;quot;, &amp;quot;scripts/insertcoord.php&amp;quot;, true);&lt;br /&gt;
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;charset=UTF-8');&lt;br /&gt;
ajaxRequest.send('locationid=' + locationid + '&amp;amp;lng=' + &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;loclng + '&amp;amp;lat=' + loclat);&lt;br /&gt;
} &lt;/blockcode&gt; &lt;br /&gt;
Looks pretty familiar, eh?&amp;nbsp; Again, we&amp;rsquo;re using some AJAX to send our data between pages.&amp;nbsp; Why?&amp;nbsp; We save some resources by sending smaller bits of data to our server.&amp;nbsp;&amp;nbsp; Save some bandwidth, thing runs faster.&amp;nbsp; Plus, there&amp;rsquo;s the added bonus of getting some more AJAX practice.&amp;nbsp; Win, win.&lt;br /&gt;
&lt;br /&gt;
You all know what the first part of this function does by now (creates a function with our desired name and tells what arguments it requires).&amp;nbsp; Also, you probably remember the whole schpiel about the try/catch block from our &lt;strong&gt;getLocFromXML()&lt;/strong&gt; discussion.&amp;nbsp; It&amp;rsquo;s exactly the same here.&lt;br /&gt;
&lt;br /&gt;
So what&amp;rsquo;s different?&amp;nbsp; Only where we&amp;rsquo;re sending this request and the method we&amp;rsquo;re using (POST instead of GET):&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="javascript"&gt; ajaxRequest.open(&amp;quot;POST&amp;quot;, &amp;quot;scripts/insertcoord.php&amp;quot;, true);&lt;br /&gt;
ajaxRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;charset=UTF-8');&lt;br /&gt;
ajaxRequest.send('locationid=' + locationid + '&amp;amp;lng=' + &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;loclng + '&amp;amp;lat=' + loclat); &lt;/blockcode&gt; &lt;br /&gt;
Pretty boring, but a couple things to note.&amp;nbsp; First, we&amp;rsquo;re using an HTTP POST this time instead of a GET, and we&amp;rsquo;re POSTing to a file called &lt;code type="bash"&gt;insertcoord.php&lt;/code&gt; that we haven&amp;rsquo;t created yet.&amp;nbsp; We&amp;rsquo;ll do that soon.&lt;br /&gt;
&lt;br /&gt;
Second, notice that we have to create specific headers when we&amp;rsquo;re using a POST instead of GET.&amp;nbsp; Don&amp;rsquo;t worry too much about that &lt;strong&gt;ajaxRequest.setRequestHeader&lt;/strong&gt; line now, just know that you need it when you POST.&lt;br /&gt;
&lt;br /&gt;
Finally, see how we aren&amp;rsquo;t sending &amp;lsquo;null&amp;rsquo; like we did with the GET method?&amp;nbsp; Here, we&amp;rsquo;re actually sending the parameters we&amp;rsquo;ll be using in that &lt;code type="bash"&gt;insertcoord.php&lt;/code&gt; file when we update the database.&amp;nbsp; Without that info, the &lt;code type="bash"&gt;insertcoord.php&lt;/code&gt; file wouldn't know which record to update or what to update it with.&lt;br /&gt;
&lt;br /&gt;
Now you might be asking yourself why that &lt;code type="bash"&gt;insertcoord.php&lt;/code&gt; file is even necessary, why we don&amp;rsquo;t just insert into MySQL directly from this JavaScript file.&amp;nbsp; The answer is that that there simply isn&amp;rsquo;t an easy way to do that with JavaScript.&amp;nbsp; We have to use a server-side language for that part.&lt;br /&gt;
&lt;br /&gt;
And that&amp;rsquo;s it for our &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file.&lt;br /&gt;
&lt;br /&gt;
Next, we need to create the other two files we referenced:&amp;nbsp; &lt;code type="bash"&gt;getxmlinfo.php&lt;/code&gt; and &lt;code type="bash"&gt;insertcoord.php.&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;getxmlinfo.php&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
This one's pretty simple:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; &amp;lt;?php&lt;br /&gt;
include_once('config.php');&lt;br /&gt;
header('Content-Type: text/xml');&lt;br /&gt;
&lt;br /&gt;
$output = &amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;ISO-8859-1\&amp;quot;?&amp;gt;\n&amp;quot;;&lt;br /&gt;
$output.=&amp;quot;&amp;lt;locations&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
$query = &amp;quot;SELECT locationid, name, street1, street2, city, state, zip &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM locations WHERE street1 != '' &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AND (lat IS NULL or lng IS NULL) ORDER BY locationid&amp;quot;;&lt;br /&gt;
$result = mysql_query($query) or die('Query failed: ' . mysql_error());&lt;br /&gt;
&lt;br /&gt;
while ($myline = mysql_fetch_assoc($result)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;&amp;lt;location&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;locationid&amp;gt;&amp;quot; . $myline['locationid'] . &amp;quot;&amp;lt;/locationid&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;street1&amp;gt;&amp;quot; . $myline['street1'] . &amp;quot;&amp;lt;/street1&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;street2&amp;gt;&amp;quot; . $myline['street2'] . &amp;quot;&amp;lt;/street2&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;city&amp;gt;&amp;quot; . $myline['city'] . &amp;quot;&amp;lt;/city&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;state&amp;gt;&amp;quot; . $myline['state'] . &amp;quot;&amp;lt;/state&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;zip&amp;gt;&amp;quot; . $myline['zip'] . &amp;quot;&amp;lt;/zip&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;&amp;lt;/location&amp;gt;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
$output.=&amp;quot;&amp;lt;/locations&amp;gt;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
echo $output;&lt;br /&gt;
?&amp;gt; &lt;/blockcode&gt; &lt;br /&gt;
All this file does is query our database for all the locations that don&amp;rsquo;t yet have a longitude or latitude, and where the &lt;strong&gt;street1 &lt;/strong&gt;column isn&amp;rsquo;t empty.&amp;nbsp; We format the output to look like XML and return it back to the &lt;strong&gt;getLocFromXML()&lt;/strong&gt; function in our &lt;code type="bash"&gt;getcoord.js&lt;/code&gt; file.&amp;nbsp; You can actually browse directly to this file and see for yourself what the output looks like.&amp;nbsp; Mine&amp;rsquo;s at &lt;a href="http://www.nerdliness.com/ajaxdemo/scripts/getxmlinfo.php" target="_blank"&gt;http://www.nerdliness.com/ajaxdemo/scripts/getxmlinfo.php&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Just about everything here is stuff we&amp;rsquo;ve seen before.&amp;nbsp; The lines are:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; include_once('config.php'); &lt;/blockcode&gt; &lt;br /&gt;
Remember that config.php file we created before?&amp;nbsp; Well, here&amp;rsquo;s where it comes into play.&amp;nbsp; Without that file and this reference to it, we&amp;rsquo;d have to include all that connection info in every file that needs to talk to the database.&amp;nbsp; Just remember to include the proper path to your config.php file, relative to the file calling it.&amp;nbsp; In my case, since both files are in the scripts/ directory, I&amp;rsquo;m good like this.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; header('Content-Type: text/xml'); &lt;/blockcode&gt; &lt;br /&gt;
Without that line, your output won&amp;rsquo;t be formatted and rendered properly.&amp;nbsp; Comment it out and your browser will treat all your element names like other HTML tags, and your &lt;strong&gt;getLocFromXML()&lt;/strong&gt; function won&amp;rsquo;t recognize it as valid XML.&amp;nbsp; If it can&amp;rsquo;t do that, it can&amp;rsquo;t parse it properly.&amp;nbsp; Don&amp;rsquo;t forget it.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt;$query = &amp;quot;SELECT locationid, name, street1, street2, city, state, zip &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM locations WHERE street1 != '' &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; AND (lat IS NULL or lng IS NULL) ORDER BY locationid&amp;quot;; &lt;/blockcode&gt; &lt;br /&gt;
This defines the query we&amp;rsquo;re using to pull the appropriate locations from our database.&amp;nbsp; We know that any addresses missing the street portion will fail, so we filter them out at this point.&amp;nbsp; We also don&amp;rsquo;t want to waste time geocoding addresses for which we already have long/lat info, so we filter those out with our &lt;strong&gt;WHERE &lt;/strong&gt;clause, too.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; $result = mysql_query($query) or die('Query failed: ' . mysql_error()); &lt;/blockcode&gt; &lt;br /&gt;
This actually submits our database query and assigns the results to &lt;strong&gt;$results&lt;/strong&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; while ($myline = mysql_fetch_assoc($result)) {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;&amp;lt;location&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;locationid&amp;gt;&amp;quot; . $myline['locationid'] . &amp;quot;&amp;lt;/locationid&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;street1&amp;gt;&amp;quot; . $myline['street1'] . &amp;quot;&amp;lt;/street1&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;street2&amp;gt;&amp;quot; . $myline['street2'] . &amp;quot;&amp;lt;/street2&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;city&amp;gt;&amp;quot; . $myline['city'] . &amp;quot;&amp;lt;/city&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;state&amp;gt;&amp;quot; . $myline['state'] . &amp;quot;&amp;lt;/state&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;\t&amp;lt;zip&amp;gt;&amp;quot; . $myline['zip'] . &amp;quot;&amp;lt;/zip&amp;gt;\n&amp;quot;;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; $output.= &amp;quot;&amp;lt;/location&amp;gt;\n&amp;quot;;&lt;br /&gt;
} &lt;/blockcode&gt; &lt;br /&gt;
For every row returned by our query and living in our &lt;strong&gt;$result&lt;/strong&gt; variable, append our &lt;strong&gt;$output&lt;/strong&gt; string with the given data.&amp;nbsp; &lt;strong&gt;$myline&lt;/strong&gt; is the current row, and &lt;strong&gt;$myline[columname]&lt;/strong&gt; is the info in the named column.&amp;nbsp; A &lt;strong&gt;\n&lt;/strong&gt; means a linebreak, while the &lt;strong&gt;\t&lt;/strong&gt; is a tab.&amp;nbsp; That&amp;rsquo;s all just to make it pretty.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; echo $output; &lt;/blockcode&gt; &lt;br /&gt;
Output the contents of &lt;strong&gt;$output&lt;/strong&gt;.&amp;nbsp; Whatever is echo'd will be returned to the requestor (the &lt;strong&gt;getLocFromXML() &lt;/strong&gt;function, or your browser if you're viewing it yourself).&lt;/p&gt;
&lt;h3&gt;insertcoord.php&lt;/h3&gt;
&lt;p&gt;&lt;br /&gt;
Finally, we use &lt;code type="bash"&gt;insertcoord.php&lt;/code&gt; to update the &lt;strong&gt;LOCATIONS &lt;/strong&gt;table with the newly obtained coordinates:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; &amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
include_once('config.php');&lt;br /&gt;
&lt;br /&gt;
$insertquery = &amp;quot;UPDATE locations SET &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
if (isset($_POST['lat']) &amp;amp;&amp;amp; isset($_POST['lng'])) {&lt;br /&gt;
&lt;br /&gt;
$loclat = $_POST['lat'];&lt;br /&gt;
$loclng = $_POST['lng'];&lt;br /&gt;
$locationid = $_POST['locationid'];&lt;br /&gt;
&lt;br /&gt;
$insertquery .= &amp;quot;lat = &amp;quot; . mysql_real_escape_string($loclat) . &amp;quot;, lng = &amp;quot; . &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_real_escape_string($loclng) . &amp;quot; WHERE locationid = &amp;quot; . &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_real_escape_string($locationid);&lt;br /&gt;
&lt;br /&gt;
$result = mysql_query($insertquery) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;or die (&amp;quot;Query failed, yo. &amp;quot; . mysql_error());&lt;br /&gt;
echo $result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt; &lt;/blockcode&gt; &lt;br /&gt;
Real similar to our &lt;code type="bash"&gt;getxmlinfo.php&lt;/code&gt; file, huh?&amp;nbsp; Again, we include the &lt;code type="bash"&gt;config.php&lt;/code&gt; file, again we&amp;rsquo;re submitting a query against our MySQL database.&amp;nbsp; This time, we&amp;rsquo;re using an &lt;strong&gt;UPDATE &lt;/strong&gt;query instead of a &lt;strong&gt;SELECT &lt;/strong&gt;query.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; if (isset($_POST['lat']) &amp;amp;&amp;amp; isset($_POST['lng'])) { &lt;/blockcode&gt; &lt;br /&gt;
Remember how we used the HTTP POST method to talk to this script?&amp;nbsp; Well, first thing we&amp;rsquo;re doing is checking to see if whatever POSTed to this script remembered to include the longitude and latitude info we&amp;rsquo;re going to need.&amp;nbsp; Without it, there&amp;rsquo;s no need to bother with the rest of the script.&amp;nbsp; We use the PHP &amp;ldquo;&lt;strong&gt;isset()&lt;/strong&gt;&amp;rdquo; function to check for those variables.&amp;nbsp; The &lt;strong&gt;&amp;amp;&amp;amp; &lt;/strong&gt;is the &amp;ldquo;and&amp;rdquo; operator, so both need to be included.&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; $loclat = $_POST['lat'];&lt;br /&gt;
$loclng = $_POST['lng'];&lt;br /&gt;
$locationid = $_POST['locationid']; &lt;/blockcode&gt; &lt;br /&gt;
We&amp;rsquo;re pulling the values for the local &lt;strong&gt;$loclat&lt;/strong&gt;, &lt;strong&gt;$loclng&lt;/strong&gt;, and &lt;strong&gt;$locationid&lt;/strong&gt; variables from the info POSTed to this script.&amp;nbsp; You could, if you were so inclined, just keep referring to them as &amp;ldquo;&lt;strong&gt;$_POST[&amp;lsquo;lat&amp;rsquo;]&lt;/strong&gt;&amp;rdquo; etc. throughout the course of your script, but I think this looks better.&amp;nbsp; Entering all that punctuation is a pain in the ass, and if you end up getting carpal tunnel your Guitar Hero skillz will go to hell in a handbasket.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="php"&gt; $insertquery .= &amp;quot;lat = &amp;quot; . mysql_real_escape_string($loclat) . &amp;quot;, lng = &amp;quot; . &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_real_escape_string($loclng) . &amp;quot; WHERE locationid = &amp;quot; . &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;mysql_real_escape_string($locationid);&lt;br /&gt;
&lt;br /&gt;
$result = mysql_query($insertquery) &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;or die (&amp;quot;Query failed, yo. &amp;quot; . mysql_error());&lt;br /&gt;
echo $result;&lt;br /&gt;
&lt;/blockcode&gt; &lt;br /&gt;
We just finished building our query and submitting it to our database.&amp;nbsp; Only thing interesting we&amp;rsquo;re doing here is using the &lt;strong&gt;mysql_real_escape_string()&lt;/strong&gt; function to try to prevent a SQL injection attack against our database.&amp;nbsp; Without that, it&amp;rsquo;s all too easy for someone who knows to POST to it some naughty SQL that could potentially bring down our precious database.&amp;nbsp; Let's make it at least a little difficult for them, please.&lt;br /&gt;
&lt;br /&gt;
Ok, so now that we have all the pieces in place, all we have to do is browse to our &lt;code type="bash"&gt;locationmassinsert.html&lt;/code&gt; file in our favorite browser.&amp;nbsp; With this design, we won&amp;rsquo;t get any feedback, but after it runs we should be able to view the underlying table and see that most of the records now have their lng and lat data.&lt;br /&gt;
&lt;br /&gt;
One thing I&amp;rsquo;ve noticed with this script, though, is that it sometimes needs to be refreshed a couple of times before all the records are updated.&amp;nbsp; I&amp;rsquo;m guessing it has something to do with Google either limiting the number of geocoding requests you can send at one time, or an inherent limitation with the whole asynchronous nature of the requests we&amp;rsquo;re sending.&amp;nbsp; Not a big deal in this case as all we have to do is hit the refresh button in our browser to give it another go.&lt;br /&gt;
&lt;br /&gt;
Next installment, we&amp;rsquo;ll start working on the whole Map part of the Google Maps mashup equation.&amp;nbsp; Fire away with any questions.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/H0Dazt68mxrVU-soptdzRiVZfKo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H0Dazt68mxrVU-soptdzRiVZfKo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/H0Dazt68mxrVU-soptdzRiVZfKo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/H0Dazt68mxrVU-soptdzRiVZfKo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=OCNap7WpfrY:_PzLMd6-ieI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=OCNap7WpfrY:_PzLMd6-ieI:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=OCNap7WpfrY:_PzLMd6-ieI:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=OCNap7WpfrY:_PzLMd6-ieI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=OCNap7WpfrY:_PzLMd6-ieI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=OCNap7WpfrY:_PzLMd6-ieI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=OCNap7WpfrY:_PzLMd6-ieI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=OCNap7WpfrY:_PzLMd6-ieI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=OCNap7WpfrY:_PzLMd6-ieI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=OCNap7WpfrY:_PzLMd6-ieI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/OCNap7WpfrY" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/ajax">AJAX</category>
 <category domain="http://www.nerdliness.com/category/advice">General Advice</category>
 <category domain="http://www.nerdliness.com/category/google">Google</category>
 <category domain="http://www.nerdliness.com/category/mysql">MySQL</category>
 <category domain="http://www.nerdliness.com/category/php">PHP</category>
 <enclosure url="http://www.nerdliness.com/sites/default/files/files/updatelnglat.zip" length="2780" type="application/x-zip-compressed" />
 <pubDate>Mon, 07 Jan 2008 15:49:50 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">46 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/12/28/google-maps-amazon-banned-books-mashup-part-2</feedburner:origLink></item>
<item>
 <title>The Power of template.php</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/1WS8zsuzTdY/power-template-php</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;A few techniques to help your designers.&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Theming a fresh Drupal site always gives the designers true glory. Well, its time that I help out my fellow programmers. After all, without us, its just a pretty drupal core.&lt;/p&gt;
&lt;p&gt;First things first. I'm assuming that you and the designer are working on a clean theme, like zen. I'm also assuming the use of Drupal 5. Most of the code is available via drupal.org.&lt;/p&gt;
&lt;p&gt;So what kinds of things can you do?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Custom id and class tags&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The most important thing to know is that Drupal allows the modification of theme functions within this file. This means any function within a module or within the Drupal core that begins with name &lt;em&gt;theme_xxx &lt;/em&gt;can be hooked into and modified to include elements to assist the designer, i.e. adding 'id' or 'class' tags.&lt;/p&gt;
&lt;p&gt;Let's say, for example, you'd like to modify the menu items. Your designer wants to be able to add special attributes to each menu item, but needs a unique id tag for each list element. Because there is a theme_menu_item function in the core menu.inc file, we can simply create a phptemplate_menu_item function in template.php that overrides how the menu item is displayed. This avoids touching the actual core function (a big no-no in Drupaland) and keeps our mods in one location as upgrades are performed, assuming your template.php file is in the sites -&amp;gt; default -&amp;gt; themes directory (which it should be).&lt;/p&gt;
&lt;p&gt;To add custom id tags to each menu item, as well as add an 'active' class when the user is on that particular page, try:&lt;/p&gt;
&lt;blockcode type="php"&gt;
/**
* Implementation of theme_menu_item().
*
* Add active class and custom id to current menu item links.
*/

function phptemplate_menu_item($mid, $children = '', $leaf = TRUE) {
  $item = menu_get_item($mid); // get current menu item

  // decide whether to add the active class to this menu item
  if ((drupal_get_normal_path($item['path']) == $_GET['q']) // if menu item path...
  || (drupal_is_front_page() &amp;&amp; $item['path'] == '&lt;front&gt;')) { // or front page...
    $active_class = ' active'; // set active class
  } else { // otherwise...
    $active_class = ''; // do nothing
  }
  
  $attribs = isset($item['description']) ? 
array('title' =&gt; $item['description']) : array();
  $replace = array(' ', '&amp;');
  $attribs['id'] = 'menu-'. str_replace($replace, '-', strtolower($item['title']));

  return 
'&lt;li class="'. ($leaf ? 'leaf' : ($children ? 'expanded' : 'collapsed')) . 
$active_class .'" id="'. $attribs['id'] . '"&gt;' . 
menu_item_link($mid) . $children ."&lt;/li&gt;\n";
}
&lt;/blockcode&gt;
&lt;p&gt;The key to this function is the line:&lt;/p&gt;
&lt;p&gt;&lt;blockcode&gt; $attribs['id'] = 'menu-'. str_replace($replace, '-', strtolower($item['title'])); &lt;/blockcode&gt;&lt;/p&gt;
&lt;p&gt;This creates a value in the $attributes array with a key of 'id' equal to the value of string 'menu-' concatenated to the actual name of the menu item. As long as each menu item has a unique name, a unique id is generated and the style can be crafted accordingly.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Different designs for different pages&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Maybe you have a front 'splash' page, a 'home' page, and then the rest of your site. This is typically true for new startups providing a web service. You'd like new visitors to have a very simple experience showcasing your service, logged-in users to have an array of links to choose from, and something different once users are using the service.&lt;/p&gt;
&lt;p&gt;By default, pages and nodes will use the page.tpl.php and node.tpl.php, respectively. To have your 'front' and 'home' pages use a different template file, you need something to translate what page the user is on (via the url) and select the appropriately named file. As outlined in the &lt;a href="http://drupal.org/node/139766"&gt;theme developer's guide&lt;/a&gt; of drupal.org, the template.php file can accomplish this within the _phptemplate_variables() function, specifically within the switch case of 'page'. If you're using the localization module, you'll want to edit the function slightly to allow for the prepend of the language:&lt;/p&gt;
&lt;blockcode type="php"&gt;
      if (module_exists('path')) {
        $alias = drupal_get_path_alias($_GET['q']);
        if ($alias != $_GET['q']) {
          $suggestions = array();
          $template_filename = 'page';
          $alias = explode('/', $alias);
          array_shift($alias);
          foreach ($alias as $path_part) {
            $template_filename = $template_filename . '-' . $path_part;
            $suggestions[] = $template_filename;
          }
        }
        $vars['template_files'] = $suggestions;
      }
&lt;/blockcode&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Views Theme Wizard&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;As you create your views, customization can add more depth to your design. Although you may want to create multiple views that group by specific elements, each view doesn't need to &lt;em&gt;look&lt;/em&gt; the same even if they &lt;em&gt;function &lt;/em&gt;the same. An example would be creating a view that showcases events and groups them by date and one that showcases events and groups them by category.&lt;/p&gt;
&lt;p&gt;Answer: Use the views theme wizard. This function automatically generates the proper code for you to place inside your template.php file and create the proper template files for your designer to manipulate.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CMOBSssVbo32WmjvWaINgUykesc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CMOBSssVbo32WmjvWaINgUykesc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CMOBSssVbo32WmjvWaINgUykesc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CMOBSssVbo32WmjvWaINgUykesc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=1WS8zsuzTdY:lAE2ZR8xpb0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=1WS8zsuzTdY:lAE2ZR8xpb0:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=1WS8zsuzTdY:lAE2ZR8xpb0:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=1WS8zsuzTdY:lAE2ZR8xpb0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=1WS8zsuzTdY:lAE2ZR8xpb0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=1WS8zsuzTdY:lAE2ZR8xpb0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=1WS8zsuzTdY:lAE2ZR8xpb0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=1WS8zsuzTdY:lAE2ZR8xpb0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=1WS8zsuzTdY:lAE2ZR8xpb0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=1WS8zsuzTdY:lAE2ZR8xpb0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/1WS8zsuzTdY" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/php">PHP</category>
 <pubDate>Wed, 02 Jan 2008 05:27:22 +0000</pubDate>
 <dc:creator>fredric</dc:creator>
 <guid isPermaLink="false">48 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2008/01/01/power-template-php</feedburner:origLink></item>
<item>
 <title>Creating a Google Maps/Amazon.com/Banned Books Mashup</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/6eOa0BW2efs/creating-google-maps-amazon-com-banned-books-mashup</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Part One of God Only Knows How Many Steps...&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;And now for something completely different&amp;hellip;&lt;br /&gt;
&lt;br /&gt;
Sorry to disappoint all the little nerdlings who come around here only for the Drupal goods, but today&amp;rsquo;s post won&amp;rsquo;t be at all related to our favorite CMS.&amp;nbsp; We&amp;rsquo;ve talked about different Drupaly topics for weeks, now it&amp;rsquo;s time to shake things up a little.&amp;nbsp; Today, kids, we&amp;rsquo;re going to make a basic Google Maps mashup.&lt;br /&gt;
&lt;br /&gt;
Yeah, I know.&amp;nbsp; The world needs another Google Maps mashup like I need a hole in my head, right?&amp;nbsp; Who cares.&amp;nbsp; They&amp;rsquo;re fun, and we&amp;rsquo;ll try to make our sample a little more interesting by throwing in a little Amazon.com action and some AJAX-y goodness. &lt;br /&gt;
&lt;br /&gt;
So here&amp;rsquo;s what we&amp;rsquo;re shooting for:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.nerdliness.com/ajaxdemo/" target="_blank"&gt;http://www.nerdliness.com/ajaxdemo/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
First of all, don&amp;rsquo;t laugh.&amp;nbsp; Jeremy&amp;rsquo;s the form guy, I only do function.&amp;nbsp; Sure, it ain&amp;rsquo;t much to look at, but it works and it&amp;rsquo;s kinda cool.&amp;nbsp; And if we wanted it to look nice, we&amp;rsquo;d pay Jeremy his surprisingly reasonable freelance rate to pretty it up for us.&lt;br /&gt;
&lt;br /&gt;
Ok, so what&amp;rsquo;s the big deal?&amp;nbsp; What are we doing on that page?&amp;nbsp;&amp;nbsp; In a nutshell, we&amp;rsquo;re plotting, on the fly, the locations of every public school in Texas that, according to the ACLU of Texas, banned a book during 2006.&amp;nbsp; I took the data from a PDF they release annually (&lt;a href="http://www.aclutx.org/projects/bannedbookspg.php?pid=45" target="_blank"&gt;http://www.aclutx.org/projects/bannedbookspg.php?pid=45&lt;/a&gt;) and used it to populate a MySQL table with the various data you see by clicking on the assorted links.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The data is sent over to the fine people at Google to plot the little book icons on the map when you click on various links.&amp;nbsp; When you click on the icon on the map itself, we hit the database again to display the location&amp;rsquo;s info (address, etc).&amp;nbsp; At the same time, we send a request to Amazon.com to get the info we need to dynamically create links to their product info pages for the various book titles.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Finally, we&amp;rsquo;re using some AJAX to narrow down your search results as you type.&amp;nbsp; For instance, if you click Book Info and start typing the word &amp;ldquo;The,&amp;rdquo; you&amp;rsquo;ll see that the list is updated with every press of the key to show just the titles that contain what you&amp;rsquo;ve typed so far.&amp;nbsp; You can then click on the title of the book in question to plot its location on the map.&lt;br /&gt;
&lt;br /&gt;
Now, a couple of disclaimers.&amp;nbsp; First, this sample is far from perfect.&amp;nbsp; Not only is it about as pretty as the Sam, the three-time World&amp;rsquo;s Ugliest Dog champ (&lt;a href="http://www.snopes.com/photos/animals/uglydog.asp" target="_blank"&gt;http://www.snopes.com/photos/animals/uglydog.asp&lt;/a&gt;), but it doesn&amp;rsquo;t function quite the way you&amp;rsquo;d expect.&amp;nbsp; Information you might think would appear in one area doesn&amp;rsquo;t show up unless you click on a book icon, for instance.&amp;nbsp; Not very intuitive and certainly not a finished product.&amp;nbsp; Still, though, it&amp;rsquo;s good enough to give you an idea of what you can do and how you might do it.&lt;br /&gt;
&lt;br /&gt;
Second, as with everything we do here, the sample code should be accepted &amp;ldquo;as-is,&amp;rdquo; with no guarantee implied.&amp;nbsp; I&amp;rsquo;ll provide it all at the end, but use it at your own risk.&amp;nbsp; I don&amp;rsquo;t think anything will blow up if you use it, but consider yourself warned.&lt;br /&gt;
&lt;br /&gt;
Finally, while this little tutorial is intended for the beginner, there are a few prerequisites if you want to play the home version:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;You need a Google Maps API key.&amp;nbsp; They&amp;rsquo;re free and easily obtained, but they&amp;rsquo;re also uniquely assigned based on your domain name.&amp;nbsp; While you might see the Nerdliness.com one in my samples, it simply won&amp;rsquo;t work for you.&amp;nbsp; Get your own here:&amp;nbsp; &lt;a href="http://code.google.com/apis/maps/signup.html" target="_blank"&gt;http://code.google.com/apis/maps/signup.html&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;If you&amp;rsquo;re interested in the Amazon.com part, you&amp;rsquo;ll need to sign up with them, too.&amp;nbsp; It&amp;rsquo;s also free and you can earn a commission on any sales you generate.&amp;nbsp; Sign up for that here:&amp;nbsp; &lt;a href="https://affiliate-program.amazon.com/" target="_blank"&gt;https://affiliate-program.amazon.com/&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;Some sort of database.&amp;nbsp; I&amp;rsquo;m using MySQL for the backend database.&amp;nbsp; You can use whatever database you like, but you might need to adjust the various queries accordingly.&lt;/li&gt;
    &lt;li&gt;PHP.&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;
Other than that, you just need your favorite text editor and the ability to follow directions.&amp;nbsp; A little HTML/SQL/PHP/JavaScript knowledge wouldn&amp;rsquo;t kill you, but it&amp;rsquo;s totally not necessary.&amp;nbsp; I'm assuming you don't know much.&lt;br /&gt;
&lt;br /&gt;
One last thing before we get started&amp;hellip;&amp;nbsp; this will be a multipart post, but I have no idea exactly how many parts we&amp;rsquo;re looking at.&amp;nbsp; Sorta depends on how things look as we get going.&amp;nbsp; Subsequent parts should be posted within a couple of days, a week tops, though they might be broken up by additional Drupalesque posts from Jeremy and/or Fredric.&lt;br /&gt;
&lt;br /&gt;
Ok, so in today&amp;rsquo;s post, we&amp;rsquo;re just going to set things up.&amp;nbsp; If you haven&amp;rsquo;t obtained that Google Maps API key I mentioned above, do that now.&amp;nbsp; Go ahead.&amp;nbsp; I&amp;rsquo;ll wait&amp;hellip;&amp;nbsp; If you want to play the Amazon game, then snag that, too.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Done?&amp;nbsp; Great.&amp;nbsp; Now, let&amp;rsquo;s get you some data.&amp;nbsp; Like I mentioned before, our example is plotting some banned book information strip out of a PDF posted on the ACLU of Texas website (http://www.aclutx.org).&amp;nbsp; Believe me when I say that massaging that data was a long, tedious process, one that I don&amp;rsquo;t care to repeat any time soon and that I wouldn&amp;rsquo;t wish on you, gentle reader.&amp;nbsp; Instead, I&amp;rsquo;ll give you a shortcut.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Download this zip file:&amp;nbsp; &lt;a href="http://www.nerdliness.com/files/sqlsetup.zip"&gt;http://www.nerdliness.com/files/sqlsetup.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Inside, you&amp;rsquo;ll find several SQL scripts that will create the tables we need for this experiment and fill them with the data stripped from the ACLU PDF.&amp;nbsp; Because of the relationships between the tables, you&amp;rsquo;ll need to make sure to run the scripts in the following order:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;createmysqltables.sql&lt;/li&gt;
    &lt;li&gt;authors.sql&lt;/li&gt;
    &lt;li&gt;books.sql&lt;/li&gt;
    &lt;li&gt;locations.sql&lt;/li&gt;
    &lt;li&gt;reasons.sql&lt;/li&gt;
    &lt;li&gt;bookauthors.sql&lt;/li&gt;
    &lt;li&gt;challenges.sql&lt;/li&gt;
    &lt;li&gt;challengereasons.sql&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;
Of course, being the astute and savvy Internet user you are, you&amp;rsquo;ll be looking at these scripts before you actual execute them, right?&amp;nbsp; I certainly wouldn&amp;rsquo;t trust some faceless yahoo&amp;hellip;&lt;br /&gt;
&lt;br /&gt;
And having looked at the scripts, you&amp;rsquo;ll notice a couple of things.&amp;nbsp; First, we&amp;rsquo;re creating a fairly normalized database consisting of seven tables.&amp;nbsp; The relationships look something like this:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div align="center"&gt;&lt;a href="http://www.nerdliness.com/userfiles/image/images/erd.jpg" target="_blank"&gt;&lt;img width="262" height="276" border="1" src="/userfiles/image/images/erd.jpg" alt="Nerdliness.com Entity-Relationship Diagram for Banned Book Database" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
For those of you who aren&amp;rsquo;t database people, that there&amp;rsquo;s what ya call an Entity-Relationship Diagram.&amp;nbsp; As the name implies, it provides a visual representation of the relationships between various entities.&amp;nbsp; In this case, each entity is a table in our database.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Each square is a table in our database, and the information listed in the square tells you a little something about that particular table.&amp;nbsp; For example, the CHALLENGES table is represented by a block with the word &amp;ldquo;challenges&amp;rdquo; at the top.&amp;nbsp; Simple, huh?&amp;nbsp; Within that block, you can see a list of the various columns within that table (challengeid, locationid, bookid, actiontaken, notes, challengeyear).&amp;nbsp; Any columns that are part of a Primary Key are listed at the top, underlined, and have the letters PK to the left.&amp;nbsp; Columns in a Foreign Key relationship (a value listed in this table that&amp;rsquo;s a Primary Key in another table) are labeled FK.&amp;nbsp; Finally, required columns (those created using the NOT NULL SQL clause) are in bold.&lt;br /&gt;
&lt;br /&gt;
The lines between the different entities tell you about the relationship between them.&amp;nbsp; For instance, look at the line connecting the LOCATIONS table with the CHALLENGES table.&amp;nbsp; That particular relationship is called a one-to-many relationship, meaning that each CHALLENGE we log in the database is mapped to exactly one specific LOCATION.&amp;nbsp; However, each LOCATION could potentially issue one or more challenges.&amp;nbsp; But I digress&amp;hellip;&amp;nbsp; if you want more on E-R Diagrams, talk to Google.&lt;br /&gt;
&lt;br /&gt;
Second thing you might notice is that we&amp;rsquo;re not filling in all the data in the LOCATIONS table.&amp;nbsp; Why?&amp;nbsp; Well, it has to do with geocoding.&lt;br /&gt;
&lt;br /&gt;
See, Google Maps can&amp;rsquo;t just plot any old location just by the address.&amp;nbsp; Instead, it plots them out according to the longitude and latitude of the place in question.&amp;nbsp; That process of translating a street address into its longitudinal and latitudinal coordinates is called geocoding.&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
The Google Maps API will allow you to geocode addresses on the fly.&amp;nbsp; In fact, that&amp;rsquo;s how I originally set up this example&amp;hellip;&amp;nbsp; every time I clicked on a location, I&amp;rsquo;d send a request to Google to geocode that address.&amp;nbsp; When that one came back, I&amp;rsquo;d send another request to actually plot the point.&lt;br /&gt;
&lt;br /&gt;
That method lends itself to a couple of problems.&amp;nbsp; First, it greatly increases the amount of time it takes to plot out points.&amp;nbsp; Geocoding is an expensive process (resource-wise, not necessarily monetarily).&amp;nbsp; When you geocode every point every time, loading the page can take a while.&amp;nbsp; In some situations, you might not have a choice.&amp;nbsp; Want to map a moving target?&amp;nbsp; You&amp;rsquo;ll have to geocode on the fly.&amp;nbsp; In our case, though, them schools ain&amp;rsquo;t going any where, so we&amp;rsquo;re pretty safe to geocode once and store the data in our table for future use.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
The second problem is that the code needs to be a little more robust if you&amp;rsquo;re geocoding on the fly.&amp;nbsp; What happens if you have a malformed address in the mix and your code fails trying to geocode it?&amp;nbsp; If you don&amp;rsquo;t take that into account, your code might choke every time you try to plot that point.&amp;nbsp; I&amp;rsquo;m lazy.&amp;nbsp; I like the idea of running the script one time, monitoring for failures, and dealing with them by simply ignoring any entries in the database missing the longitude and latitude info.&lt;/p&gt;
&lt;p&gt;And this, my friends, is where we're going to leave off for today.&amp;nbsp; Tune in next time as we create our first little bit o' AJAX to geocode all our addresses and fill in the rest of the blanks in our table.&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cZ7iGNIv8pZ-lqQU7r8XANkUzTw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cZ7iGNIv8pZ-lqQU7r8XANkUzTw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cZ7iGNIv8pZ-lqQU7r8XANkUzTw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cZ7iGNIv8pZ-lqQU7r8XANkUzTw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6eOa0BW2efs:x6on2YtZylU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6eOa0BW2efs:x6on2YtZylU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6eOa0BW2efs:x6on2YtZylU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6eOa0BW2efs:x6on2YtZylU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6eOa0BW2efs:x6on2YtZylU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6eOa0BW2efs:x6on2YtZylU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6eOa0BW2efs:x6on2YtZylU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6eOa0BW2efs:x6on2YtZylU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=6eOa0BW2efs:x6on2YtZylU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=6eOa0BW2efs:x6on2YtZylU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/6eOa0BW2efs" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/ajax">AJAX</category>
 <category domain="http://www.nerdliness.com/category/advice">General Advice</category>
 <category domain="http://www.nerdliness.com/category/google">Google</category>
 <category domain="http://www.nerdliness.com/category/javascript-0">JavaScript</category>
 <category domain="http://www.nerdliness.com/category/mysql">MySQL</category>
 <category domain="http://www.nerdliness.com/category/php">PHP</category>
 <enclosure url="http://www.nerdliness.com/sites/default/files/files/sqlsetup.zip" length="9057" type="application/x-zip-compressed" />
 <pubDate>Thu, 27 Dec 2007 22:20:27 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">45 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/12/27/creating-google-maps-amazon-com-banned-books-mashup</feedburner:origLink></item>
<item>
 <title>Drupal Admin Theme</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/kZ4n-feWkAQ/drupal-admin-theme</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Designed as an admin theme yet can be used as a regular theme&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;I started working on an admin theme for Drupal over two months ago in my spare time and just got around to packaging it up offering it up for download. I've used it on a a few client's sites and they seem to like it so hopefully someone else can get some use out of it.&lt;/p&gt;
&lt;p&gt;As you may or may not know Drupal has the ability to switch from your site's theme to an admin theme when the user is logged in as an admin and in the &amp;quot;/admin&amp;quot; URL. Typically I used the Garland theme for this purpose as it looks different than any theme I've made so it's easy to tell if you the user are in the &amp;quot;admin&amp;quot; area as opposed to viewing a site. Not to mention the Garland theme looks and and works great too.&lt;/p&gt;
&lt;p&gt;The only annoyance I've had with switching over to an admin theme is that when you go to edit a page it takes you to the &amp;quot;edit&amp;quot; page but still uses your site's theme. This can get confusing as you are in the admin menu but yet your theme isn't using the admin theme you selected. To fix this I created a module for my theme which uses my Drupal admin theme for the &amp;quot;add&amp;quot;, &amp;quot;edit&amp;quot; and &amp;quot;delete&amp;quot; pages.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Screenshot of my Drupal admin theme:&lt;/strong&gt;&lt;br /&gt;
&lt;img alt="Drupal admin theme" src="http://nerdliness.com/files/download/drupaladmin.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;So if you download my Drupal admin theme be sure to install the module for it as well. Also be sure to activate it through the &amp;quot;modules&amp;quot; page. It probably won't work for everyone but it seems to do the job for me and my clients so far. Feel free to rip it apart and make it your own.&lt;/p&gt;
&lt;p&gt;Ready to give it a try? Go ahead and download my &lt;a href="http://drupal.org/project/nerdalistic"&gt;Drupal admin theme.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also &lt;a href="http://nerdliness.com/files/drupaladmin.zip"&gt;grab the module here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you like the theme or have any ideas on how to improve it please let me know as it's still a work in progress. I'm pretty sure I'll update it to Drupal 6 when that becomes officially released. It can also be used as a regular theme for your site - not just an admin theme.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ypvOulBkYlufvDlisAeisuHnJPs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ypvOulBkYlufvDlisAeisuHnJPs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ypvOulBkYlufvDlisAeisuHnJPs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ypvOulBkYlufvDlisAeisuHnJPs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=kZ4n-feWkAQ:LT_U-YNhCCo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=kZ4n-feWkAQ:LT_U-YNhCCo:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=kZ4n-feWkAQ:LT_U-YNhCCo:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=kZ4n-feWkAQ:LT_U-YNhCCo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=kZ4n-feWkAQ:LT_U-YNhCCo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=kZ4n-feWkAQ:LT_U-YNhCCo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=kZ4n-feWkAQ:LT_U-YNhCCo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=kZ4n-feWkAQ:LT_U-YNhCCo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=kZ4n-feWkAQ:LT_U-YNhCCo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=kZ4n-feWkAQ:LT_U-YNhCCo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/kZ4n-feWkAQ" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/x-html-0">(X)HTML</category>
 <category domain="http://www.nerdliness.com/category/css-0">CSS</category>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <pubDate>Mon, 03 Dec 2007 02:16:09 +0000</pubDate>
 <dc:creator>jeremy</dc:creator>
 <guid isPermaLink="false">44 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/12/02/drupal-admin-theme</feedburner:origLink></item>
<item>
 <title>Simplemenu Module Customizations</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/NPHRtnPzkgA/simplemenu-module-customizations</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;Making a great Drupal admin menu better&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;I'm a big fan of the Simplemenu module for Drupal as it's quite a time-saver when developing a site. It's really handy to have the entire admin menu right at the top of each page.&lt;/p&gt;
&lt;p&gt;Clients also love it for it's ease of use and they don't have to navigate to &amp;quot;/admin&amp;quot; everytime they log in and want to make a change to the site. Now they can just hover over the option the want on the top navigation bar accross their browser and drill down to the specific page they want. Very handy and much quicker than manually drilling down to each page. It's been a real time-saver for me so far.&lt;/p&gt;
&lt;p&gt;As soon as I installed Simplemenu I knew it was a module I was going to use for quite some time. That's the reason I wanted to skin it and make it look/work better for me and my clients. I also implemented it into a custom Drupal admin theme I am working on which I will release real soon. So check back for that one early next week.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;My custom menu:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img align="middle" alt="Custom Simplemenu" src="http://nerdliness.com/files/simplemenu_top.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Although my changes are minor I would stil like to thank the author for creating such a useful module written by &lt;a target="_blank" href="http://tedserbinski.com"&gt;Ted Serbinski,&lt;/a&gt; aka, m3avrck. I took what he had supplied and modified the CSS, JavaScript (just a little) and added a few new images.&lt;/p&gt;
&lt;p&gt;These changes look and work great in Safari, FireFox and IE7. It works in IE6 just fine but the top level menu background doesn't stay colored when you drill down to the sub menus. I'm sure it's an easy fix but I didn't bother researching it much since..well it's IE6. If anyone wants me to fix it then please let me know and I'll give it a shot.&lt;/p&gt;
&lt;p&gt;So for now - if you'd like you can &lt;a href="http://nerdliness.com//files/download/simplemenu-nerdliness.zip"&gt;go ahead and download&lt;/a&gt; my modified version of the Simplemenu module for Drupal.&lt;/p&gt;
&lt;p&gt;Please direct all feedback/comments/questions to me in this thread so I can update and improve it as needed.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wG7wAr4xFlG4IRDWl7HLci7e8L4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wG7wAr4xFlG4IRDWl7HLci7e8L4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wG7wAr4xFlG4IRDWl7HLci7e8L4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wG7wAr4xFlG4IRDWl7HLci7e8L4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=NPHRtnPzkgA:cOw9Ric7ztg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=NPHRtnPzkgA:cOw9Ric7ztg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=NPHRtnPzkgA:cOw9Ric7ztg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=NPHRtnPzkgA:cOw9Ric7ztg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=NPHRtnPzkgA:cOw9Ric7ztg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=NPHRtnPzkgA:cOw9Ric7ztg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=NPHRtnPzkgA:cOw9Ric7ztg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=NPHRtnPzkgA:cOw9Ric7ztg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=NPHRtnPzkgA:cOw9Ric7ztg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=NPHRtnPzkgA:cOw9Ric7ztg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/NPHRtnPzkgA" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/x-html-0">(X)HTML</category>
 <category domain="http://www.nerdliness.com/category/css-0">CSS</category>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/javascript-0">JavaScript</category>
 <pubDate>Thu, 01 Nov 2007 18:32:41 +0000</pubDate>
 <dc:creator>jeremy</dc:creator>
 <guid isPermaLink="false">43 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/11/01/simplemenu-module-customizations</feedburner:origLink></item>
<item>
 <title>Half-time at PostgreSQL Conference Fall 2007</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/zp-0734jww4/half-time-postgresql-conference-fall-2007</link>
 <description>&lt;!-- google_ad_section_start --&gt;&lt;p&gt;Half way through the talks, sitting here feeling full and fat after my jumbo chicken burrito from Taco Del Mar (only place I could walk to without getting drenched en route).&lt;/p&gt;
&lt;p&gt;As I mentioned before, I originally hoped to blog all through this continuously, but the aforementioned Murphy's Law screwed that all to hell.&amp;nbsp; No sooner had I hit the &amp;quot;submit&amp;quot; button on that first post after suggesting that things would go to pot that someone sat down next to me and spilled his coffee on me.&amp;nbsp; Missed the laptop, thankfully, but got me and my seat.&amp;nbsp; Had to relocate to an area that's turned out to be impossible to type from.&amp;nbsp; Good news, though, is that the hot coffee warmed me up after the cold, wet walk in...&amp;nbsp;&lt;/p&gt;
&lt;p&gt;First up was a pretty good talk by Josh Berkus about the features in the upcoming 8.3 version.&amp;nbsp; She's in beta now with a hopefully release date of December 1st-ish.&amp;nbsp; That's assuming, of course, that some of us get off our lazy arses, download the current beta, and start hammering on it.&amp;nbsp; Go ahead.&amp;nbsp; Do that now.&amp;nbsp; I'll post more details about some of the features Josh talked about in a later article once I've put my notes together.&lt;/p&gt;
&lt;p&gt;Second up was David Wheeler, giving a quick once over on Rails for PostgreSQL people.&amp;nbsp; My exposure to Ruby and Rails is all second-hand at this point (I worked some place that started using Ruby on Rails, but never had first-hand experience with it), so I'm not really the right person to give a detailed account of his talk.&amp;nbsp; In all honesty, the only thing I can really remember clearly right now was the line he gave when he was trying to take control of his session again during an ad hoc Q&amp;amp;A that began about stuffing methods:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;quot;The point is you can reopen the Rails classes and you can fuck 'em up.&amp;quot;&amp;nbsp; I loved it.&amp;nbsp; Good form, Dave.&lt;/p&gt;
&lt;p&gt;Next came Robert Hodges, CTO of Continuent.&amp;nbsp; Robert managed to walk the line between just giving his company's schpiel (they create middleware for clustering PostgreSQL and MySQL farms) and giving an informative talk on the hassles of scaling databases.&amp;nbsp; If his data is true (and considering his delivery I don't have any reason to think he'd intentionally mislead us), it looks like their uni/cluster product does a great job.&amp;nbsp; You don't get exactly linear improvement as you add nodes (in other words, adding a second server doesn't exactly double performance), but it looks like a good solution for companies that've outgrown their single server databases.&amp;nbsp; Again, more on this later.&lt;/p&gt;
&lt;p&gt;Last before lunch was Neil Conway and his presentation on PostgreSQL query execution.&amp;nbsp; I really hate to admit this, but I didn't pay nearly enough attention to this one.&amp;nbsp; Right before lunch, I was cold and tired, and had just received a text message from my wife that our bloody roof (one we just had replaced entirely last year) was leaking again.&amp;nbsp; Suffice to say, I was a little distracted.&amp;nbsp; Sorry, Neil.&amp;nbsp; Good news, though, is that Neil's presentation should be thrown online in the near future, so we'll all be able to catch what we missed.&lt;/p&gt;
&lt;p&gt;Oh, and I almost just had ANOTHER cup of coffee spilled on me.&amp;nbsp; Not my day...&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/s5Mr2B1rqlWmvZuUtUV7KFhzJLk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s5Mr2B1rqlWmvZuUtUV7KFhzJLk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/s5Mr2B1rqlWmvZuUtUV7KFhzJLk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/s5Mr2B1rqlWmvZuUtUV7KFhzJLk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=zp-0734jww4:VN7KOe-3IME:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=zp-0734jww4:VN7KOe-3IME:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=zp-0734jww4:VN7KOe-3IME:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=zp-0734jww4:VN7KOe-3IME:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=zp-0734jww4:VN7KOe-3IME:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=zp-0734jww4:VN7KOe-3IME:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=zp-0734jww4:VN7KOe-3IME:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=zp-0734jww4:VN7KOe-3IME:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=zp-0734jww4:VN7KOe-3IME:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=zp-0734jww4:VN7KOe-3IME:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/zp-0734jww4" height="1" width="1"/&gt;</description>
 <pubDate>Sat, 20 Oct 2007 20:26:26 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">42 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/half-time-postgresql-conference-fall-2007</feedburner:origLink></item>
<item>
 <title>Coming Attractions</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/2iEl5q1PXmo/coming-attractions</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;DBAs meet and Portland Ignites&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Couple of events going down in the Portland area over the next week or two that all the cool kids are going to attend (i.e. me and any other nerds who can sneak past their mom/wife/partner/WoW).&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;PostgreSQL Conference Fall 2007&lt;/h3&gt;
&lt;/p&gt;
&lt;p&gt;Ah, PostgreSQL...&amp;nbsp; The Other White Meat.&amp;nbsp; Or, at least, the Other Open Source DB.&amp;nbsp; Those cooky kids are throwing their little conference at Portland State University in the heart of increasingly-less-sunny-as-fall-hits-its-stride Stumptown this coming Saturday, October 20th.&amp;nbsp; You need to preregister and scrounge up sixty tax-deductible bucks to get in ($10 if you're a student/faculty), but the topics and speakers look worth every penny.&amp;nbsp; The Rails applications talk sounds interesting, and I have a soft spot for the GIS stuff (PostGIS talk at 2:15 PST).&amp;nbsp; Oh, and don't forget the morning meet-n-greet and the after-dinner/party.&lt;br /&gt;
&lt;br /&gt;
Read more and register at &lt;a href="http://www.postgresqlconference.org" target="_blank"&gt;http://www.postgresqlconference.org&lt;/a&gt;, and if you happen to see a goofy blonde guy who bears a striking resemblance to the picture on your right, say &amp;quot;hi.&amp;quot;&lt;/p&gt;
&lt;h3&gt;Ignite Portland&lt;/h3&gt;
&lt;p&gt;Ignite Portland's goin' down on Thursday, October 25 at Wieden+Kennedy in uber-trendy Northwest Portland.&amp;nbsp; Free to anyone who decides to browse over to &lt;a href="http://upcoming.yahoo.com/event/265888/" target="_blank"&gt;http://upcoming.yahoo.com/event/265888/&lt;/a&gt; and get their RSVP on.&amp;nbsp; Yes, I said &amp;quot;free.&amp;quot;&amp;nbsp; As in, no cost.&amp;nbsp; Looks like there are currently 181 PDXers on the list right now, should be fun.&lt;br /&gt;
&lt;br /&gt;
But what the hell is &amp;quot;Ignite Portland.&amp;quot;&amp;nbsp; Hell if I know.&amp;nbsp; The jist of it is that speakers have 5 minutes to talk about just about anything.&amp;nbsp; They get 20 slides that rotate after 15 seconds, pretty much guaranteeing a fast clip.&amp;nbsp; Take a look at the clip on the Ignite Portland page for an example (&lt;a href="http://www.igniteportland.com/" target="_blank"&gt;http://www.igniteportland.com/&lt;/a&gt;).&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
They haven't posted the list of presenters and topics yet, but if the roll calls from previous Ignites is any indication, it should be a hoot.&amp;nbsp; And given the fact that Portlanders are genetically predisposed to attempt to out-wacky people in other metro areas, well, I'm expecting great things.&amp;nbsp; Worst case scenario?&amp;nbsp; Well, each presentation is only 5 minutes long.&amp;nbsp; I can put up with even the worst speaker for that long, knowing the hook's coming out soon.&lt;br /&gt;
&lt;br /&gt;
By the way, the Ignite people need more sponsors, so if this kind of crowd's the type o' people your business wants to reach or if you have a wealthy eccentric uncle looking to splurge, head to &lt;a href="http://www.igniteportland.com/sponsorships/" target="_blank"&gt;http://www.igniteportland.com/sponsorships/&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/eYnzUQwS31LRBRAiQTb3oi-gWqA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eYnzUQwS31LRBRAiQTb3oi-gWqA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/eYnzUQwS31LRBRAiQTb3oi-gWqA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/eYnzUQwS31LRBRAiQTb3oi-gWqA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2iEl5q1PXmo:0zuE4ZYHmzY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2iEl5q1PXmo:0zuE4ZYHmzY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2iEl5q1PXmo:0zuE4ZYHmzY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2iEl5q1PXmo:0zuE4ZYHmzY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2iEl5q1PXmo:0zuE4ZYHmzY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2iEl5q1PXmo:0zuE4ZYHmzY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2iEl5q1PXmo:0zuE4ZYHmzY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2iEl5q1PXmo:0zuE4ZYHmzY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=2iEl5q1PXmo:0zuE4ZYHmzY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=2iEl5q1PXmo:0zuE4ZYHmzY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/2iEl5q1PXmo" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/news">News</category>
 <category domain="http://www.nerdliness.com/category/postgresql">PostgreSQL</category>
 <pubDate>Tue, 16 Oct 2007 15:12:51 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">40 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/10/16/coming-attractions</feedburner:origLink></item>
<item>
 <title>Drupal For Facebook</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/YDDYr1OVeTg/drupal-facebook</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;"Bring the Power of Drupal to Facebook Applications"&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Normally wouldn't post a link to something without testing it out ourselves first (that's just not how we roll), but this one seemed worth sharing right away.&lt;/p&gt;
&lt;p&gt;Saw &lt;a target="_blank" href="http://www.allfacebook.com/2007/09/drupal-for-facebook-in-the-works/"&gt;this link&lt;/a&gt; come across Scoble's shared feed and was absolutely intrigued.&amp;nbsp;&amp;nbsp; Seems one Mister Dave Cohen is working on a method for throwing your existing Drupal content over onto your Facebook account.&amp;nbsp; Also apparently will give Drupal developers a handy and familiar way to create Facebook apps. Pretty damn cool idea.&lt;/p&gt;
&lt;p&gt;If you want to see it in action, take a look at &lt;a target="_blank" href="http://www.drupalforfacebook.org "&gt;http://www.drupalforfacebook.org &lt;/a&gt;and compare it to &lt;a target="_blank" href="http://apps.facebook.com/drupalforfacebook/"&gt;http://apps.facebook.com/drupalforfacebook/&lt;/a&gt;.&amp;nbsp; Like Nick O'Neill mentioned in his original post, Cohen's ported his Drupal install into the Facebook app.&amp;nbsp; Looks good.&lt;/p&gt;
&lt;p&gt;In the interest of full disclosure, I should mention that I'm usually pretty down on the social networking stuff.&amp;nbsp; I have a Facebook account, but really haven't used it for much (feel free to look me up if you need a friend).&amp;nbsp; I haven't had that Facebook epiphany so many of its fans have experienced, and I don't really get the hype.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;All that said, though, coming from a Drupalistic perspective, I think this is pretty damn cool.&amp;nbsp; Gives those of us with a little Drupal experience a backdoor into the apparently ever-so-fabulous world of Facebook .&amp;nbsp; Wouldn't be a bad idea for the Facebook people themselves to fund some of Cohen's work to get this going...&amp;nbsp; Seems to be in their best interest to harness the Drupal vote.&amp;nbsp; Frankly, the idea of a Drupal site (like this one...) being seemlessly integrated with Facebook makes me all tingly.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-N1uLPHtbnNPivcnBoYR43RfNok/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-N1uLPHtbnNPivcnBoYR43RfNok/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-N1uLPHtbnNPivcnBoYR43RfNok/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-N1uLPHtbnNPivcnBoYR43RfNok/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YDDYr1OVeTg:EdFN5cUE8Tc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YDDYr1OVeTg:EdFN5cUE8Tc:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YDDYr1OVeTg:EdFN5cUE8Tc:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YDDYr1OVeTg:EdFN5cUE8Tc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YDDYr1OVeTg:EdFN5cUE8Tc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YDDYr1OVeTg:EdFN5cUE8Tc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YDDYr1OVeTg:EdFN5cUE8Tc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YDDYr1OVeTg:EdFN5cUE8Tc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YDDYr1OVeTg:EdFN5cUE8Tc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YDDYr1OVeTg:EdFN5cUE8Tc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/YDDYr1OVeTg" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/facebook">Facebook</category>
 <pubDate>Wed, 26 Sep 2007 23:35:22 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">39 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/09/26/drupal-facebook</feedburner:origLink></item>
<item>
 <title>What's Wrong with Dell's Picture?</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/rbiSjo1TE3Y/whats-wrong-dells-picture</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;It's been a busy couple of weeks for your friendly neighborhood Nerds...&amp;nbsp; Jeremy just flew out to Chicago to meet with a potential new employer, Luke finally used some of the 6.8 million vacation hours he'd accumulated over the past couple years (seriously, Luke, who DOESN'T take a day off in two years?!), Aaron just had another baby (say &amp;quot;hello&amp;quot; to Lars, everyone), and I'm tying up loose ends at my current day job, getting ready to start anew at a new gig on October 1.&amp;nbsp; Sadly, that means you've all been neglected.&lt;br /&gt;
&lt;br /&gt;
Fear not, gentle readers.&amp;nbsp; We'll get our act together soon and get some new material up here as soon as the dust settles.&amp;nbsp; Until then, I thought I'd waste your time with a completely useless tale about my recent experience on the Dell Premier website.&lt;br /&gt;
&lt;br /&gt;
If you're not familiar with the site, Dell Premier is basically a corporation's one-stop, personalized Dell shopping page.&amp;nbsp; Your business's rep sets you up and you can logon to take care of all your Dell purchasing needs in one place.&amp;nbsp; Generally works pretty well.&amp;nbsp; Generally.&lt;br /&gt;
&lt;br /&gt;
And that's how we segue into the Nerdliness.com homage to Highlights Magazine's &amp;quot;What is Wrong With This Picture?&amp;quot;&amp;nbsp; Just took this screen shot from my Dell Premier page a few minutes ago, looking at toner cartridges for a Dell 3115cn (click to see the full version):&lt;/p&gt;
&lt;p align="center"&gt;&lt;a href="/userfiles/image/images/dell-wtf/fullscreen.jpg"&gt;&lt;img width="200" height="185" alt="" src="/userfiles/image/images/dell-wtf/fullscreen.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So what's wrong with this picture?&amp;nbsp; Well, let's start with the title:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img width="326" height="84" alt="" src="/userfiles/image/images/dell-wtf/title-1.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;That generally should show the name of the company your account is associated with.&amp;nbsp; Guess what?&amp;nbsp; I don't work for the Denver International Airport.&amp;nbsp; Man, I knew that airport had a reputation for things going wonky, but I had no idea it was contageous.&amp;nbsp; Fortunately for them, just looks like the title is tweaked.&amp;nbsp; I don't seem to have access to any of their other information.&amp;nbsp; My account information is actually mine, etc.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Oh, and notice what product it thinks we're looking at:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img width="326" height="84" alt="" src="/userfiles/image/images/dell-wtf/title-2.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Sure, I've been in IT for some time and have years of experience noting the difference between keyboards and toner cartridges, but I think my three-year-old daughter could tell ya that these ain't keyboards.&lt;br /&gt;
&lt;br /&gt;
Finally, there's this:&lt;/p&gt;
&lt;div align="center"&gt;&lt;img width="448" height="308" alt="" src="/userfiles/image/images/dell-wtf/packs.jpg" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
Ok, so this one's not really a glitch, but it certainly qualifies as a &amp;quot;WTF&amp;quot; to me...&amp;nbsp; So you can buy the black cartridges individually for $109.99 (not on that page), in the convenient and cost-saving three-pack for $320.07 (saves $9.90), or the WTF-inducing 84-pack for $9,239.00 (a whoppin' 16-cent savings!).&amp;nbsp; Not sure what I find more amusing:&amp;nbsp; the fact that they even offer an 84-pack of toner cartridges, or the fact that they think the same people who might actually need to order it would be stupid enough to buy an 84-pack instead of saving $277.04 by ordering 28 three-packs...&lt;br /&gt;
&lt;br /&gt;
I promise the next posts you see will actually be relevant and informative.&amp;nbsp;&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/aNBI510X3wxFFI93WwqxMmpVrfc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aNBI510X3wxFFI93WwqxMmpVrfc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/aNBI510X3wxFFI93WwqxMmpVrfc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/aNBI510X3wxFFI93WwqxMmpVrfc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=rbiSjo1TE3Y:Guhchux1Ae4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=rbiSjo1TE3Y:Guhchux1Ae4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=rbiSjo1TE3Y:Guhchux1Ae4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=rbiSjo1TE3Y:Guhchux1Ae4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=rbiSjo1TE3Y:Guhchux1Ae4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=rbiSjo1TE3Y:Guhchux1Ae4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=rbiSjo1TE3Y:Guhchux1Ae4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=rbiSjo1TE3Y:Guhchux1Ae4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=rbiSjo1TE3Y:Guhchux1Ae4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=rbiSjo1TE3Y:Guhchux1Ae4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/rbiSjo1TE3Y" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/wtf">WTF</category>
 <pubDate>Mon, 24 Sep 2007 20:14:50 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">38 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/09/24/whats-wrong-dells-picture</feedburner:origLink></item>
<item>
 <title>End-of-Life for PostgreSQL 8.0 on Windows</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/YGfmvMtMhGU/end-life-postgresql-8-0-windows</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Woke up this morning to find a message in my inbox from the PostgreSQL pgsql-announce listserv with the subject &amp;quot;PostgreSQL 8.0, 8.1 on Windows End-of-Life.&amp;quot;&amp;nbsp; Pretty self-explanatory.&lt;/p&gt;
&lt;p&gt;According to the announcement, no more updates for those versions on the Windows platform will be released once version 8.3 hits the shelves later this year.&amp;nbsp; They recommend that anybody using one of those versions start thinking about upgrading as soon as possible.&lt;/p&gt;
&lt;p&gt;Normally, we don't like to just parrot news readily available from other sources, but I didn't see this particular blurb on the PostgreSQL website (http://www.postgres.org) as of this morning.&amp;nbsp; And considering that I doubt most of you subscribe to that same listserv, well, I thought I'd raise up and get my Walter Cronkite on.&lt;/p&gt;
&lt;p&gt;Of course, I doubt many Drupalers (Drupalites?&amp;nbsp; Drupalians?) will be affected by this.&amp;nbsp; After all, seems that the people who run it on Windows are in the minority anyway...&amp;nbsp; And how many of those do you think are using PostgreSQL on Windows, too?&amp;nbsp; I'm guessing this affects about 3 people... Total.&lt;/p&gt;
&lt;p&gt;Anyway, here's the message.&amp;nbsp; Enjoy:&lt;/p&gt;
&lt;blockquote&gt;Following the release of PostgreSQL 8.3 later this year, PostgreSQL&lt;br /&gt;
8.1.x and 8.0.x will cease to be officially supported on Windows. This&lt;br /&gt;
means that no further binary releases will be produced, and no Windows&lt;br /&gt;
specific bug fixes will be applied. Users of PostgreSQL 8.0 and 8.1 on&lt;br /&gt;
Windows should begin planning an upgrade to version 8.2 or 8.3 soon.&lt;br /&gt;
&lt;br /&gt;
The PostgreSQL Global Development Group regrets the necessity of&lt;br /&gt;
dropping support for these releases. PostgreSQL 8.0 was the first&lt;br /&gt;
release to natively support Windows, and since then a number of&lt;br /&gt;
potentially serious issues have been fixed in later releases that are&lt;br /&gt;
simply not technically practical to back port. PostgreSQL 8.2 and above&lt;br /&gt;
are considered mature and will enjoy the same lifetime on Windows as on&lt;br /&gt;
all other platforms.&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
Dave Page&lt;br /&gt;
PostgreSQL Core Team&lt;/blockquote&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/9JCGjTid7WQIrhoMeipx0ap_8j4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9JCGjTid7WQIrhoMeipx0ap_8j4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/9JCGjTid7WQIrhoMeipx0ap_8j4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/9JCGjTid7WQIrhoMeipx0ap_8j4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YGfmvMtMhGU:a08JfpOdyo4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YGfmvMtMhGU:a08JfpOdyo4:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YGfmvMtMhGU:a08JfpOdyo4:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YGfmvMtMhGU:a08JfpOdyo4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YGfmvMtMhGU:a08JfpOdyo4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YGfmvMtMhGU:a08JfpOdyo4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YGfmvMtMhGU:a08JfpOdyo4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YGfmvMtMhGU:a08JfpOdyo4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=YGfmvMtMhGU:a08JfpOdyo4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=YGfmvMtMhGU:a08JfpOdyo4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/YGfmvMtMhGU" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/news">News</category>
 <category domain="http://www.nerdliness.com/category/postgresql">PostgreSQL</category>
 <pubDate>Thu, 20 Sep 2007 15:38:14 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">37 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/09/20/end-life-postgresql-8-0-windows</feedburner:origLink></item>
<item>
 <title>Facebook Authentication in Drupal</title>
 <link>http://feedproxy.google.com/~r/Nerdlinesscom/~3/3ePN4hfCwrw/facebook-authentication-drupal</link>
 <description>&lt;div class="field field-type-text field-field-subtitle"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;The facebook_auth Module&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-text field-field-article-body"&gt;
  &lt;div class="field-items"&gt;
      &lt;div class="field-item"&gt;&lt;p&gt;Yesterday, &lt;strong&gt;that1guy &lt;/strong&gt;asked if we had played around with Facebook authentication in Drupal in a &lt;a href="http://drupal.org/node/173860" target="_blank"&gt;thread over on Drupal.org&lt;/a&gt;. We hadn't yet at the time, but not being the kinds of nerds to back down from a challenge, we started to look into it.&lt;br /&gt;
&lt;br /&gt;
Thankfully, we didn't have to do much. &lt;a href="http://drupal.org/user/56779" target="_blank"&gt;&lt;strong&gt;Halkeye&lt;/strong&gt;'&lt;/a&gt;s already submitted a dev version of a Facebook authentication module for Drupal called, strangely enough, &lt;a href="http://drupal.org/project/facebook_auth" target="_blank"&gt;facebook_auth&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
If you've used Drupal for more than a few days, you've probably noticed that installing new modules is generally pretty simple. You download the module, decompress it in your modules directory, activate it in your site's admin page, and fiddle with any settings as appropriate. If you have any questions, there's typically a good README file in the package that breaks them down for you. Piece of cake.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, facebook_auth installation wasn't quite that easy. Had to jump through a few extra hoops to get it to play nice. Chalk it up to the fact that it's still in the early dev phases of the dance competition, but the README file included in the package left a bit to be desired... Still, though, after playing around with it for a little while, we got it working on our development site.&lt;/p&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;First thing's first... Uses Drupal 5.2 with PHP 5.1.6 and MySQL 5.0.27. Halkeye says he's &amp;quot;fairly certain head will work for both 5 and 4.7,&amp;quot; but we only tested with 5.2. Seems to work.&lt;br /&gt;
&lt;br /&gt;
Ok, so first thing you need is the facebook_auth module, available over at &lt;a href="http://drupal.org/project/facebook_auth" target="_blank"&gt;http://drupal.org/project/facebook_auth&lt;/a&gt;. Download that and decompress it in your /modules directory just like you normally would. That should create a directory within /modules called /facebook_auth.&lt;br /&gt;
&lt;br /&gt;
Before you get all click happy and start trying to activate it in Drupal, though, you also need to download the Facebook platform. Like the README says, you can currently find that at &lt;a href="http://developers.facebook.com/clientlibs/facebook-platform.tar.gz" target="_blank"&gt;http://developers.facebook.com/clientlibs/facebook-platform.tar.gz&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
And here's one of those places where the current README falls a little short. It tells you to extract the files from that tarball, but it doesn't say where. Not helpful. You'll want to extract the contents of that file into the facebook_auth directory. After you've done so, your directory structure should look something like this:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="bash"&gt;/modules/facebook_auth/LICENSE.txt&lt;br /&gt;
/modules/facebook_auth/README&lt;br /&gt;
/modules/facebook_auth/facebook_auth.info&lt;br /&gt;
/modules/facebook_auth/facebook_auth.module&lt;br /&gt;
/modules/facebook_auth/img/&lt;br /&gt;
/modules/facebook_auth/facebook-platform/&lt;br /&gt;
&lt;/blockcode&gt; &lt;br /&gt;
and within the facebook-platform directory:&lt;br /&gt;
&lt;br /&gt;
&lt;blockcode type="bash"&gt; 
/modules/facebook_auth/facebook-platform/README &lt;br /&gt;
/modules/facebook_auth/facebook-platform/client/ &lt;br /&gt;
/modules/facebook_auth/facebook-platform/footprints/ &lt;br /&gt;
/modules/facebook_auth/facebook-platform/php4client/ &lt;br /&gt;
&lt;/blockcode&gt; &lt;br /&gt;
Obviously, there are files in the client, footprints, and php4client directories, too.&lt;br /&gt;
&lt;br /&gt;
Ok, for this all to work, you also need to get yourself a Facebook API Key. Assuming you don't have any apps registered...&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Browse to &lt;a href="http://www.facebook.com/developers/apps.php" target="_blank"&gt;http://www.facebook.com/developers/apps.php&lt;/a&gt; and logon with your Facebook account info.&lt;/li&gt;
    &lt;li&gt;Click &amp;quot;Apply for a key.&amp;quot;&lt;/li&gt;
    &lt;li&gt;Give a descriptive application name. Your users will see this when they try to use Facebook authentication, so you probably won't want to call it &amp;quot;Shiny Baboon Ass&amp;quot; (unless, of course, that's your domain name...). I'd suggest your site's title, but that's just me.&lt;/li&gt;
    &lt;li&gt;Click Optional Fields to expand it.&lt;/li&gt;
&lt;/ol&gt;
&lt;ol type="a" start="a" class="indent"&gt;
    &lt;li&gt;Customize the Support Email address field, unless, of course, you want your visitors sending their complaints to the email address you use for Facebook.&lt;/li&gt;
    &lt;li&gt;Enter http://&amp;lt;yourdomainname&amp;gt;/facebook/ for the Callback Url. For instance, ours would be http://www.nerdliness.com/facebook/.&lt;/li&gt;
    &lt;li&gt;Make sure Application Type is Website.&lt;/li&gt;
    &lt;li&gt;Fiddle with any other settings you want, but be careful if you enter any IP Address of Servers Making Requests. Obviously, if you enter the wrong info, your app won't work.&lt;/li&gt;
    &lt;li&gt;Click Submit.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;
You should now see an API Key and a Secret. Keep those handy as you'll need them in the facebook_auth configuration. There's a config.php file in the /modules/facebook_auth/facebook-platform/footprints directory that asks for them, but you don't need to worry about that. All you need to do is configure the module properly inside Drupal.&lt;br /&gt;
&lt;br /&gt;
Those are the hard parts. From here on out, everything else is like you'd expect for a new module:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Log on to your Drupal install as an account that can activate modules.&lt;/li&gt;
    &lt;li&gt;Activate the newly installed module in Adminster-&amp;gt;Site Building-&amp;gt;Modules.&lt;/li&gt;
    &lt;li&gt;Enter your API Key and Secret in Adminster-&amp;gt;Site Configuration-&amp;gt;Configure Facebook settings (and probably check the &amp;quot;Show button in login block&amp;quot; box, but that's up to you).&lt;/li&gt;
&lt;/ol&gt;
&lt;div align="center"&gt;&lt;img src="/userfiles/image/images/facebook_auth/facebookconfig.jpg" alt="" /&gt;&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;
And that's it. If everything went according to Hoyle, your site should now allow users to logon using their Facebook creds.&lt;/p&gt;
&lt;h3&gt;How it Works&lt;/h3&gt;
&lt;p&gt;Ok, so now you have a Facebook button on your /user page. So what? Let's say a new user comes along and clicks that button. That user will be redirected to the Facebook site temporarily to enter their Facebook credentials. They'll also have the option to check a couple of boxes allowing your app to access their Facebook info (this is the screen where that Shiny Baboon Ass will appear...). Soon as they click that button, the facebook_auth module will create a new local Drupal account on your site associated with that Facebook account. &lt;br /&gt;
&lt;br /&gt;
Couple of caveats. First, the facebook_auth module doesn't seem to pull much info from their Facebook account. After creating a test user in our sandbox, the new account didn't have an email address, etc. entered into our users table. That might be an issue for some, but seems like one that can be fixed in the module. I haven't investigated the Facebook API enough to know for sure yet, though. Still, though, if you have mandatory profile fields you expect everyone to fill out, you might be a little disappointed to find new users missing that data.&lt;br /&gt;
&lt;br /&gt;
Second, this is a quick way to accidentally create multiple local Drupal accounts for the same user. For instance, I obviously have a local Drupal account on my box already. I also have a separate Facebook account. If I were to click the Facebook button and attempt to authenticate with my Facebook name/password, I'd end up creating a second Drupal account instead of logging in with my original.&lt;br /&gt;
&lt;br /&gt;
&lt;div align="center"&gt;&lt;img src="/userfiles/image/images/facebook_auth/userprofile.jpg" alt="" /&gt;&lt;/div&gt;
You can get around that a bit by making sure your existing users know about the Facebook Identities tab the module adds to your user profiles. If you log in to Drupal as an existing user, you can associate your existing Drupal account with your existing Facebook account ahead of time, thus avoiding the duplicate user problem.&lt;/p&gt;
&lt;h3&gt;The Rest&lt;/h3&gt;
&lt;p&gt;If you click our Log In link in the upper-right, you might notice, well, nothing new. No Facebook button. Yep. Like I mentioned, that there module's still in development and we'll need to do some more testing before we dare push it to our live site. &lt;br /&gt;
&lt;br /&gt;
There are a few things we'd like to see added to the module, too. For instance, it would be nice if the module could prevent those duplicate accounts somehow... maybe by simply throwing up a warning to people letting them know what they should do if they already have a local Drupal account. Of course, that once can be nipped by throwing a warning on the site itself.&lt;br /&gt;
&lt;br /&gt;
All in all, though, it definitely looks promising. We'll be keeping an eye on it.&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;div class="field field-type-link field-field-references"&gt;
  &lt;h3 class="field-label"&gt;References&lt;/h3&gt;
  &lt;div class="field-items"&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
          &lt;div class="field-item"&gt;&lt;/div&gt;
      &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/WBmmjeNiH0ONVB9eLqKd_unMfHQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WBmmjeNiH0ONVB9eLqKd_unMfHQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/WBmmjeNiH0ONVB9eLqKd_unMfHQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/WBmmjeNiH0ONVB9eLqKd_unMfHQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=3ePN4hfCwrw:w8aJwtp3C8c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=3ePN4hfCwrw:w8aJwtp3C8c:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=3ePN4hfCwrw:w8aJwtp3C8c:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=3ePN4hfCwrw:w8aJwtp3C8c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=3ePN4hfCwrw:w8aJwtp3C8c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=3ePN4hfCwrw:w8aJwtp3C8c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=3ePN4hfCwrw:w8aJwtp3C8c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=3ePN4hfCwrw:w8aJwtp3C8c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Nerdlinesscom?a=3ePN4hfCwrw:w8aJwtp3C8c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Nerdlinesscom?i=3ePN4hfCwrw:w8aJwtp3C8c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Nerdlinesscom/~4/3ePN4hfCwrw" height="1" width="1"/&gt;</description>
 <category domain="http://www.nerdliness.com/category/drupal">Drupal</category>
 <category domain="http://www.nerdliness.com/category/facebook">Facebook</category>
 <pubDate>Wed, 12 Sep 2007 20:26:48 +0000</pubDate>
 <dc:creator>justin</dc:creator>
 <guid isPermaLink="false">36 at http://www.nerdliness.com</guid>
<feedburner:origLink>http://www.nerdliness.com/article/2007/09/12/facebook-authentication-drupal</feedburner:origLink></item>
</channel>
</rss>
