<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title>theQueue</title>
        <link>http://thequeue.net/blog//blog/Default.aspx</link>
        <description>enqueue("notes to self")</description>
        <language>en-US</language>
        <copyright>Jeff Schoolcraft</copyright>
        <managingEditor>jeff@thequeue.net</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <image>
            <title>theQueue</title>
            <url>http://thequeue.net/blog//blog/images/RSS2Image.gif</url>
            <link>http://thequeue.net/blog//blog/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item><title>Links for 2008-11-19 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/459218763/jeffrey.schoolcraft</link><pubDate>Thu, 20 Nov 2008 00:00:00 -0600</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-11-19</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://www.alistapart.com/articles/amoreuseful404">A List Apart: Articles: A More Useful 404</a></li>
<li><a href="http://www.pcworld.com/printable/article/id,150970/printable.html">Upgrade Your Xbox 360's Hard Drive on the Cheap - PC World</a><br/>
How to upgrade your 360 from a 20 to 120GB HDD for about $75 (HDD, transfer kit)</li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/459218763" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.alistapart.com/articles/amoreuseful404"&gt;A List Apart: Articles: A More Useful 404&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.pcworld.com/printable/article/id,150970/printable.html"&gt;Upgrade Your Xbox 360's Hard Drive on the Cheap - PC World&lt;/a&gt;&lt;br/&gt;
How to upgrade your 360 from a 20 to 120GB HDD for about $75 (HDD, transfer kit)&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-11-19</feedburner:origLink></item><item><title>Links for 2008-11-11 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/450346285/jeffrey.schoolcraft</link><pubDate>Wed, 12 Nov 2008 00:00:00 -0600</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-11-11</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://mosesofegypt.net/post/PagedList-Sorted-Edition.aspx">PagedList Sorted Edition (ASP.NET MVC)</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/450346285" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mosesofegypt.net/post/PagedList-Sorted-Edition.aspx"&gt;PagedList Sorted Edition (ASP.NET MVC)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-11-11</feedburner:origLink></item><item>
            <title>NoVa CodeCamp 2008.02 Registration Now Open</title>
            <category>CodeCamp</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/449675952/nova-codecamp-2008.02-registration-now-open.aspx</link>
            <description>&lt;p&gt;We're happy to announce that registration for the &lt;a href="http://novacodecamp.org"&gt;NoVa CodeCamp&lt;/a&gt; 2008.02 on Saturday December 6, 2008 in the &lt;a href="http://is.gd/71Ke"&gt;Microsoft Offices in Reston, VA&lt;/a&gt; has opened!&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="https://www.clicktoattend.com/invitation.aspx?code=131469"&gt;REGISTER HERE&lt;/a&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;We might have one or two sessions open for any aspiring speakers, if you're interested send me an email with topic and a two sentence abstract to jeff at novacodecamp dot org&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/180.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/449675952" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/11/11/nova-codecamp-2008.02-registration-now-open.aspx</guid>
            <pubDate>Tue, 11 Nov 2008 15:50:35 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/180.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/11/11/nova-codecamp-2008.02-registration-now-open.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/180.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/180.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/11/11/nova-codecamp-2008.02-registration-now-open.aspx</feedburner:origLink></item>
        <item><title>Links for 2008-11-04 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/442885067/jeffrey.schoolcraft</link><pubDate>Wed, 05 Nov 2008 00:00:00 -0600</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-11-04</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://htmlplayground.com/#tag_address">HTML Playground, html, css reference by example</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/442885067" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://htmlplayground.com/#tag_address"&gt;HTML Playground, html, css reference by example&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-11-04</feedburner:origLink></item><item><title>Links for 2008-10-31 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/438746436/jeffrey.schoolcraft</link><pubDate>Sat, 01 Nov 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-10-31</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://softwarecraftsmanship.oreilly.com/wiki">Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman [Apprenticeship Patterns]</a></li>
