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

<channel>
	<title>Pueblo Computing</title>
	<atom:link href="http://pueblocomputing.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://pueblocomputing.com/blog</link>
	<description>Life and times programming in the Steel City to the West</description>
	<lastBuildDate>Thu, 23 Sep 2010 02:43:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>TwitterVB 2.9.x: Now with UpdateProfileImage</title>
		<link>http://pueblocomputing.com/blog/?p=96</link>
		<comments>http://pueblocomputing.com/blog/?p=96#comments</comments>
		<pubDate>Thu, 23 Sep 2010 02:43:18 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[TwitterVB]]></category>
		<category><![CDATA[Visual Basic.NET]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=96</guid>
		<description><![CDATA[Twitter-2.9.9 Okay, we were a bit late to the party (blame schedules and stuff), but TwitterVB now has the ability to Update your profile image from a third party app or web site.&#160; This will continue to make TwitterVB a fantastic tool for Visual Basic programmers looking for a native way to add social networking [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://twittervb.codeplex.com/releases/view/52754">Twitter-2.9.9</a></p>
<p>Okay, we were a bit late to the party (blame schedules and stuff), but TwitterVB now has the ability to Update your profile image from a third party app or web site.&nbsp; This will continue to make TwitterVB a fantastic tool for Visual Basic programmers looking for a native way to add social networking tools to their applications.</p>
<p>At this point, we have a number of things we could go about, the #twitter could be one of them.&nbsp; Personally, I&#8217;m wondering if it isn&#8217;t time to add another project or two; in particular, I want to start developing a native Delphi Twitter library.&nbsp; If anybody else is interested, fill out the contact form and let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=96</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twistakes 101: What to do if your code goes wrong.</title>
		<link>http://pueblocomputing.com/blog/?p=94</link>
		<comments>http://pueblocomputing.com/blog/?p=94#comments</comments>
		<pubDate>Wed, 15 Sep 2010 12:56:40 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[TwitterVB]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=94</guid>
		<description><![CDATA[By the way, forgive me the awful twun.&#160; When talking twitter, sometimes I just can&#8217;t twelp. . .nevermind. If we all could write perfect code the first time, we&#8217;d be making as much money as Bill Gates (or he would be making as much as the rest of us).&#160; Sadly, this isn&#8217;t the case a [...]]]></description>
			<content:encoded><![CDATA[<p><i>By the way, forgive me the awful twun.&nbsp; When talking twitter, sometimes I just can&#8217;t twelp. . .nevermind.<br /></i>
<p>If we all could write perfect code the first time, we&#8217;d be making as much money as Bill Gates (or he would be making as much as the rest of us).&nbsp; Sadly, this isn&#8217;t the case a lot of the time; even when you&#8217;re using an awesome library like TwitterVB.</p>
<p>
<p>While some errors are truly bizzare, a lot of the errors are common and things that you will see in the TwitterVB discussions. Here&#8217;s my list of the errors and how to fix them.</p>
<p>
<h2>Using a different instance of the TwitterAPI class to validate a PIN than the one used to generate the URL.</h2>
<p>
<p>Suppose we have the following code:</p>
<p>
<blockquote>Imports TwitterVB2</p>
<p>Module Module1<br />&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; Sub Main()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim strURL As String<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim strPIN As String</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strURL = GetLinkURL()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process.Start(strURL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(&#8220;Input PIN: &#8220;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strPIN = Console.ReadLine()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop Until isValidPIN(strPIN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&#8220;This will never happen&#8221;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadKey()</p>
<p>&nbsp;&nbsp;&nbsp; End Sub</p>
<p>&nbsp;&nbsp;&nbsp; Function GetLinkURL() As String<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dim tw1 as new TwiterAPI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return tw1.GetAuthorizationLink(&#8220;consumerkey&#8221;, &#8220;consumersecret&#8221;)</p>
<p>&nbsp;&nbsp;&nbsp; End Function</p>
<p>&nbsp;&nbsp;&nbsp; Function isValidPIN(ByVal p_strPIN) As Boolean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dim tw2 as new TwitterAPI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return tw2.ValidatePIN(p_strPIN)</p>
<p>&nbsp;&nbsp;&nbsp; End Function<br />End Module</p></blockquote>
<p>
<p>Run that code in Visual Basic (just create a new console application), and run it.&nbsp; I can tell you that with the code as is, you will never reach the line that says &#8220;this will never happen&#8221;.</p>
<p>A quick look at the TwitterAPI code will tell you why:</p>
<p>
<blockquote>Public Function GetAuthenticationLink(ByVal ConsumerKey As String, ByVal ConsumerKeySecret As String) As String<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Me.Twitter_OAuth = New TwitterOAuth(ConsumerKey, ConsumerKeySecret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return Me.Twitter_OAuth.GetAuthenticationLink<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Function<br />. . .</p>
<p>&nbsp;Public Function ValidatePIN(ByVal PIN As String) As Boolean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return Me.Twitter_OAuth.ValidatePIN(PIN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Function</p></blockquote>
<p>Since the TwitterAPI is validating against the Twitter_OAuth object it filled with the first function, having two instances will guarantee a fail.&nbsp; Also, the comments note that you must call GetAuthenticationLink() first.&nbsp; This makes the first code unusable in its current state.</p>
<p>
<p>So how do you write this code so it goes through?&nbsp; One possible solution involves setting the TwitterAPI object at module or class level.&nbsp; Observe:</p>
<p>
<blockquote>Module Module1<br />&nbsp;&nbsp;&nbsp; Dim twConn As New TwitterAPI</p>
<p>&nbsp;&nbsp;&nbsp; Sub Main()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim strURL As String<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim strPIN As String</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strURL = GetLinkURL()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process.Start(strURL)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(&#8220;Input PIN: &#8220;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strPIN = Console.ReadLine()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop Until isValidPIN(strPIN)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&#8220;This will never happen&#8221;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadKey()</p>
<p>&nbsp;&nbsp;&nbsp; End Sub</p>
<p>&nbsp;&nbsp;&nbsp; Function GetLinkURL() As String</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return twConn.GetAuthorizationLink(&#8220;consumerkey&#8221;, &#8220;consumersecret&#8221;)</p>
<p>&nbsp;&nbsp;&nbsp; End Function</p>
<p>&nbsp;&nbsp;&nbsp; Function isValidPIN(ByVal p_strPIN) As Boolean</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return twConn.ValidatePIN(p_strPIN)</p>
<p>&nbsp;&nbsp;&nbsp; End Function<br />End Module</p>
</blockquote>
<p>
<p>This code will run seeing as how the same object created the authorization link and validated the returned PIN.</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=496d51ff-004d-82cd-804a-1c44da7cfb0d" /></div>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=94</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter: Basic auth is yesterday, oAuth is here to stay</title>
		<link>http://pueblocomputing.com/blog/?p=92</link>
		<comments>http://pueblocomputing.com/blog/?p=92#comments</comments>
		<pubDate>Thu, 02 Sep 2010 00:41:17 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[oAuth]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=92</guid>
		<description><![CDATA[Twitter ending Basic Auth We&#8217;ve known that this day was coming, and as of August 31, that day was yesterday. No longer will third-party applications be able to use Basic authentication, which transmits username/password combos in plain text. Rather, Twitter clients will have to utilize a system known as oAuth. This system uses tokens which [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.twitter.com/2010/08/twitter-applications-and-oauth.html">Twitter ending Basic Auth</a></p>
<p>We&#8217;ve known that this day was coming, and as of August 31, that day was yesterday.  No longer will third-party applications be able to use Basic authentication, which transmits username/password combos in plain text.  Rather, Twitter clients will have to utilize a system known as <a href="http://oauth.net">oAuth.</a>  This system uses tokens which are generated based upon information passed by the application and the user&#8217;s okay.</p>
<p>While this system is safer in terms of user information, it does present problems for some developers.  Namely, the fact that this requires a web browser will cause some consternation to some developers.  However, I think that most developers will eventually learn to adapt around these limitations.  Neither do I buy the argument that I have seen around the web that this will somehow squeeze small developers.  Bull.  The oAuth standard is open and there are already several <a href="http://dev.twitter.com/pages/libraries">Twitter libraries that implement the oAuth standard</a>.</p>
<p>Another complaint I have heard involves Open Source.&nbsp; Several have complained that the nature of Open Source requires them to disclose their consumer key combos (the keys that developers use to generate the Tokens).&nbsp; Thus, a rogue programmer could hijack a set of keys and use them for spamming which would get the innocent programmer kicked.&nbsp; This is a misunderstanding of Open Source.&nbsp; Open Source only requires you to disclose the source code; it does not require you to disclose the information.&nbsp; Programs can be written without hard coding the consumer key or consumer key secret.&nbsp; Even if you do it is relatively simple to distribute the binary file with the keys and the source without it.</p>
<p>Ultimately, however, it is Twitter&#8217;s service.&nbsp; Developers that are looking to hook their product onto Twitter will have to develop around these limitations.</p>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=92</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Good Computerkeeping</title>
		<link>http://pueblocomputing.com/blog/?p=89</link>
		<comments>http://pueblocomputing.com/blog/?p=89#comments</comments>
		<pubDate>Fri, 14 May 2010 13:30:49 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[computers]]></category>
		<category><![CDATA[backups]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[mozbackup]]></category>
		<category><![CDATA[passwords]]></category>
		<category><![CDATA[TASKKILL]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=89</guid>
		<description><![CDATA[Well, I&#8217;ve started some computer related tasks today.&#160; Most of them are housekeeping, which I am horrible at.&#160; But a lot of these tasks need to be done. Changing passwords: Now I&#8217;m not a big password changer. First off, frequently changing your passwords is pretty much a waste of time. However my choices for passwords [...]]]></description>
			<content:encoded><![CDATA[<p>Well, I&#8217;ve started some computer related tasks today.&nbsp; Most of them are housekeeping, which I am horrible at.&nbsp; But a lot of these tasks need to be done.</p>
<ol>
<li><b>Changing passwords</b>:  Now I&#8217;m not a big password changer.  First off, frequently changing your passwords is pretty much a <a href="http://blogs.bnet.com/businesstips/?p=7187">waste of time.</a> However my choices for passwords have been a little bit substandard. So I needed a way to change them.  Again, not my favorite task.  Enter <a href="http://www.ikitek.com/products/Infinite-Password-Generator.html">infinite password generator.</a> Just enter a master password and a keyword and you are set up.  Easy enough for even the most oblivious user.</li>
<li><b>Automating backups</b>: I admit I&#8217;m a bit better at backups, but they are still something that I do manually.  In particular backing up my Thunderbird and Firefox profiles with <a href="http://mozbackup.jasnapaka.com/">Mozbackup</a>. BTW if you don&#8217;t have this tool and use either one of the above Mozilla products, what are you waiting for?.  As to where to back them up to, I normally have those profiles backed up to my <a href="http://www.dropbox.com">Dropbox</a>, which is mapped to my file system.  So I figured that I would automate mozbackup to do this every day.  Thankfully mozbackup has <a href="http://mozbackup.jasnapaka.com/command-line-backup.php">command line options to do this.</a> So I used Windows Task Scheduler to set this up at a time when I wasn&#8217;t using the program.<br />
Which brought me to my next problem:  Mozbackup will not work if you have the program you want to back up open.  So I needed to kill the program, if it is running. One Google search later I ran across the TASKKILL command.  So I set up a batch program to kill off thunderbird if it is running.</li>
</ol>
<p>And what are you doing for your computerkeeping?</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=8fd86a2c-b100-8138-83f8-384063f37bdd" /></div>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=89</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This Adobe-Apple bitchfight is getting more interesting</title>
		<link>http://pueblocomputing.com/blog/?p=87</link>
		<comments>http://pueblocomputing.com/blog/?p=87#comments</comments>
		<pubDate>Mon, 10 May 2010 02:04:32 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[technology]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=87</guid>
		<description><![CDATA[Report: Apple developing a Flash alternative &#124; Apple &#8211; CNET News The heated battle between Apple and Adobe Systems over Flash may get a bit more interesting, as reports of a Flash alternative being developed by Apple begin to surface. (Credit: Apple) The technology, called Gianduia, was introduced by Apple last summer at its World [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://news.cnet.com/8301-13579_3-20004509-37.html">Report: Apple developing a Flash alternative | Apple &#8211; CNET News</a></p>
<blockquote><p>The heated battle between Apple and Adobe Systems over Flash may get a bit more interesting, as reports of a Flash alternative being developed by Apple begin to surface.<br />
(Credit: Apple)</p>
<p>The technology, called Gianduia, was introduced by Apple last summer at its World of WebObjects Developer Conference, according to an AppleInsider report. Gianduia is described as being &#8220;a client-side, standards-based framework for rich Internet apps.&#8221; </p></blockquote>
<p>I&#8217;ll admit, I was intrigued by the Apple-Adobe slap fight if only for the sheer balls of the thing. I mean, Mr. Jobs telling somebody else to use &#8220;open standards&#8221;.  As in Steve Jobs, the head of Apple. The head of a company that has had both its hardware and software in such a lockdown mode that if it weren&#8217;t for the fact that it&#8217;s market share was so small the DOJ would have broken it up decades ago (and it still might be investigated for possible <a href="http://news.cnet.com/8301-31021_3-20004138-260.html">anti-trust violations still.</a>
</p>
<p>Now there&#8217;s this, which could be compared to Microsoft&#8217;s creation of C# to get around having to license Java.  Look,I&#8217;m always interested in new frameworks, but if this is just Apple&#8217;s way of pushing Adobe around and sending a message to all developers that it&#8217;s &#8220;Jobs way or the high way&#8221; then no thank you Steve.</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=ad0aab9f-0c03-8929-a5a6-d5386c408513" /></div>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=87</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>One backup service I definitely recommend</title>
		<link>http://pueblocomputing.com/blog/?p=84</link>
		<comments>http://pueblocomputing.com/blog/?p=84#comments</comments>
		<pubDate>Mon, 10 May 2010 01:28:56 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[reviews]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[files]]></category>
		<category><![CDATA[idrive]]></category>
		<category><![CDATA[online]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=84</guid>
		<description><![CDATA[Online Backup &#8211; IDrive &#8211; Remote Data Backup &#8211; For Windows and Mac &#8211; IDrive Portable Hard Drive Backing up data is easy. The hard part comes when you have to restore that data, and that&#8217;s where IDrive really does shine. A couple of days ago I had to reinstall my hard drive. It happens [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.idrive.com/">Online Backup &#8211; IDrive &#8211; Remote Data Backup &#8211; For Windows and Mac &#8211; IDrive Portable Hard Drive</a></p>
<p>Backing up data is easy. The hard part comes when you have to restore that data, and that&#8217;s where IDrive really does shine.</p>
<p>A couple of days ago I had to reinstall my hard drive. It happens from time to time, especially when you are downloading and testing a lot of different applications.  Unfortunately, I forgot to make a local copy of the things that were the most important to me: namely, the applications I had written and my documents.  This is stuff that isn&#8217;t exactly replaceable.  After the typical panic I remembered that I had tried out IDrive and logged back in.  Lo and behold, I was able to quickly restore those documents.  Just a click and a checkmark and I was in business.  IDrive is one of those services that you have to try.  It starts out with a 2 GB limit but you can push that up to 12 with a promotional e-mail sent out.  Best of all, you can schedule the backup to when you are not actively surfing the Internet. I would sign up for this service today.</p>
<p>&nbsp;</p>
<div class="zemanta-pixie"><img src="http://img.zemanta.com/pixy.gif?x-id=c45b5742-aea4-8eaf-9c57-e7ec33ec503f" alt="" class="zemanta-pixie-img" /></div>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=84</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>How Not to Use Powerpoint</title>
		<link>http://pueblocomputing.com/blog/?p=80</link>
		<comments>http://pueblocomputing.com/blog/?p=80#comments</comments>
		<pubDate>Sat, 01 May 2010 21:11:30 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=80</guid>
		<description><![CDATA[Rack this video:]]></description>
			<content:encoded><![CDATA[<p>Rack this video:</p>
<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/ORxFwBR4smE&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ORxFwBR4smE&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=80</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>xAuth (Part 1)</title>
		<link>http://pueblocomputing.com/blog/?p=75</link>
		<comments>http://pueblocomputing.com/blog/?p=75#comments</comments>
		<pubDate>Fri, 30 Apr 2010 20:11:47 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[TwitterVB]]></category>
		<category><![CDATA[xAuth]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=75</guid>
		<description><![CDATA[Earlier this year, Twitter announced that it would be ending support of Basic Authentication (or Authentication through a username/password combination). The date has now been set as April 30, 2010. As of that date, basic authentication will no longer be allowed and all apps connecting to Twitter will be required to use oAuth. One problem [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier  this year, Twitter announced that it would be ending support of Basic  Authentication (or Authentication through a username/password  combination).  The date has now been set as April 30, 2010. As of that date, basic  authentication will no longer be allowed and all apps connecting to  Twitter will be required to use oAuth.</p>
<p>One  problem with transferring from Basic to xAuth is with applications who  use a lot of different accounts for legitimate purposes.  These may be  web applications used for a lot of different people OR desktop apps  installed on a lot of computers.  A lot of these computers still have  the username/password.  To make it easier to transition Twitter is  offering xAuth access.  xAuth generates the tokens through the user of  the applications own consumer keys (public and secret) and the  username/password combination.  These can be sent without use of a  browser, which can be good for programs residing on servers and other  devices that don&#8217;t have human interaction.  And now you can convert your  application over with the latest version of TwitterVB, 2.5.  By using  TwitterVB you can isolate yourself from the messy business of generating  http signatures and proper encoding and focus on your application.</p>
<h2>How to transfer?</h2>
<p>Before you transfer you need to get permission for your application to  use xAuth.  If you do not, any code you write based on what is below  will bounce off with a 401 unauthorized error.  Before that, however,  you need to set up your application to use oAuth.  Visit Twitter.com and  register your client  application. You&#8217;ll need the client&#8217;s name, function, URLs, and whether  it just needs read access or read/write access.  Once you fill that out  you will be presented with a page with two long strings, the consumer  key and the consumer secret.  These are needed to sign your requests.</p>
<p>There&#8217;s  also one other number you should write down.  The URL will have a&nbsp;  number at the end is your application&#8217;s ID.  That will be very important  in order to turn on xAuth access in a moment.  Next, we need to ask  permission for your app to access xAuth.  Send an e-mail with the ID,  name of your app, and a description of why your app needs xAuth (either  permanently or temporarily) to api at twitter dot com.   Typically you can expect a response within 8 business hours.</p>
<h2>How to implement</h2>
<p>For the following examples. I am going to create a simple Console  application that logs in, prints everything off my public timeline, and  leaves.  I create the console application, and then I go into the  project settings and set four string variables:<br />
*m_strConsumerKey<br />
*m_strConsumerSecret<br />
*m_strToken<br />
*m_strTokenSecret<br />
These  will all be accessed through the My.Settings namespace.  I set the  ConsumerKey and ConsumerSecret to what I received on the page where I  registered my program and added a reference to TwitterVB (making sure  that it&#8217;s at least the 2.5 version)</p>
<p>Next, I write the following  code:</p>
<pre>Imports TwitterVB2

Module Module1

    Sub Main()        Dim twConn As New TwitterAPI        Dim strPassword As String        Dim strUserName As String

        Try

            If My.Settings.m_strToken.Trim.Length = 0 Then                Console.Write(&quot;Input Username: &quot;)                strUserName = Console.ReadLine()                Console.Write(&quot;Input Password: &quot;)                strPassword = Console.ReadLine()                twConn.XAuth(strUserName, strPassword, My.Settings.m_strConsumerKey, My.Settings.m_strConsumerSecret)                My.Settings.m_strToken = twConn.OAuth_Token                My.Settings.m_strTokenSecret = twConn.OAuth_TokenSecret                My.Settings.Save()            Else                twConn.AuthenticateWith(My.Settings.m_strConsumerKey, My.Settings.m_strConsumerSecret, My.Settings.m_strToken, My.Settings.m_strTokenSecret)            End If

            For Each twStat As TwitterStatus In twConn.UserTimeline

                Console.WriteLine(twStat.ID.ToString() &amp; &quot;:&quot; &amp; twStat.Text)            Next            twConn.Update(&quot;Read timeline at &quot; &amp; DateTime.Now.ToString)

            Console.ReadKey()        Catch ex As TwitterAPIException            Console.WriteLine(ex.Message)            Console.ReadKey()        Catch ex As Exception            Console.WriteLine(ex.Message)            Console.ReadKey()        End Try

    End Sub

End Module</pre>
<p>Run it the first time, and the user will be asked for  their name and password.  Run it again, and it shouldn&#8217;t have to ask for  anything. It will just authenticate like any normal oAuth app  browserlessly because it already has the tokens.  You&#8217;ve now set up your  application to use oAuth and haven&#8217;t had to open a browser window to do  it either.</p>
<h2>Caveats</h2>
<p><strong>By using xAuth, you are agreeing not to store the username/password  combination</strong>.  Once you receive the information you should delete  that as a combination so that it cannot be used by somebody else.  Done  properly, you shouldn&#8217;t have to use this more than once for any given  account.  Caching user information such as the username, screenanme, etc  should be okay and in fact encouraged to conserve on rate limits.<br />
Also,  while web applications can use xAuth they can only use it on a  temporary basis to batch convert existing accounts on over.  This means  that before you ask for xAuth you should convert your site over so that  it can use oAuth, then ask for xAuth access to batch convert existing  accounts.  Once you have converted them you should at least delete the  passwords and at that point be set for using oAuth on a permanent basis.<br />
Finally,  while desktop or mobile apps may be granted a more permanent use I  would not count on it. The goal should be to convert existing accounts.  If there is any way to use a browser on your system then do so.   Document every reason why you cannot (aesthetics probably won&#8217;t be  accepted) before you request permanent xAuth.</p>
<h2>Conclusion</h2>
<p>With the countdown to the shutdown of Basic authentication, many  applications are finding themselves stuck between a rock and a hard  place.  XAuth in TwitterVB should help you transition more smoothly as  long as you remember it&#8217;s should only be counted on as a temporary help  unless you are notified otherwise by Twitter.</p>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=75</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aaannnnddd he misses the point by a country mile.</title>
		<link>http://pueblocomputing.com/blog/?p=71</link>
		<comments>http://pueblocomputing.com/blog/?p=71#comments</comments>
		<pubDate>Thu, 15 Apr 2010 20:07:03 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[plagarism]]></category>
		<category><![CDATA[copyright]]></category>
		<category><![CDATA[students]]></category>
		<category><![CDATA[turnitin]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=71</guid>
		<description><![CDATA[Turnitin privacy worries? Then stop plagiarizing &#124; Education IT &#124; ZDNet.com Want to avoid this level of scrutiny? Write your own bloody papers. Who knows? The $40,000 a year education might teach you something more than Googling 101 or Advanced Cut and Paste. The very fact that Turnitin exists and is deemed necessary by so [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://education.zdnet.com/?p=3826">Turnitin privacy worries? Then stop plagiarizing | Education IT | ZDNet.com</a></p>
<blockquote><p>Want to avoid this level of scrutiny? Write your own bloody papers. Who knows? The $40,000 a year education might teach you something more than Googling 101 or Advanced Cut and Paste. The very fact that Turnitin exists and is deemed necessary by so many educators fires me up. Regular readers will know that I&rsquo;m all about Google. It&rsquo;s a brilliant resource, as is Wikipedia and the other billion or so pages of non-junk on the web. However, students should be able to not only find information, but differentiate the good from the bad and then use it to form their own ideas, in their own words.</p></blockquote>
<p>The point is not about students not wanting their works to be checked against some sort of database (though I will concede cheaters probably wouldn&#8217;t want it too).  The point is what happens to the piece after the check.  Namely, the fact that the service, turnitin, stores the papers without the express consent of the authors.</p>
<p>Turnitin&#8217;s <a href="http://turnitin.com/resources/documentation/turnitin/sales/Turnitin_FAQ_For_Students.pdf">justification for this is rather hilarious:</a></p>
<p>&nbsp;</p>
<blockquote><p>Further, because student works become part of the database against which other students&#8217; work is compared, Turnitin helps protect the papers from being exploited by others who might profitably claim them as their own work, or sell them to other students. </p></blockquote>
<p>That&#8217;s like saying a thief who steals your credit card numbers then stores them in a safe is not only not stealing, but helping you since the safe can&#8217;t be broken by other robbers.  Thanks, but no thanks.</a></p>
<p>Look, 90% of student work is probably overall crap.  I know mine was and I&#8217;m lowballing the estimate. Even where it wasn&#8217;t I&#8217;d probably polish it a little more before I went to a publishing house. So I&#8217;m not thinking that some student might accidentally publish the Great American Novel and turnitin steals it. But I do think that if you&#8217;re going to use the papers to profit off of your service and you are using the entire paper (as opposed to a minimum to illustrate as the above)  maybe you should ask them nicely.  Maybe you should even kick them off something for their efforts.</a></p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=2dde84da-677c-8d78-86c3-7dbd743e305a" /></div>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=71</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Storing persistant data: A primer</title>
		<link>http://pueblocomputing.com/blog/?p=66</link>
		<comments>http://pueblocomputing.com/blog/?p=66#comments</comments>
		<pubDate>Fri, 09 Apr 2010 20:04:00 +0000</pubDate>
		<dc:creator>John Meyer</dc:creator>
				<category><![CDATA[programming]]></category>
		<category><![CDATA[app.settings]]></category>
		<category><![CDATA[settings]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[Visual Basic.NET]]></category>

		<guid isPermaLink="false">http://pueblocomputing.com/blog/?p=66</guid>
		<description><![CDATA[If you are a beginner, chances are that you haven&#8217;t been working with storing and using persistent data in between sessions. In fact, most of your apps probably have been the simple type that start in the same state every time you use them. While this is okay when you are learning how to program, [...]]]></description>
			<content:encoded><![CDATA[<p>If you are a beginner, chances are that you haven&#8217;t been working with storing and using persistent data in between sessions.  In fact, most of your apps probably have been the simple type that start in the same state every time you use them. While this is okay when you are learning how to program, the fact remains that you want to store what you did and pick up where you were at a later time.  Can you imagine writing out the Great American Novel, exiting your word processor and then having to type the whole thing over again when you booted back up?  I don&#8217;t think the computer revolution would have gotten far if that happened.</p>
<p>&nbsp;</p>
<p>Visual Basic, like other languages, provides a number of ways to persist data by storing it.  The list is pretty long, but for right now we&#8217;ll divide them into the Applications Settings file, a file on the hard drive, and the registry.  Each of these ways provides a way to persist the data and each has its ideal purposes.</p>
<p>&nbsp;</p>
<h2>The app.settings</h2>
<p>&nbsp;</p>
<p>To illustrate what I am talking about, fire up Visual Basic.NET (or SharpDevelop if you prefer), create a console Application, and enter the following:</p>
<p>&nbsp;</p>
<blockquote><p>
<font face="monospace"><br />
Module Module1</p>
<p>Sub Main()<br />
Dim i_Total As Integer<br />
Console.WriteLine(&quot;Total at start=&quot; &amp; i_Total)<br />
Dim a_inx As Integer</p>
<p>Do<br />
Console.Write(&quot;Enter a number (-1 to quit)&quot;)<br />
a_inx = CInt(Console.ReadLine)<br />
If (a_inx &gt; -1) Then<br />
i_Total = i_Total + a_inx<br />
End If<br />
Loop Until a_inx = -1<br />
Console.WriteLine(&quot;Total is &quot; &amp; CStr(i_Total))<br />
Console.ReadKey()</p>
<p>End Sub</p>
<p>End Module<br />
</font>
</p></blockquote>
<p>&nbsp;</p>
<p>Run it one time, and type in some random numbers. It doesn&#8217;t really matter what numbers you type. Just write out the total it gives you at the end.  Now, close it and start again.  Did you notice that total started at 0 again?  That&#8217;s because as soon as the application terminated the GC wiped out all those values in memory.  While that may be good for some cases, if you are wanting to keep a total over a number of days and aren&#8217;t planning on keeping the program up and running all the time, you need to store that data. RAM is very fast storage but as soon as the power is off, or somebody deletes something, that information is gone.  So, how do you store it?</p>
<p>&nbsp;</p>
<p>In Visual Basic, go to Project-&gt;Settings menu item.  This will bring up a screen with all sorts of settings. For now, we&#8217;re going to ignore them.  Click on the Settings sidetab.  You should now see a grid to the right.  This is where you can set down certain variables that will be written to file.</p>
<p>&nbsp;</p>
<p>Create a new setting called &quot;i_Total&quot; as an Integer. It will initialize to a zero value.  Now modify your code this way:</p>
<blockquote><p>
<font face="monospace"><br />
Sub Main()<br />
Dim i_Total As Integer<br />
If My.Settings.i_Total &gt; 0 Then<br />
i_Total = My.Settings.i_Total<br />
End If<br />
Console.WriteLine(&quot;Total at start=&quot; &amp; i_Total)<br />
Dim a_inx As Integer</p>
<p>Do<br />
Console.Write(&quot;Enter a number (-1 to quit)&quot;)<br />
a_inx = CInt(Console.ReadLine)<br />
If (a_inx &gt; -1) Then<br />
i_Total = i_Total + a_inx<br />
End If<br />
Loop Until a_inx = -1<br />
Console.WriteLine(&quot;Total is &quot; &amp; CStr(i_Total))<br />
My.Settings.i_Total = i_Total<br />
My.Settings.Save()<br />
Console.ReadKey()</p>
<p>End Sub</p>
<p></font>
</p></blockquote>
<p>&nbsp;</p>
<p>Run the app. You&#8217;ll notice that it says 0.  Enter random numbers like before then -1 to break the loop.  Note down the total.  Now run it again. The starting value should now be the same as the ending value.  This is because you told the program &quot;If I have stored this value in the past, load it into my variable. Add some integers, and once complete save the new total to the disk in a user.config file</p>
<p>&nbsp;</p>
<p>So where does it get stored?  If you check the directory of your program, you won&#8217;t find it there.  What you will find is an &lt;app&gt;. XML file, which will read something like this:</p>
<p>&lt;userSettings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Settings_Test.My.MySettings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;setting name=&quot;i_Total&quot; serializeAs=&quot;String&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;0&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/setting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Settings_Test.My.MySettings&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/userSettings&gt;</p>
<p>So where did it store that value? It stored it in a user.config XML file underneath your application folder (AppData for Vista, Application Data for Windows XP).&nbsp; Note, in order to see this folder you have to update the options for your file viewer to show hidden files.&nbsp; once there, you will find something like this:</p>
<p>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />
&lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;userSettings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Settings_Test.My.MySettings&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;setting name=&quot;i_Total&quot; serializeAs=&quot;String&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;178&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/setting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Settings_Test.My.MySettings&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/userSettings&gt;<br />
&lt;/configuration&gt;</p>
<p>That&#8217;s where your value is.&nbsp; You can edit that value even if you are not in the program. Type a number in where the value is, save it, then rerun the program.&nbsp; The program will give you the new changed value now.</p>
<p>You can store more than just numbers in the settings file.&nbsp; For instance, open the project settings page like we did before and enter a new variable strName (leave it blank).&nbsp; Now modify the code to the following:</p>
<p><font face="Courier New">Module Module1</p>
<p>&nbsp;&nbsp;&nbsp; Sub Main()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim i_Total As Integer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If My.Settings.i_Total &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_Total = My.Settings.i_Total<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If My.Settings.strName.Trim.Length &gt; 0 Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Hello, &quot; &amp; My.Settings.strName &amp; &quot; Get ready to add.&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(&quot;I don&#8217;t know who you are, could you enter your name?&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; My.Settings.strName = Console.ReadLine<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; My.Settings.Save()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Thank you &quot; &amp; My.Settings.strName)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Total at start=&quot; &amp; i_Total)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim a_inx As Integer</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.Write(&quot;Enter a number (-1 to quit)&quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a_inx = CInt(Console.ReadLine)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (a_inx &gt; -1) Then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_Total = i_Total + a_inx<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop Until a_inx = -1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(&quot;Total is &quot; &amp; CStr(i_Total))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; My.Settings.i_Total = i_Total<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; My.Settings.Save()</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.ReadKey()</p>
<p>&nbsp;&nbsp;&nbsp; End Sub</p>
<p>End Module</font></p>
<p><font face="Courier New"><font face="Arial">Fire up the program again.&nbsp; On the first time through it should ask for your name.&nbsp; On the second time through it should retrieve the name and the number and pick up right where you belong.</font></font></p>
<p><font face="Courier New"><font face="Arial">Settings are commonly used for single, short items of memory. Logins, passwords, etc.&nbsp; Note that by themselves they have a disadvantage:&nbsp; if you store information in that file without any sort of encryption any other program can come along and read and even modify those variables.&nbsp; Therefore you should take precautions to ensure that you are not being fed junk (this is especially true with things like connection strings to databases).</font></font></p>
<p>App.Settings is a great place to store the value of variables that you wish to persist over time.&nbsp; But it&#8217;s not the only place.</p>
<p>&nbsp;</p>
<div class="zemanta-pixie"><img src="http://img.zemanta.com/pixy.gif?x-id=29de6aa1-d46d-8ef8-9b7c-f12287767310" alt="" class="zemanta-pixie-img" /></div>
]]></content:encoded>
			<wfw:commentRss>http://pueblocomputing.com/blog/?feed=rss2&#038;p=66</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