<li><a href="http://www.dotnetservicesruby.com/content/app_overview">.NET Services for Ruby</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/438746436" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://softwarecraftsmanship.oreilly.com/wiki"&gt;Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman [Apprenticeship Patterns]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.dotnetservicesruby.com/content/app_overview"&gt;.NET Services for Ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-10-31</feedburner:origLink></item><item><title>Links for 2008-10-29 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/436557298/jeffrey.schoolcraft</link><pubDate>Thu, 30 Oct 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-10-29</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://blog.insoshi.com/2008/07/28/running-rails-tests-with-autotest-zentest-and-rspec/">Running Rails tests with autotest (ZenTest) and RSpec &laquo; Insoshi Ruby on Rails blog</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/436557298" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.insoshi.com/2008/07/28/running-rails-tests-with-autotest-zentest-and-rspec/"&gt;Running Rails tests with autotest (ZenTest) and RSpec &amp;laquo; Insoshi Ruby on Rails blog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-10-29</feedburner:origLink></item><item><title>Links for 2008-10-28 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/435465183/jeffrey.schoolcraft</link><pubDate>Wed, 29 Oct 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-10-28</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://servicemerchant.org/">Service Merchant</a><br/>
ServiceMerchant is an open source library for Software-as-a-Service applications, based on subscription payments and various service plans. The library consists of number of well-isolated and well-defined components, so that you may re-use portions of the library, should you find the full functionality not required for you. If you choose to use the library as whole, it should cover most of your payments requirements, thus being billing module for your application.</li>
<li><a href="http://github.com/brynary/webrat/tree/master">brynary's webrat at master &mdash; GitHub</a><br/>
Webrat - Ruby Acceptance Testing for Web applications</li>
<li><a href="http://www.codinghorror.com/blog/files/Pragmatic%20Quick%20Reference.htm">The Pragmatic Programmer Quick Reference Guide</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/435465183" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://servicemerchant.org/"&gt;Service Merchant&lt;/a&gt;&lt;br/&gt;
ServiceMerchant is an open source library for Software-as-a-Service applications, based on subscription payments and various service plans. The library consists of number of well-isolated and well-defined components, so that you may re-use portions of the library, should you find the full functionality not required for you. If you choose to use the library as whole, it should cover most of your payments requirements, thus being billing module for your application.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/brynary/webrat/tree/master"&gt;brynary's webrat at master &amp;mdash; GitHub&lt;/a&gt;&lt;br/&gt;
Webrat - Ruby Acceptance Testing for Web applications&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.codinghorror.com/blog/files/Pragmatic%20Quick%20Reference.htm"&gt;The Pragmatic Programmer Quick Reference Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-10-28</feedburner:origLink></item><item><title>Links for 2008-10-27 [del.icio.us]</title><link>http://feeds.feedburner.com/~r/TheQueue/~3/434337815/jeffrey.schoolcraft</link><pubDate>Tue, 28 Oct 2008 00:00:00 -0500</pubDate><guid isPermaLink="false">http://del.icio.us/jeffrey.schoolcraft#2008-10-27</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<ul>
<li><a href="http://prawn.majesticseacreature.com/">http://prawn.majesticseacreature.com/</a></li>
</ul><img src="http://feeds.feedburner.com/~r/TheQueue/~4/434337815" height="1" width="1"/>]]></content:encoded><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://prawn.majesticseacreature.com/"&gt;http://prawn.majesticseacreature.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/jeffrey.schoolcraft#2008-10-27</feedburner:origLink></item><item>
            <title>NoVa CodeCamp 2008.02 Call for Speakers</title>
            <category>CodeCamp</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/433607591/nova-codecamp-2008.02-call-for-speakers.aspx</link>
            <description>&lt;p&gt;We are very excited to announce the next NoVa CodeCamp to be hosted in Reston, Virginia on Saturday, December 6th 2008.&lt;/p&gt; &lt;p&gt;We are now accepting proposals for speaking and would love to hear some new voices.  If you're interested send your topic and a two to three sentence abstract to me: jeff at novacodecamp dot org.&lt;/p&gt; &lt;p&gt;It's hard to come up with a list of topics without slighting someone's personal interests, so how about a guiding principle or two and some topic ideas.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Guiding Principles:&lt;/b&gt;&lt;br /&gt;1.  It should be relevant&lt;br /&gt;2.  It should be fun&lt;br /&gt;3.  It should be technical (let's minimize lecture type sessions, it's code camp, show code)&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;b&gt;Ideas:&lt;/b&gt;&lt;br /&gt;ASP.NET MVC +/- TDD&lt;br /&gt;LINQ&lt;br /&gt;* 2008 technologies&lt;br /&gt;Moving to * 2008 Technologies (or new features that should make you want to get there)&lt;br /&gt;jQuery&lt;br /&gt;W*F&lt;br /&gt;Silverlight&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Please send your proposals including topic and abstract to this email (jeff at novacodecamp dot org)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Registration details will be made available soon.&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/179.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/433607591" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/10/27/nova-codecamp-2008.02-call-for-speakers.aspx</guid>
            <pubDate>Mon, 27 Oct 2008 14:08:28 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/179.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/10/27/nova-codecamp-2008.02-call-for-speakers.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/179.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/179.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/10/27/nova-codecamp-2008.02-call-for-speakers.aspx</feedburner:origLink></item>
        <item>
            <title>Restoring SQL Server 2005 backups to a new server: dealing with existing users/schemas</title>
            <category>SQL</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/427604459/restoring-sql-server-2005-backups-to-a-new-server-dealing.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: You're migrating servers from SQL Server 2000 or 2005 to a shiny new SQL Server 2005 box (with all the best hardware, because your clients are awesome and they love you).  You back up the database, copy the files over to the new server and restore the database (which is a lot easier in 2005 because you can type in the name of a &lt;strong&gt;NEW&lt;/strong&gt; database at that point).  Now you have to deal with logins, you try to create a new login on SQL Server but it fails when you try to add it to the new database (or before) because that schema already exists.  So you try to delete the user from the restored database but you can't, that schema is referenced somewhere: UGH!&lt;/p&gt; &lt;p&gt;Well, maybe only UGH! if everyone is supposed to be using [dbo] and now you suddenly realize they weren't, and [foo] is cluttering up your space and preventing you from putting your old database online with some shiny new hardware.&lt;/p&gt; &lt;p&gt;What do you do?  Figure out where the other schemas were being used and migrate them to [dbo] (or whatever is appropriate) if they're unique (you are selecting with schema's right?).  Or, you just drop them if they're duplicates and identical.  Or, curse the developers for the merge nightmare you've been thrown into without a proper test suite. Or... alright, that's enough.&lt;/p&gt; &lt;p&gt;If you're going to migrate the schemas, as I was, here's a couple SQL Queries to add to your toolbox for such an occassion.  These were found in the post and comments of &lt;a href="http://weblogs.asp.net/steveschofield/archive/2005/12/31/434280.aspx"&gt;Steve Schofield's post&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;For Procedures&lt;/strong&gt; (this one changes the schema to &lt;u&gt;dbo&lt;/u&gt;):&lt;/p&gt;&lt;pre style="border-right: #cecece 1px solid; padding-right: 5px; border-top: #cecece 1px solid; padding-left: 5px; min-height: 40px; padding-bottom: 5px; overflow: auto; border-left: #cecece 1px solid; width: 650px; padding-top: 5px; border-bottom: #cecece 1px solid; background-color: #edefed"&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  '&lt;span style="color: #8b0000"&gt;ALTER SCHEMA dbo TRANSFER &lt;/span&gt;' + s.Name + '&lt;span style="color: #8b0000"&gt;.&lt;/span&gt;' + p.Name 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  sys.Procedures p 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=INNER&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;INNER&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=JOIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;JOIN&lt;/a&gt;
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  sys.Schemas s &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=on&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;on&lt;/a&gt; p.schema_id = s.schema_id 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WHERE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WHERE&lt;/a&gt; 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  s.Name = '&lt;span style="color: #8b0000"&gt;CHANGE_ME_Username&lt;/span&gt;'&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;For Tables (change &lt;u&gt;NewSchema&lt;/u&gt; and &lt;u&gt;OldSchema&lt;/u&gt; as appropriate):&lt;/p&gt;&lt;pre style="border-right: #cecece 1px solid; padding-right: 5px; border-top: #cecece 1px solid; padding-left: 5px; min-height: 40px; padding-bottom: 5px; overflow: auto; border-left: #cecece 1px solid; width: 650px; padding-top: 5px; border-bottom: #cecece 1px solid; background-color: #edefed"&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=SELECT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;SELECT&lt;/a&gt; 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  '&lt;span style="color: #8b0000"&gt;ALTER SCHEMA NewSchema TRANSFER &lt;/span&gt;' + TABLE_SCHEMA + '&lt;span style="color: #8b0000"&gt;.&lt;/span&gt;' + TABLE_NAME 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=FROM&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;FROM&lt;/a&gt; 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  INFORMATION_SCHEMA.TABLES 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=WHERE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;WHERE&lt;/a&gt; 
&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  TABLE_SCHEMA = '&lt;span style="color: #8b0000"&gt;OldSchema&lt;/span&gt;'&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;The results from running these queries are the actual SQL statements you need to run to actually change the schema.  &lt;/p&gt;
&lt;p&gt;So copy &amp;amp; paste, run, drop users/schema, and add new logins and map them to the new database.&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/178.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/427604459" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/10/21/restoring-sql-server-2005-backups-to-a-new-server-dealing.aspx</guid>
            <pubDate>Tue, 21 Oct 2008 15:41:15 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/178.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/10/21/restoring-sql-server-2005-backups-to-a-new-server-dealing.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/178.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/178.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/10/21/restoring-sql-server-2005-backups-to-a-new-server-dealing.aspx</feedburner:origLink></item>
        <item>
            <title>hushchamber becomes self aware</title>
            <category>hushchamber</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/422765417/hushchamber-becomes-self-aware.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/hushchamberbecomesselfaware_9F6F/image.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="427" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/hushchamberbecomesselfaware_9F6F/image_thumb.png" width="640" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Not nearly as ominous as in &lt;a href="http://www.imdb.com/title/tt0103064/"&gt;Terminator 2&lt;/a&gt;, but still...&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The SkyNet funding bill is passed. The system goes online on August 4th, 1997. Human decisions are removed from strategic defense. SkyNet begins to learn at a geometric rate. It becomes self-aware at 2:14am Eastern time, August 29th. In a panic, they try to pull the plug.&lt;/p&gt; &lt;p&gt;[&lt;a href="http://www.uselessmoviequotes.com/umq_t003.htm"&gt;source&lt;/a&gt;]&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/177.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/422765417" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/10/16/hushchamber-becomes-self-aware.aspx</guid>
            <pubDate>Thu, 16 Oct 2008 15:23:04 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/177.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/10/16/hushchamber-becomes-self-aware.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/177.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/177.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/10/16/hushchamber-becomes-self-aware.aspx</feedburner:origLink></item>
        <item>
            <title>hushchamber.com</title>
            <category>blogging</category>
            <category>rails</category>
            <category>ruby</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/421637056/hushchamber.com.aspx</link>
            <description>&lt;p&gt;It all started with a &lt;a href="http://jasonhaley.com/blog/archive/2008/08/20/142162.aspx"&gt;simple post&lt;/a&gt; from &lt;a href="http://jasonhaley.com"&gt;Jason Haley&lt;/a&gt; while I was on vacation with my family at Emerald Isle.  The post was about creating a link blog aggregator to show the days top picks and diamonds in the rough with or without having to sift through everyone's mention of X.  Like I said, I was on vacation and trying really hard to stay disconnected.  I managed to slip in a few minutes here and there while my youngest daughter took her naps throughout the day and played a bit with &lt;a href="http://code.whytheluckystiff.net/hpricot/"&gt;Hpricot&lt;/a&gt; trying to parse some feeds.&lt;/p&gt; &lt;p&gt;I put things on hold, finished vacation and got caught up with a couple other things.  Finally I came back and decided to crank out a 1.0 version (no beta's here).  The result is &lt;a href="http://hushchamber.com"&gt;hushchamber.com&lt;/a&gt;&lt;/p&gt; &lt;p&gt;It's another ruby on rails project for me with some interesting challenges.  I'm using &lt;a href="http://backgroundrb.rubyforge.org/"&gt;backgroundrb&lt;/a&gt; to do all my asynchronous and background processing (mainly fetching new feeds from RSS and parsing those feeds for new links).  I'm using &lt;a href="http://god.rubyforge.org/"&gt;god&lt;/a&gt; to monitor backgroundrb and restart it if one of the workers goes down, this normally happens for me with a timeout with open-uri (I think, I can't catch the error in a rescue for some reason).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;So what were the challenges?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Parsing&lt;/strong&gt; was a big one.  Not that it's difficult with Hpricot but some blog clients produce better markup than others.  I'm trying to get only link mentions and not links to other stuff (like the link bloggers blog, or job search sites, or events that are repeated for up to two weeks).  In some instances I had to strip out some content before I could successfully parse it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;, surprisingly were another one.  Depending on how the linkblogger linked to content--sometimes through a &lt;a href="http://feedburner.com"&gt;feedburner&lt;/a&gt; feed, sometimes directly to the resource on the web, some with URL shortening services--produced different URLs.  The challenge here was getting all 3 links to the same resource to behave like the same resource.  I ended up having to "resolve" the URL to it's original web form and use that as the unique identifier for the link.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Titles&lt;/strong&gt; were another issue, titles for links that is.  I started using the inner html for the anchor tag as the text/title for the link itself.  So in the following Example I'd grab "Jeff's Blog" and set that as the text to use for the link.&lt;/p&gt;&lt;pre style="border-right: #cecece 1px solid; padding-right: 5px; border-top: #cecece 1px solid; padding-left: 5px; min-height: 40px; padding-bottom: 5px; overflow: auto; border-left: #cecece 1px solid; width: 650px; padding-top: 5px; border-bottom: #cecece 1px solid; background-color: #edefed"&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  1: &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;a&lt;/span&gt; &lt;span style="color: #ff0000"&gt;href&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://thequeue.net/blog"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Jeff's Blog&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;The problem is, some titles have &amp;lt;font&amp;gt; and &amp;lt;strong&amp;gt; tags in them, and I really didn't want that.  Other times it's just that link bloggers description of the resource which may or may not make sense out of the context of the blog entry itself.&lt;/p&gt;
&lt;p&gt;I played with the idea of going out to the resource directly and using hpricot again to grab the &amp;lt;title&amp;gt; attribute on the page.  I actually did that but 90% of the sites I tried that on have the real title plus some other information about the site as well.  It's really bad when it's a &lt;a href="http://www.codeproject.com/"&gt;Code Project&lt;/a&gt; link, the title++ portion is something like an extra dozen words.  I ended up going back to just using the linkbloggers inner html, and it's first in wins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Top links and diamonds in the rough&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Surprisingly there weren't as many links mentioned from a bunch of linkbloggers as I thought there would be.  Even on &lt;a href="http://hushchamber.com/archive/2008/9/29"&gt;jQuery Monday&lt;/a&gt; there was a lot of talk about jQuery and Visual Studio and ASP.NET MVC but they were all to different posts.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/hushchamber.com_8897/image.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="194" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/hushchamber.com_8897/image_thumb.png" width="731" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Which brings up another interesting suggestion, or thought, to display links grouped by tag.  I've played around with going out to &lt;a href="http://del.icio.us"&gt;del.icio.us&lt;/a&gt; (this is still faster than their new URL for me to type) and grabbing the top tag for a given link and grouping by that tag.  We're left at the mercy of the initial taggers of a resource but most of the time they're close.  Though it doesn't help for a completely unrelated bunch of links.&lt;/p&gt;
&lt;p&gt;So, check it out: &lt;a href="http://hushchamber.com"&gt;http://hushchamber.com&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;There's also an &lt;a href="http://feeds.feedburner.com/hushchamber"&gt;RSS Feed&lt;/a&gt; for it that you can subscribe to and get the last 30 days or so worth of links, if old posts come in you do get updates to RSS.  let me know what you think by using the feedback button:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/hushchamber.com_8897/image_1.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="100" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/hushchamber.com_8897/image_thumb_1.png" width="240" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/176.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/421637056" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/10/15/hushchamber.com.aspx</guid>
            <pubDate>Wed, 15 Oct 2008 14:19:46 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/176.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/10/15/hushchamber.com.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/176.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/176.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/10/15/hushchamber.com.aspx</feedburner:origLink></item>
        <item>
            <title>APRESS Daily Deal Twitterbot</title>
            <category>ruby</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/393246576/apress-daily-deal-twitterbot.aspx</link>
            <description>&lt;p&gt;In a &lt;a href="http://thequeue.net/blog/archive/2008/08/04/apress-ebook-deal-of-the-day.aspx"&gt;previous post&lt;/a&gt; I described how I'm keeping up with &lt;a href="http://apress.com/info/dailydeal"&gt;APRESS' eBook Deal of the Day&lt;/a&gt;.  At the time I was using a Firefox extension, Update Scanner to watch for changes to the web page.  It worked well enough, but it still required me to physically go out to the page and I've noticed a couple quirks.  Since then I got excited about a tangent, &lt;a href="http://zenhabits.net/2008/08/the-zen-habits-twitterbot-challenge-plus-two-ebooks/"&gt;zenhabits Twitterbot Challenge&lt;/a&gt;.  I never actually participated in the challenge as the Twitterbot thread took me in a different direction.&lt;/p&gt; &lt;p&gt;While exploring some of the different uses people have been using twitter for I saw a w00t twitterbot that tweets w00t items, handy in a w00t off.  That wasn't far off from what I wanted from APRESS (I would have been happy with RSS, but I'm using twitter regularly enough that it's a decent solution).  All I need to do is go out to the daily deal page, scrape it for the book name and link, then tweet it.  How hard can it be?&lt;/p&gt; &lt;p&gt;Not that hard, really, about fifteen lines of ruby code and a few gems:&lt;/p&gt;&lt;pre style="border-right: #cecece 1px solid; padding-right: 5px; border-top: #cecece 1px solid; padding-left: 5px; min-height: 40px; padding-bottom: 5px; overflow: auto; border-left: #cecece 1px solid; width: 650px; padding-top: 5px; border-bottom: #cecece 1px solid; background-color: #edefed"&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  1: &lt;span style="color: #008000"&gt;#!/usr/bin/ruby&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  2: &lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  3: &lt;span style="color: #00008b"&gt;require&lt;/span&gt; 'rubygems'&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  4: &lt;span style="color: #00008b"&gt;require&lt;/span&gt; 'hpricot'&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  5: &lt;span style="color: #00008b"&gt;require&lt;/span&gt; 'shorturl'&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  6: &lt;span style="color: #00008b"&gt;require&lt;/span&gt; 'twitter'&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  7: &lt;span style="color: #00008b"&gt;require&lt;/span&gt; '&lt;span style="color: #00008b"&gt;open&lt;/span&gt;-uri'&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  8: &lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  9: doc = Hpricot(&lt;span style="color: #00008b"&gt;open&lt;/span&gt;('http://www.apress.com/info/dailydeal')) &lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 10: deal = doc.search("&lt;span style="color: #8b0000"&gt;//div.bookdetails&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 11: book = (deal/"&lt;span style="color: #8b0000"&gt;h3/a&lt;/span&gt;").first&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 12: description = (deal/"&lt;span style="color: #8b0000"&gt;p&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 13: details = (description/"&lt;span style="color: #8b0000"&gt;div&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 14: (description/"&lt;span style="color: #8b0000"&gt;div&lt;/span&gt;").remove&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 15: &lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 16: root_url = 'http://www.apress.com'&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 17: book_url = ShortURL.shorten(root_url + book.attributes['href'])&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 18: book_title = book.inner_html&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 19: &lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 20: tweet_start = "&lt;span style="color: #8b0000"&gt;[#{Date.today}]: &lt;/span&gt;"&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 21: tweet_end = "&lt;span style="color: #8b0000"&gt; (#{book_url})&lt;/span&gt;"&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 22: book_title_shortened = book_title[0, 140 - tweet_start.length - tweet_end.length]&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 23: tweet = tweet_start + book_title_shortened + tweet_end&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 24: &lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 25: twitter ||= Twitter::Base.new("&lt;span style="color: #8b0000"&gt;ApressDailyDeal&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;my_super_secret_password&lt;/span&gt;")&lt;/pre&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt; 26: twitter.post tweet&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;So, let's break it down.&lt;/p&gt;
&lt;p&gt;Line 1 is there because I'm going to set this to run as a &lt;a href="http://en.wikipedia.org/wiki/Cron"&gt;cron&lt;/a&gt; job later and I'd rather do ./dailydeal.rb than ruby dailydeal.rb.&lt;/p&gt;
&lt;p&gt;Lines 3-7 bring in some gems (similar to perl's cpan packages).  open-uri to get the page, Hpricot to scrape it, short-url to make the link to the book shorter and twitter to tweet.&lt;/p&gt;
&lt;p&gt;Lines 9-14 could probably be tightened up, but I rather like the "clarity over cleverness" meme.  Surprisingly, APRESS' page was rather easy to scrape which means it was well marked up, using classes appropriately for semantic meaning (div class="bookdetails" actually held... book details).  &lt;/p&gt;
&lt;p&gt;I stitch the URL together in 16-18 and call out to short-url's shorten method.  It supports a bunch of services, rubyurl is the default and with tinyurl not working for me, I went with it.  I actually &lt;a href="http://github.com/jschoolcraft/shorturl/tree/master"&gt;forked the project on github&lt;/a&gt; to add support for is.gd (every character counts with twitter) but I'm waiting for a gem update before I switch to that.&lt;/p&gt;
&lt;p&gt;In lines 20-23 I assemble the tweet.  I broke it into a few parts because I need to make sure the message length doesn't exceed 140 characters.  The date and URL to the book are more important than the entire title of the book, so I truncate that if necessary.&lt;/p&gt;
&lt;p&gt;The last lines are just sending the tweet.&lt;/p&gt;
&lt;p&gt;On my linux box I used crontab -e to enter the following job:&lt;/p&gt;&lt;pre style="border-right: #cecece 1px solid; padding-right: 5px; border-top: #cecece 1px solid; padding-left: 5px; min-height: 40px; padding-bottom: 5px; overflow: auto; border-left: #cecece 1px solid; width: 650px; padding-top: 5px; border-bottom: #cecece 1px solid; background-color: #edefed"&gt;&lt;pre style="font-size: 12px; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; background-color: #edefed"&gt;  1: 30 08 * * * /home/jeff/development/apress_twitterbot/dailydeal.rb&lt;/pre&gt;&lt;/pre&gt;
&lt;p&gt;So at 8:30 every morning, give or take a bit of drift either way, I'll tweet off today's new Daily Deal:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSDailyDealTwitterbot_8803/image.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="85" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSDailyDealTwitterbot_8803/image_thumb.png" width="359" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The original page:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSDailyDealTwitterbot_8803/image_2.png" atomicselection="true"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="276" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSDailyDealTwitterbot_8803/image_thumb_2.png" width="640" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; So, if you're interested in getting APRESS' Daily Deal tweeted to you every morning (EST) follow my bot: &lt;a title="http://twitter.com/ApressDailyDeal" href="http://twitter.com/ApressDailyDeal"&gt;http://twitter.com/ApressDailyDeal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;eBooks are becoming a lot more interesting with the introduction of the Plastic Logic reading device (&lt;a title="http://www.plasticlogic.com/" href="http://www.plasticlogic.com/"&gt;http://www.plasticlogic.com/&lt;/a&gt;)&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/175.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/393246576" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/09/15/apress-daily-deal-twitterbot.aspx</guid>
            <pubDate>Mon, 15 Sep 2008 14:15:14 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/175.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/09/15/apress-daily-deal-twitterbot.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/175.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/175.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/09/15/apress-daily-deal-twitterbot.aspx</feedburner:origLink></item>
        <item>
            <title>APRESS eBook Deal of the Day</title>
            <category>books</category>
            <category>SQL</category>
            <category>Tools</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/355308154/apress-ebook-deal-of-the-day.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://apress.com"&gt;APRESS&lt;/a&gt; has been discounting a single eBook to $10 for a 24 period for a couple months now, that I know of.  They're calling it the &lt;a href="http://apress.com/info/dailydeal"&gt;eBook Deal of the Day&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;At 12:01 AM PST, a different Apress or friends of ED eBook will be priced at $10 US for a 24-hour period. Check back everyday for a new deal. If you have any further questions, please contact &lt;a href="mailto:support@apress.com"&gt;support@apress.com&lt;/a&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Awesome, $10 for an ebook is a good deal, even if I can't read one cover to cover digitally I can still search through it as a reference.  I end up just printing ebooks, which probably defeats the purpose, but oh well.  Maybe when the Kindle or another reader is up to the job for technical books it'll be a different story.&lt;/p&gt;  &lt;p&gt;Anyway, I like to keep my eye out for a deal so I'll just subscribe to the RSS feed and check my reader for ebook goodness.  Except there is no RSS feed.  Come on, APRESS, this just screams for a feed.  I dropped an email to everyone I could think of, my UserGroup liaison, her boss because she was on vacation and had a responder, support and suggestion links on the website, everyone.  Still no RSS feed.&lt;/p&gt;  &lt;p&gt;So what's a geek to do?  Try one of the several "create a feed for non-RSS enabled sites" services and get the information that way.  I tried a couple but either I or they were obtuse and impatient and I couldn't get what I wanted.  In retrospect, I could have used that time with a bit of &lt;a href="http://code.whytheluckystiff.net/hpricot/"&gt;Hpricot&lt;/a&gt; and probably had exactly what I need.  I might do that later, look for another post on that.&lt;/p&gt;  &lt;p&gt;I then turned my attention to the always reliable Firefox extension community and found &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3362"&gt;Update Scanner&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;After you install the extension, press ALT+U or select "Update Scanner" from the tools menu:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_4.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_thumb_1.png" width="224" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;That will open up a sidebar with pages you're interested in scanning for updates.  Click on the far left button to start scanning a new page:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="122" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;It's smart enough to fill in some defaults for the active tab in Firefox.  If that's not what you want just make the changes.  Title could be cleaned up a bit: "Apress eBook deal of the day" maybe?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_6.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="419" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_thumb_2.png" width="365" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I put the threshold fairly low for changes as they only change about a paragraph of text every day. I'm also only scanning their site every day, let's try to be courteous users and not hammer their site.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/clip_image001_2.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="50" alt="clip_image001" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/clip_image001_thumb.png" width="207" align="left" border="0" /&gt;&lt;/a&gt;Now all you have to do is wait until tomorrow for something that looks like this and you'll know that there's a new deal (or that something has been updated if you're using this for other pages).  Update Scanner can also open all updated pages in new tabs, handy if you're diffing the net during morning coffee or something.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_8.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="172" alt="image" src="http://thequeue.net/blog/images/thequeue_net/blog/blog/WindowsLiveWriter/APRESSeBookDealoftheDay_7F3A/image_thumb_3.png" width="129" align="left" border="0" /&gt;&lt;/a&gt; So why the post?  Most of the deals I've seen so far have been for older material, this doesn't mean they're not good, some texts are classic and their content might always be relevant, but books about version 1 of the .NET framework probably aren't.  Today's was actually published mere months ago on SQL Server 2008 XML (hopefully not the single row, single column XML blob that I've actually heard people talk about as a good idea! ).  In the future if I'll pass along other "good deals" in my opinion.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;I have no affiliation with APRESS, just think of this as a &lt;a href="http://en.wikipedia.org/wiki/Public_service_announcement"&gt;PSA&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/174.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/355308154" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/08/04/apress-ebook-deal-of-the-day.aspx</guid>
            <pubDate>Mon, 04 Aug 2008 13:02:57 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/174.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/08/04/apress-ebook-deal-of-the-day.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/174.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/174.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/08/04/apress-ebook-deal-of-the-day.aspx</feedburner:origLink></item>
        <item>
            <title>ASP.NET MVC Preview 4</title>
            <category>MVC</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/337461826/asp.net-mvc-preview-4.aspx</link>
            <description>&lt;p&gt;The ASP.NET MVC Team released &lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=15389"&gt;Preview 4&lt;/a&gt; today on &lt;a href="http://www.codeplex.com/aspnet"&gt;codeplex&lt;/a&gt;.  Scott Guthrie is planning a two part series to introduce it, &lt;a href="http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx"&gt;part 1 is here&lt;/a&gt;.  Phil Haack's follow up is &lt;a href="http://haacked.com/archive/2008/07/16/aspnetmvc-codeplex-preview4.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/173.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/337461826" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/07/16/asp.net-mvc-preview-4.aspx</guid>
            <pubDate>Wed, 16 Jul 2008 21:54:02 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/173.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/07/16/asp.net-mvc-preview-4.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/173.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/173.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/07/16/asp.net-mvc-preview-4.aspx</feedburner:origLink></item>
        <item>
            <title>MVP Again</title>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/324124322/mvp-again.aspx</link>
            <description>&lt;p&gt;I just found out that I have been rewarded an MVP for ASP/ASP.NET.  It's an honor to be part of such an awesome group and the .NET Community.&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/172.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/324124322" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/07/01/mvp-again.aspx</guid>
            <pubDate>Tue, 01 Jul 2008 15:14:27 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/172.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/07/01/mvp-again.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/172.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/172.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/07/01/mvp-again.aspx</feedburner:origLink></item>
        <item>
            <title>ReSharper 4.0 has released</title>
            <category>Tools</category>
            <link>http://feeds.feedburner.com/~r/TheQueue/~3/308863844/resharper-4.0-has-released.aspx</link>
            <description>&lt;p&gt;I can almost here the angels singing in the background.  &lt;a href="http://www.jetbrains.com/resharper/"&gt;ReSharper 4.0&lt;/a&gt; has finally been released and finally supports all the new C# 3.0 features.&lt;/p&gt;  &lt;p&gt;I spend a lot of my time helping a customer maintain a ASP.NET 1.1 application written in VB.NET, that somewhat muffles (or muzzles) those angels...&lt;/p&gt;&lt;img src="http://thequeue.net/blog//blog/aggbug/171.aspx" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/TheQueue/~4/308863844" height="1" width="1"/&gt;</description>
            <dc:creator>Jeff Schoolcraft</dc:creator>
            <guid isPermaLink="false">http://thequeue.net/blog//blog/archive/2008/06/10/resharper-4.0-has-released.aspx</guid>
            <pubDate>Tue, 10 Jun 2008 13:52:08 GMT</pubDate>
            <wfw:comment>http://thequeue.net/blog//blog/comments/171.aspx</wfw:comment>
            <comments>http://thequeue.net/blog//blog/archive/2008/06/10/resharper-4.0-has-released.aspx#feedback</comments>
            <wfw:commentRss>http://thequeue.net/blog//blog/comments/commentRss/171.aspx</wfw:commentRss>
            <trackback:ping>http://thequeue.net/blog//blog/services/trackbacks/171.aspx</trackback:ping>
        <feedburner:origLink>http://thequeue.net/blog//blog/archive/2008/06/10/resharper-4.0-has-released.aspx</feedburner:origLink></item>
    <lastBuildDate>Thu, 20 Nov 2008 00:00:00 -0600</lastBuildDate></channel>
</rss>
