<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CEMFSHs9eCp7ImA9WhVUFUQ.&quot;"><id>tag:blogger.com,1999:blog-17890083</id><updated>2012-05-21T05:26:59.560-04:00</updated><category term="Visual Studio" /><category term="Dual-boot" /><category term="Microsoft Access" /><category term="SQL Server" /><category term="Windows on Mac" /><category term="DRM" /><category term="System administration" /><category term="Mac OS X" /><category term="DSN" /><category term="ODBC" /><category term="T-SQL" /><category term="Windows" /><category term="Web development" /><category term="Microsoft Visual Studio" /><category term="Programming" /><category term="C# and .NET" /><category term="ASP.NET" /><title>Tech Blech</title><subtitle type="html">Varioso for programmers.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/blogspot/techblech" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="blogspot/techblech" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;DU8FQXk4eip7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-5727895198884445411</id><published>2011-12-03T12:36:00.002-05:00</published><updated>2012-02-26T09:50:10.732-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:50:10.732-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Web development" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><title>How to write to the disk (make a writable folder) in ASP.NET</title><content type="html">To do file uploads, some administration is always necessary on the server side.  ASP.NET tries very hard to prevent users from writing anywhere on the server, so we have to take special steps if file upload is required. In particular, the IIS7 server will not let you both Execute and Write into the same folder.  For the record, here are the steps for IIS7 on Windows Server 2008 (assuming you are system administrator on the server):&lt;br /&gt;
&lt;br /&gt;
* the user creates an uploads folder and sends its file spec to the administrator&lt;br /&gt;
* the administrator opens the Internet Information Services (IIS) Manager, browses to that folder, and right clicks over it to change file permissions as follows for the NETWORK SERVICE account:&lt;br /&gt;
** remove Read and Execute permission&lt;br /&gt;
** add Write permission&lt;br /&gt;
&lt;br /&gt;
Both permissions should be changed in one step, and that &lt;i&gt;should&lt;/i&gt; be all that is necessary.  But test the write and subsequent read carefully; if either does not work, delete the folder, create a new one, and start all over again.&lt;br /&gt;
&lt;br /&gt;
If you are using a hosting service, there should be some special procedure to get the permissions changed.  In my experience, changing the permissions for this purpose has spotty success and can lead to a drawn-out hassle.  I suppose it's worth it to have a reasonably secure server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-5727895198884445411?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/5727895198884445411/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=5727895198884445411" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/5727895198884445411?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/5727895198884445411?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2011/12/making-writable-folder-in-aspnet.html" title="How to write to the disk (make a writable folder) in ASP.NET" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DU4ERXk5fyp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-1544234907354249867</id><published>2011-11-01T10:39:00.003-04:00</published><updated>2012-02-26T09:51:44.727-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:51:44.727-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C# and .NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Visual Studio" /><title>VS.NET 2010 fails to compile program created earlier in VS.NET 2008</title><content type="html">Trying to recompile a program in Visual Studio 2010, which was originally created using Visual Studio 2008 (which is still on my PC), I got this baffling message:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;Error 9 Task failed because "sgen.exe" was not found, or the correct Microsoft Windows SDK is not installed. The task is looking for "sgen.exe" in the "bin" subdirectory beneath the location specified in the InstallationFolder value of the registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v6.0A. You may be able to solve the problem by doing one of the following:  1) Install the Microsoft Windows SDK for Windows Server 2008 and .NET Framework 3.5.  2) Install Visual Studio 2008.  3) Manually set the above registry key to the correct location.  4) Pass the correct location into the "ToolPath" parameter of the task.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
These suggestions were too bizarre even to consider, and so I Googled.  Right away, I found &lt;a href="http://dukelupus.wordpress.com/2008/02/05/task-failed-because-sgenexe-was-not-found-solution/"&gt;this nice blog entry&lt;/a&gt; which helped me out, and just in case it were to go away, I'm duplicating the helpful information it contains below.  So, courtesy of the "dukelupus" blog, everything after this paragraph is copied verbatim from that blog. &lt;br /&gt;
&lt;br /&gt;
Changing the registry key will not help nor will adding C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\ to the path. I did not try other solutions...I used FileMon to check what Visual Studio is looking for – and it appears that it will always look for that file at C:\WINDOWS\Microsoft.NET\Framework\v3.5\, which does not contain sgen.exe.&lt;br /&gt;
&lt;br /&gt;
Just copy sgen.exe from C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\ to C:\WINDOWS\Microsoft.NET\Framework\v3.5\ and everything will now compile just fine. Here, to make your life easier, copy command:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;copy /y “C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\sgen.exe”  “C:\WINDOWS\Microsoft.NET\Framework\v3.5\”&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-1544234907354249867?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://dukelupus.wordpress.com/2008/02/05/task-failed-because-sgenexe-was-not-found-solution/" title="VS.NET 2010 fails to compile program created earlier in VS.NET 2008" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/1544234907354249867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=1544234907354249867" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1544234907354249867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1544234907354249867?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2011/11/vsnet-2010-fails-to-compile-after.html" title="VS.NET 2010 fails to compile program created earlier in VS.NET 2008" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcEQH0yeCp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-2990381131864281498</id><published>2011-08-24T13:13:00.006-04:00</published><updated>2012-02-26T09:53:21.390-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:53:21.390-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="T-SQL" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>SQL Server Management Studio and the "Saving changes is not permitted" error.</title><content type="html">Sometimes after a new install of Microsoft SQL Server Management Studio, you may get a default setting that prevents the user from changing the design of tables in the visual designer mode, which can be extremely frustrating, as it is not easy to figure out how to turn the checking off that is preventing table redesign.  The error message will be announced in an annoying popup whose text is uncopyable:
&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;"Saving changes is not permitted.  The changes you have made require the folloing tables to be dropped and re-created. You have either made changes to a table that can't be re-created or enabled the option Prevent saving changes that require the table to be re-created."&lt;/i&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's how to solve this in Microsoft SQL Server Management Studio 2008:
&lt;br /&gt;
&lt;br /&gt;
1) Go into the Tools...Options... menu
&lt;br /&gt;
&lt;br /&gt;
2) In the popup, on the left, expand "Designers" by clicking on the plus
&lt;br /&gt;
&lt;br /&gt;
3) In the "Table Options" shown to the right, MAKE SURE that "Prevent saving changes that require table re-creation" is NOT checked.
&lt;br /&gt;
&lt;br /&gt;
I've lost a few hours of my life to this nuisance.  Hope this will help someone else out of the conundrum.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-2990381131864281498?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/2990381131864281498/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=2990381131864281498" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/2990381131864281498?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/2990381131864281498?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2011/08/sql-server-management-studio-and-saving.html" title="SQL Server Management Studio and the &quot;Saving changes is not permitted&quot; error." /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcCR3c-fCp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-3330781730647509925</id><published>2011-06-10T08:29:00.008-04:00</published><updated>2012-02-26T09:54:26.954-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:54:26.954-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ODBC" /><category scheme="http://www.blogger.com/atom/ns#" term="DSN" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>ODBC workaround (Access to SQL Server) for 64-bit Windows 7</title><content type="html">I've been avoiding 64-bit Windows due to various incompatibility rumors, but this case takes the cake, as it is entirely Microsoft's fault.  My work place uses a variety of shared Access databases, located on a network drive, that connect via ODBC System DSN's to a SQL Server 2008.&lt;br /&gt;
&lt;br /&gt;
Even though all DSN's appeared to be configured correctly on my colleague's brand new (64-bit) Windows 7 machine, and the ODBC connections passed their test, the actual database declined to connect to the server.  Thanks to various discussion groups, we finally figured out that the graphical user interface accessible from the Administrative Tools applet in Control Panel actually brings up a 64-bit ODBC application, whereas we (for backwards compatibility) needed the strangely hidden 32-bit System DSN window.  To run it, we had to browse to this path:&lt;br /&gt;
&lt;br /&gt;
C:\Windows\SysWOW64\odbcad32.exe&lt;br /&gt;
&lt;br /&gt;
Clicking on &lt;b&gt;odbcad32.exe&lt;/b&gt; runs the 32-bit version of the ODBC connection setter upper.  There, we re-created all the System DSN's, and finally the Access databases were happy.&lt;br /&gt;
&lt;br /&gt;
&lt;img administration="" alt="ODBC" console"="" data="" source="" src="http://harbormist.com/blogmedia/odbc_DS_admin.jpg" width="400px" /&gt;&lt;br /&gt;
&lt;br /&gt;
By default, the Windows GUI is presenting a 64-bit ODBC connection setter upper (which I believe is in the C:\Windows\system32 path somewhere.  Going manually to the first path and running the application, then adding the ODBC connections, makes it work.&lt;br /&gt;
&lt;br /&gt;
In the meantime, 3 days of work were lost to this problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-3330781730647509925?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/3330781730647509925/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=3330781730647509925" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3330781730647509925?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3330781730647509925?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2011/06/odbc-workaround-access-to-sql-server.html" title="ODBC workaround (Access to SQL Server) for 64-bit Windows 7" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkYGRHo5eSp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-4304006463284001560</id><published>2011-04-22T15:58:00.015-04:00</published><updated>2012-02-26T09:55:25.421-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:55:25.421-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="DRM" /><title>Richard Stallman's speech "A Digital Society", Apr 20, 2011</title><content type="html">&lt;a href="http://harbormist.com/blogmedia/stallmann_photo.txt"&gt;&lt;img alt="Richard Stallman in 2008" src="http://harbormist.com/blogmedia/stallman.jpg" width="250px" /&gt;&lt;/a&gt;&lt;br /&gt;
This week Richard Stallman, founder of the free software ("free as in freedom") movement, gave a talk at the University of Pennsylvania.  It's been far too long since I heard a good radical plying his trade.  Stallman is blunt and uncompromising, fully intending to stir folks up and make them think about how they may be being manipulated by those who wish to track and surveil and control.  His talk included some often amusing provocations:&lt;br /&gt;
1. He calls the Kindle a "Swindle" and the Nook a "Schnook" because we are not allowed to lend a book we have purchased to our friends, and because the seller can recall a book from your possession at any time (as Amazon once famously did with George Orwell's "1984").&lt;br /&gt;
2. Modern devices (including cable boxes, cell phones, and computers) often surveil us and may subject us, later, to censorship.&lt;br /&gt;
3. The use of proprietary and closed data formats and software increases the chances of our privacy being invaded, and decreases our ability to learn the art of software programming.&lt;br /&gt;
4. If only all the effort and expense devoted to the public war on sharing, deemed by Stallman as an attack on community (including Digital "Restrictions" Management (DRM), and the Digital Millenium Copyright Act that makes it illegal for us to know how some software works)--if only this effort could be redirected towards, say, preventing automobile accidents, thousands of lives per month might be saved.&lt;br /&gt;
5. The precariousness of our right to access the global internet is lamentable, because according to Stallman, "the U. S. governement has been bought". &lt;br /&gt;
6. According to Stallman, it is every citizen's duty to poke Big Brother in the eye.&lt;br /&gt;
7. Blame the government, he says, and blame the companies the U S Government works for.&lt;br /&gt;
&lt;br /&gt;
Stallman gave permission to publish a recording of his speech, ironically made by a student on her devilish iPhone--but only if converted to free audio format Ogg Vorbis first.  I converted the .m4a files with the help of a utility inappropriately named the "Free Convert M4A to MP3 AMR OGG ACC Converter"; it stubbornly truncated its conversions until I agreed to pay $25.  Here in two parts is the recording: &lt;a href="http://harbormist.com/blogmedia/20110420_Stallman_Pt1_0hr_2min21sec.zip"&gt;Part 1&lt;/a&gt; (&amp;lt; 3 minutes) and &lt;a href="http://harbormist.com/blogmedia/20110420_Stallman_Pt2_1hr_7min35sec.zip"&gt;Part 2&lt;/a&gt; (1 hr+).  These are .zip files--sorry to make you unzip them, but I don't think my hosting service can accomodate much realtime streaming.&lt;br /&gt;
&lt;br /&gt;
One of the more interesting parts came during the Question and Answers at the end, after the recording ended.  Stallman explained that, in the 1990's, his organization split into two parts: 1) Free Software Foundation (Stallman's first priority), and 2) the "Open Source" movement.  Stallman stated that Open Source is focused on finding the best ways to develop software as a group, whereas FSF remains focused on the ethical issues surrounding misuse of digital technology and that, while he does not disagree with Open Source aims, if he were to start advocating for Open Source purposes, the ethical issues would get lost in the morass of it all.  And so he kept his organization completely separate and finds it frustrating that people often confuse Open Source (a term he claims was coined at the time of the split) with Free Software Foundation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-4304006463284001560?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/4304006463284001560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=4304006463284001560" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/4304006463284001560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/4304006463284001560?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2011/04/richard-stallmans-speech-digital.html" title="Richard Stallman's speech &quot;A Digital Society&quot;, Apr 20, 2011" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkcNSHo9fCp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-2131798394247776271</id><published>2010-05-20T13:43:00.002-04:00</published><updated>2012-02-26T09:54:59.464-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:54:59.464-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="C# and .NET" /><title>The challenge of printing a .NET textbox</title><content type="html">On Yahoo Answers, someone asked how to print the content of a RichTextBox control in .NET.  I did finally manage to print a (simpler) TextBox control in .NET, and that was difficult enough.  I am documenting that here for myself or anyone else&lt;br /&gt;
facing this challenge.  &lt;br /&gt;
&lt;br /&gt;
First, a little rant. Before the .NET framework was released (~2000), Microsoft provided a handy .print method on the RichTextBox and TextBox controls, and all a programmer needed to do was call it.  But in Microsoft's almighty wisdom (and trying to be just like Java), the simple and highly useful .print method was removed in .NET, and now you have to do all the  following steps successfully.  And note, it's just as difficult in Java--what were the language developers thinking?  I imagine they were thinking to provide maximum flexibility, but why not provide a quick-and-dirty out for the rest of us?&lt;br /&gt;
&lt;br /&gt;
In the example below, my form (called JobForm) is printing the contents of a TextBox control (called textBoxRight).&lt;br /&gt;
&lt;br /&gt;
STEP 1: DECLARE VARIABLES&lt;br /&gt;
&lt;br /&gt;
You need a bunch of special fields in your form code to keep track of printing information.  To get started, just use this:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;#region printing declarations

        private Font midlistRegular = new Font(
            "San Serif",
           (float)7.8,
           FontStyle.Regular,
           GraphicsUnit.Point);

        private Font midlistRegular1 = new Font(
            "San Serif",
           (float)7.6,
           FontStyle.Bold,
           GraphicsUnit.Point);

        private int printMargin = 1;

        private int lastPosition = 0;

        private int lastIndex = 0;

        /// &lt;summary&gt;
        /// Set in Paint (of form) for use when printing
        /// &lt;/summary&gt;
        private float screenResolutionX = 0;

        #endregion printing declarations
&lt;/pre&gt;
&lt;br /&gt;
STEP 2: INSTANTIATE A PRINTDOCUMENT OBJECT AND CREATE ITS EVENT CODE&lt;br /&gt;
&lt;br /&gt;
You need a special object that raises an event each time one page has been printed and causes the next page to be printed.  It is a non-visible control and is called "PrintDocument" (in library System.Drawing.Printing).  &lt;br /&gt;
&lt;br /&gt;
In the Windows Designer, drag a non-visible "PrintDocument" control onto your form (System.Drawing.Printing.PrintDocument).  It will be instantiated on your form as "printDocument1".  Double-click the PrintDocument control on the form to create the "PrintPage" event and give it the following code (using your TextBox name instead off "textBoxRight"):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
        {
            try
            {
                e.HasMorePages = this.PrintOnePage(
                    e.Graphics,
                    this.textBoxRight,
                    this.printDocument1,
                    this.screenResolutionX);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
&lt;/pre&gt;
&lt;br /&gt;
STEP 3:&lt;br /&gt;
&lt;br /&gt;
Now create the PrintOnePage() method needed by the above code.  Although the display truncates this code, if you copy it using Control-C, all the code will be grabbed.  Use the boilerplate code below unchanged (and I apologize that it's so ugly):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;/// &lt;summary&gt;
        /// Goes through each line of the text box and prints it
        /// &lt;/summary&gt;
        private bool PrintOnePage(Graphics g, 
                 TextBox txtSurface, PrintDocument printer, 
                 float screenResolution)
        {
            // Font textFont = txtSurface.Font;
            Font textFont = 
                   new Font("San serif", 
                            (float)10.0, FontStyle.Regular, 
                            GraphicsUnit.Point);

            // go line by line and draw each string
            int startIndex = this.lastIndex;
            int index = txtSurface.Text.IndexOf("\n", startIndex);

            int nextPosition = (int)this.lastPosition;
            // just use the default string format
            StringFormat sf = new StringFormat();

            // sf.FormatFlags = StringFormatFlags.NoClip | (~StringFormatFlags.NoWrap );
            // get the page height
            int lastPagePosition = (int)(((printer.DefaultPageSettings.PaperSize.Height / 100.0f) - 1.0f) * (float)screenResolution);
            // int resolution = printer.DefaultPageSettings.PrinterResolution.X;

            // use the screen resolution for measuring the page
            int resolution = (int)screenResolution;

            // calculate the maximum width in inches from the default paper size and the margin
            int maxwidth =
                (int)((printer.DefaultPageSettings.PaperSize.Width / 100.0f - this.printMargin * 2) * resolution);

            // get the margin in inches
            int printMarginInPixels = resolution * this.printMargin + 6;
            Rectangle rtLayout = new Rectangle(0, 0, 0, 0);
            int lineheight = 0;

            while (index != -1)
            {
                string nextLine = txtSurface.Text.Substring(startIndex, index - startIndex);
                lineheight = (int)(g.MeasureString(nextLine, textFont, maxwidth, sf).Height);
                rtLayout = new Rectangle(printMarginInPixels, nextPosition, maxwidth, lineheight);
                g.DrawString(nextLine, textFont, Brushes.Black, rtLayout, sf);

                nextPosition += (int)(lineheight + 3);
                startIndex = index + 1;
                index = txtSurface.Text.IndexOf("\n", startIndex);
                if (nextPosition &amp;gt; lastPagePosition)
                {
                    this.lastPosition = (int)screenResolution;
                    this.lastIndex = index;
                    return true; // reached end of page
                }
            }

            // draw the last line
            string lastLine = txtSurface.Text.Substring(startIndex);
            lineheight = (int)(g.MeasureString(lastLine, textFont, maxwidth, sf).Height);
            rtLayout = new Rectangle(printMarginInPixels, nextPosition, maxwidth, lineheight);
            g.DrawString(lastLine, textFont, Brushes.Black, rtLayout, sf);

            this.lastPosition = (int)screenResolution;
            this.lastIndex = 0;
            return false;
        }
&lt;/pre&gt;
&lt;br /&gt;
STEP 4: ADD CODE TO YOUR FORM'S PAINT EVENT&lt;br /&gt;
&lt;br /&gt;
In Windows Designer, open your form in graphical view mode.  Open the form's Properties Window and click the lightning bolt to see events.  Double-click on the form's Paint event to create it, and paste the boiler-plate code from my Paint event below into your form's paint event (your event will have a different name, using your form's name, than mine does below):&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;private void JobForm_Paint(object sender,
                            System.Windows.Forms.PaintEventArgs e)
        {
            // save the form height here
            this.screenResolutionX = e.Graphics.DpiX;

            // set the last position of the text box
            this.lastPosition = (int)this.screenResolutionX;
        }
&lt;/pre&gt;
&lt;br /&gt;
STEP 5: ACTUALLY PRINT THE TEXTBOX&lt;br /&gt;
&lt;br /&gt;
To actually print the contents of the TextBox, you'll need code like this in a print menu or button event:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;PrintDialog printDialog1 = null;
 printDialog1 = new PrintDialog();
        if (printDialog1.ShowDialog() == DialogResult.OK)
        {
             this.printDocument1.PrinterSettings = printDialog1.PrinterSettings;
             this.printDocument1.Print();
        }
&lt;/pre&gt;
&lt;br /&gt;
I haven't paid huge attention to all the above code, once I got it working.  I snarfed much of it from various sources on the web (thank you, bloggers!).  It could be enhanced or cleaned up a lot.  Maybe this will help another programmer get it done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-2131798394247776271?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/2131798394247776271/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=2131798394247776271" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/2131798394247776271?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/2131798394247776271?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2010/05/challenge-of-printing-net-textbox.html" title="The challenge of printing a .NET textbox" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkYCQH0yeip7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-3221319288453568258</id><published>2010-03-04T19:24:00.003-05:00</published><updated>2012-02-26T09:56:01.392-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:56:01.392-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Web development" /><title>Wrestling to sort the ASP.NET GridView</title><content type="html">It's supposed to be easy, and practically codeless to use, and it is--sometimes.  When a GridView is to be populated with the same dataset every time the page loads.  But I had a drop-down list where a condition had to be selected, and based on &lt;i&gt;that&lt;/i&gt;, the grid then had to be populated.  I made it to the point where I got the dropdown selecting, and the grid populating, but there were 2 problems: paging didn't work, and sorting didn't work.  I decided to turn paging off, so sorting was my last remaining issue. &lt;br /&gt;
&lt;br /&gt;
Umpteen useless web articles later, I resorted to the paper books stashed on my shelf at home.  First stop was Murach's ASP.NET 2.0, which is alleged to be so good.  But it held no love for me.  Second stop was Dino Esposito's "Programming Microsoft ASP.NET 2.0: Core Reference"--and finally, I got the help I needed. &lt;br /&gt;
&lt;br /&gt;
I'm blogging about this because a good book deserves real credit.  Many mysteries were unraveled by the Esposito book, including that I needed to explicitly re-populate the GridView when its "Sorting" event fired.  Esposito's directions were extremely explicit: use the "Sorting" event's GridViewArgEvents ("e" parameter) to find out the sort key, and write a special stored procedure that uses the sort key to ORDER the data differently.  These last bits of information were the treasure that finally allowed me to get sorting to work. &lt;br /&gt;
&lt;br /&gt;
I'm posting a copy of the rather odd-looking stored procedure that I ended up using below for your edification.  The "@order_by" parameter names the column on which to sort, and the odd way of constructing the query from strings allows brackets to fit around any strange or keyword column names:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;CREATE PROCEDURE [dbo].[lsp_NRSA_find_counts_and_person_by_naded] 
@naded_id int,
@order_by nvarchar(12)
AS

BEGIN

 IF @order_by = ''
 BEGIN
  SET @order_by = 'slide'
 END
 
 EXEC ('SELECT * ' + 
 'FROM vw_NRSA_cemaats_by_count_and_person ' +
 'WHERE naded = ' + @naded_id + 
 ' ORDER BY [' + @order_by + ']')

END
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-3221319288453568258?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/3221319288453568258/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=3221319288453568258" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3221319288453568258?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3221319288453568258?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2010/03/wrestling-with-aspnet-gridview.html" title="Wrestling to sort the ASP.NET GridView" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUHQHw-cSp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-790161780207413729</id><published>2009-12-13T09:07:00.004-05:00</published><updated>2012-02-26T09:57:11.259-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:57:11.259-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows on Mac" /><category scheme="http://www.blogger.com/atom/ns#" term="Dual-boot" /><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X" /><title>Boot Camp Revisited</title><content type="html">I've been using Boot Camp to run Windows XP on my Macbook since Mac OS X version 4 ("Tiger").  The first version drivers were crap and it was difficult to get XP installed correctly.  But once XP was installed, I was able to run my development tools on it as well as on any native Intel PC.&lt;br /&gt;
&lt;br /&gt;
That all improved quite a bit in version 10.5 ("Leopard").  I was able to update the drivers on my XP installation, and that was a big improvement.&lt;br /&gt;
&lt;br /&gt;
Things went along well for about 2 years.  Then, the machine started exhibiting problems.  The fan would suddenly come on, and then XP would reboot itself without asking me--just once each day after I turned the machine on.  I feared hardware--was it the RAM I had added, perhaps?  But finding no cause, I just lived with the issue until just after the 3-year warranty ran out on the machine.&lt;br /&gt;
&lt;br /&gt;
As soon as the warranty expired, XP crashed and I could no longer boot into it.  And from Mac OS X, I was unable to use boot camp to remove the XP partition to start over.  During a work crisis, needing my XP machine, I had to buy a new Windows laptop and set the MacBook aside for the time being.&lt;br /&gt;
&lt;br /&gt;
A few weeks later, with work settling down, I went back to the Macbook to figure out how to make it run XP again.  I upgraded to the latest Mac OS X ("Snow Leopard") but boot camp still refused to run. So I reinstalled the OS from scratch, but apparently I was still left with the original partitions.  Mac OS X did not provide me a way to blow away and recreate the partitions during install.  I was feeling seriously offended at this point.  Was my investment in a dual-boot machine to be for nothing?&lt;br /&gt;
&lt;br /&gt;
After much reading of forum posts, it seemed likely that a large file had located itself somewhere in the middle or near the end of the drive, and Mac OS X could not defragment the partitions, or even delete them.  Eventually, I muddled through. I bought an external disk, managed to copy Mac OS X onto it and make it bootable.  Running from the USB disk, I was then able to use a disk utility to blow away and recreate the partition for Mac OS X on the main drive.  Then I copied the Mac OS back onto the main drive.  All this was facilitated by a great free Mac utility called SuperDuper, which I do very much appreciate.  Having gone through these contortions, I was at last able to reinstall Windows XP.  It all took staggering amounts of time, during which I considered just junking the Macbook.&lt;br /&gt;
&lt;br /&gt;
For those who claim that Mac's are so superior to Windows, I post this.  I can't see a speck of difference in the hassle factor of either operating system; sooner or later, arcane knowledge and extreme patience is required.  How do non-geeks ever cope?  &lt;br /&gt;
&lt;br /&gt;
The good thing about having both OS's around is competition--the two companies do push each other to do better things.  In the latest version of Mac OS, for example, networking is a breeze and I can read my Windows drives and the printer just installed without trauma.  Yay!  Why couldn't I have had that 3 years ago, Apple?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-790161780207413729?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/790161780207413729/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=790161780207413729" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/790161780207413729?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/790161780207413729?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2009/12/boot-camp-revisited.html" title="Boot Camp Revisited" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUBRH05cSp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-5749611036527050246</id><published>2009-11-10T14:20:00.007-05:00</published><updated>2012-02-26T09:57:35.329-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:57:35.329-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Windows" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>Sql Server Management Studio 2008 logon persistence problem</title><content type="html">I very often open SQL Management Studio 2008 for the same server.  Problem is, the very first time I accessed this server, I did so using a different user name and password.  Forever after henceforth, SQL Management Studio refused to remove this old server entry from my dropdown list in the "Connect to Server" popup window.&lt;br /&gt;
&lt;br /&gt;
This made it necessary to click to change the user and enter a new password about 80 times per day--all because this premium, allegedly very smart sophisticated software has decided never to forget a former entry--even though I have deleted the Registered Server and recreated and so forth.  I'm frankly angry about this nuisance, which wouldn't matter if I didn't have to open and close the tool so many times per day.  &lt;br /&gt;
&lt;br /&gt;
If anyone has any concrete suggestion on how I can defeat this thing, please let me know.  I see from the internet that I am not the only one having this frustration, but I have yet to find any blog entry or suggestion to alleviate the problem.&lt;br /&gt;
&lt;br /&gt;
UPDATED with an answer in Aug. 2010:&lt;br /&gt;
&lt;br /&gt;
For Sql Server Management Studio 2008 on Windows XP, to restart all your logins, delete the file: &lt;br /&gt;
&lt;br /&gt;
C:\Documents and Settings\%username%\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For Sql Server Management Studio 2008 on Windows 7, to restart all your logins, delete the file:&lt;br /&gt;
&lt;br /&gt;
C:\Users\%username%\AppData\Roaming\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-5749611036527050246?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/5749611036527050246/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=5749611036527050246" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/5749611036527050246?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/5749611036527050246?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2009/11/sql-management-studio-abomination.html" title="Sql Server Management Studio 2008 logon persistence problem" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkQAQ3s6eip7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-1138216363867292558</id><published>2009-09-28T10:14:00.005-04:00</published><updated>2012-02-26T09:59:02.512-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:59:02.512-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><category scheme="http://www.blogger.com/atom/ns#" term="SQL Server" /><title>Delete a maintenance plan after changing SQL Server 2008 name</title><content type="html">&lt;br /&gt;
I've seen a few posts on how to delete an older maintenance plan after you've changed the computer name for a default installation of SQL Server 2008, but none of the posts fully solved the problem.  Below is what I had to do--with the caveat that you have to find your own id's:&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;USE msdb

DELETE 
FROM dbo.sysmaintplan_log 
WHERE subplan_id = '36F8247F-6A1E-427A-AB7D-2F6D972E32C1'

DELETE 
FROM dbo.sysmaintplan_subplans 
WHERE subplan_id = '36F8247F-6A1E-427A-AB7D-2F6D972E32C1'

DELETE 
FROM dbo.sysjobs 
WHERE job_id = '3757937A-02DB-47A6-90DA-A64AE84D6E98'

DELETE 
FROM dbo.sysmaintplan_plans 
WHERE id = 'C7C6EFAA-DA4D-4097-9F9F-FC3A7C0AF2DB'

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-1138216363867292558?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/1138216363867292558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=1138216363867292558" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1138216363867292558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1138216363867292558?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2009/09/delete-maintenance-plan-after-changing.html" title="Delete a maintenance plan after changing SQL Server 2008 name" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkQGSH48eyp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-3129599139466602708</id><published>2009-05-03T19:08:00.013-04:00</published><updated>2012-02-26T09:58:49.073-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:58:49.073-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft Access" /><title>C# code to get schema of an Access table</title><content type="html">I just wanted to dump the schema of a table in Microsoft Access.  There is a lot of code on the web which purports to do this, but most of it didn't actually work, and most of it was not in C# (my current preferred language).  So I am posting this here for anyone that needs it.  Just change the path to the database file in the first line of code, and the name of the table ("taxa" in my example) in the second line of code.  This program dumps the table schema to a file created by the LogFile object (also attached below) located in the application folder.  You'll need to add "&lt;b&gt;using System.Data.OleDb;&lt;/b&gt;" to the top of the file.  Or, just download the code &lt;a href="http://harbormist.com/pat/code/access_schema_code.zip"&gt;here&lt;/a&gt;.  The code:&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;
OleDbConnection conn =
 new OleDbConnection(
    "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
    "C:\\phycoaide\\phycoaide.mdb;Persist Security Info=False;");

// retrieving schema for a single table
OleDbCommand cmd = new OleDbCommand("taxa", conn);
cmd.CommandType = CommandType.TableDirect;
conn.Open();
OleDbDataReader reader =
 cmd.ExecuteReader(CommandBehavior.SchemaOnly);
DataTable schemaTable = reader.GetSchemaTable();
reader.Close();
conn.Close();

LogFile.WriteLine(" ");
foreach (DataRow r in schemaTable.Rows)
{
 LogFile.WriteLine(" ");
 foreach (DataColumn c in schemaTable.Columns)
 {
    LogFile.WriteLine(c.ColumnName + ": " + r[c.ColumnName]);
 }
}
MessageBox.Show("done");&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;
&lt;b&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
The LogFile class creates a file in the application folder from which your program runs:&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;pre&gt;&lt;b&gt;&lt;span style="font-size: x-small;"&gt;
// &lt;copyright company="Harbor Mist, LLC" file="LogFile.cs"&gt;
// No copyright; free for reuse by anyone
// &lt;/copyright&gt;
// &lt;author&gt;Pat G. Palmer&lt;/author&gt;
// &lt;email&gt;ppalmer AT harbormist.com&lt;/email&gt;
// &lt;date&gt;2009-05-04&lt;/date&gt;
// &lt;summary&gt;Opens a single-threaded log file to trace execution&lt;/summary&gt;
namespace Ansp
{
    using System;
    using System.IO;            // file readers and writers
    using System.Windows.Forms; // Application object

    /// &lt;summary&gt;
    /// Singleton that appends log entries to a text file
    /// in the application folder.  If the file grows
    /// to be too large, it deletes itself and starts over.
    /// The file is kept open until the application ends
    /// and implements the "dispose" pattern in case things
    /// do not end gracefully.
    /// &lt;/summary&gt;
    public class LogFile : IDisposable
    {
        private static int maxsize = 470000;
        private static string fileSuffix = "_log.txt";
        private static string fileSpecification;
        private static StreamWriter filewriter;
        private static LogFile instance;

        private LogFile()
        {
        }

        ~LogFile()
        {
            this.Dispose(false);
        }

        public static void InitLogFile()
        {
            if (instance == null)
            {
                instance = new LogFile();
            }

            string stringMe = "InitLogFile: ";
            try
            {
                if (Application.ProductName.Length == 0)
                {
                    fileSpecification = Application.StartupPath + "\\" +
                       "Test" + fileSuffix;
                }
                else
                {
                    fileSpecification = Application.StartupPath + "\\" +
                       Application.ProductName + fileSuffix;
                }

                // restart file if too big
                if (File.Exists(fileSpecification))
                {
                    FileInfo myFileInfo = new FileInfo(fileSpecification);
                    if (myFileInfo.Length &amp;gt; maxsize)
                    {
                        File.Delete(fileSpecification);
                    }

                    myFileInfo = null;
                }

                // restart file with appending
                filewriter = new StreamWriter(
                   fileSpecification, true, System.Text.Encoding.UTF8);

                // start log with standard info
                WriteLine("\r\n---------------------------------------------");
                string tempString = stringMe +
                    Application.ProductName + " " +
                    Application.ProductVersion +
                    "log opened at " + 
                    DateTime.Now;
                WriteLine(tempString);
                WriteLine(stringMe + "username=" + SystemInformation.UserName);
                WriteLine(stringMe + Application.StartupPath);
            }
            catch
            {
            }
        }

        public static void WriteLine(string myInputLine)
        {
            try
            {
                if (instance == null)
                {
                   InitLogFile(); // first time only
                }
                if (myInputLine.Length != 0)
                {
                   filewriter.WriteLine(myInputLine);
                   filewriter.Flush(); // update file
                }
            }
            catch
            {
            }
        }

        public static void Close()
        {
            instance.Dispose();
        }

        /// &lt;summary&gt;
        /// Implement IDisposable.
        /// Do not make this method virtual.
        /// A derived class must not override this method.
        /// &lt;/summary&gt;
        public void Dispose()
        {
            this.Dispose(true);
            //// Now, we call GC.SupressFinalize to take this object
            //// off the finalization queue and prevent finalization
            //// code for this object from executing a second time.
            GC.SuppressFinalize(this);
        }

        private void Dispose(bool disposing)
        {
            if (disposing)
            {
                // no managed resources to clean up
            }
            if (instance != null)
            {
                if (filewriter != null)
                {
                    try
                    {
                        filewriter.Flush();
                        filewriter.Close();
                    }
                    catch
                    {
                    }

                    filewriter = null;
                } // end if filewriter not null
            } // end if instance not null
        }

    } // end class LogFile()
} // end namespace&lt;/span&gt;&lt;/b&gt;&lt;/pre&gt;
&lt;b&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-3129599139466602708?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/3129599139466602708/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=3129599139466602708" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3129599139466602708?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3129599139466602708?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2009/05/c-code-to-get-schema-of-access-table.html" title="C# code to get schema of an Access table" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;AkQMQ3k5fCp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-1308764549808723679</id><published>2008-06-01T19:41:00.004-04:00</published><updated>2012-02-26T09:59:42.724-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T09:59:42.724-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><title>using Ruby, Tk and Eclipse</title><content type="html">It took me a long time to learn howto do this.  I found that on Windows XP, I had to use exactly these versions and install them in this order (rebooting in between):&lt;br /&gt;
&lt;br /&gt;
* Ruby one-click installer v 1.8.6&lt;br /&gt;
* ActiveState Tcl v 8.4.x (NOTE: 8.6 did NOT WORK)&lt;br /&gt;
&lt;br /&gt;
After this, the machine path was set to find both programs, AND I was able to configure Eclipse to compile using this version of Ruby, so I can now use Eclipse as the IDE.  The trick is, when in the Ruby perspective, first create a Ruby project, and at that point, Eclipse gives you a chance to select a different Ruby virtual machine.  Make sure then that you choose the Ruby.exe file installed by the Ruby one-click installer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-1308764549808723679?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/1308764549808723679/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=1308764549808723679" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1308764549808723679?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1308764549808723679?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2008/06/using-ruby-tk-and-eclipse.html" title="using Ruby, Tk and Eclipse" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;AkMEQX48cCp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-489768528225747348</id><published>2008-05-11T11:23:00.007-04:00</published><updated>2012-02-26T10:00:00.078-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T10:00:00.078-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><title>Ruby and Tk on Windows may as well be a fantasy</title><content type="html">Has anyone every actually tried to use tk to build a GUI with Ruby &lt;i&gt;on&lt;br /&gt;Windows&lt;/i&gt;?  Yes, Ruby runs on Windows.  Yes, Tk runs on Windows.  But the two do not communicate. Online instructions for binding Tk and Ruby are primarily for Linux, and ominously, use of Tk seems to require that one build one's own Ruby source from scratch in order to link Ruby with Tk.&lt;br /&gt;
&lt;br /&gt;
If so, that is very discouraging and I probably won't consider it&lt;br /&gt;
worth doing.  Furthermore, I would say it is false advertising the way&lt;br /&gt;
so many web sites glibly claim "and it runs on Windows too".&lt;br /&gt;
&lt;br /&gt;
There are numerous discussion threads on the web where people have&lt;br /&gt;
sought help with this tk-Ruby linkage problem.  These discussions threads seem to degrade shortly into hostility or contempt from Linux zealots towards the asking party, who continues to claim "but it doesn't work".  I did finally find &lt;a href="http://www.ruby-forum.com/topic/148416"&gt;one posting&lt;/a&gt; claiming to achieve a solution.  That method would require installation of multiple build tools including a C++ compiler!  Not only would it take me at least two days to make it work, but also there is little hope of getting lab administrators where I am teaching to install something that burdensome.&lt;br /&gt;
&lt;br /&gt;
Please tell me that Tk and Ruby on Windows is not an over-inflated pipe-dream.  I hope to hear otherwise, but until I do so, Ruby--and more importantly, the much touted &lt;i&gt;supportive Ruby community&lt;/i&gt;--has fallen somewhat in my estimation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-489768528225747348?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/489768528225747348/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=489768528225747348" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/489768528225747348?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/489768528225747348?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2008/05/ruby-and-tk-on-windows-may-be-fantasy.html" title="Ruby and Tk on Windows may as well be a fantasy" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkMGQXk-cSp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-1544833455535046592</id><published>2008-02-16T11:58:00.003-05:00</published><updated>2012-02-26T10:00:20.759-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T10:00:20.759-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><category scheme="http://www.blogger.com/atom/ns#" term="Mac OS X" /><title>Lowcost MacBook memory upgrades</title><content type="html">Recently a friend advised me that she had upgraded her MacBook memory at very low cost by contacting the memory manufacturer directly.  So I gave it a try.  For less than $70, I was able (in one week) to upgrade my first-gen MacBook's RAM from 512K to 2Gb.  The &lt;a href="http://crucial.com/"&gt;http://crucial.com/&lt;/a&gt; website will scan your system for you and identify the correct memory.  Hard to believe, but apple.com would have sold me the same memory for $300.&lt;br /&gt;
&lt;br /&gt;
I had to install the memory myself.  A quick Google brings up several how-to sites.  It worked the first time, but it did help that I knew about how much pressure to apply pushing the chips in (quite a bit, actually).  Newbies might not press hard enough, or might press too hard and break something.  Be careful!&lt;br /&gt;
&lt;br /&gt;
One important warning, though; if you're MacBook is under warranty, be sure and retain your old memory devices.  You'll need to reinstall them if you have to get the unit serviced (because otherwise, so they say, the warranty might not be valid).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-1544833455535046592?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://crucial.com/" title="Lowcost MacBook memory upgrades" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/1544833455535046592/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=1544833455535046592" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1544833455535046592?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/1544833455535046592?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2008/02/lowcost-macbook-memory-upgrades.html" title="Lowcost MacBook memory upgrades" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkMHSHozfSp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-5372793367848333343</id><published>2007-12-27T15:34:00.002-05:00</published><updated>2012-02-26T10:00:39.485-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T10:00:39.485-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C# and .NET" /><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio" /><title>Suppressing VS.NET  Compiler Warnings (2005, 2008)</title><content type="html">"1591" was the magic string that I needed, and this is the sorry tale of how to find that out.&lt;br /&gt;
&lt;br /&gt;
As a rule, I don't like suppressing compiler warnings, but there is a time for everything.  My time came when I inherited a huge mass of ill-behaving C# code and began adding XML comments.  I was immediately overwhelmed by hundreds of warnings that said "Missing XML comment for publicly visible type".  I wanted to compile the comments that I had added without being nagged by the compiler for not having added the remaining 300 possible XML comments as well.&lt;br /&gt;
&lt;br /&gt;
I knew that Visual Studio 2005 would let me suppress specific warnings in the project build properties.  However, I didn't know the warning number that I needed to supply.  Microsoft, in their great goodness, has suppressed showing of warning numbers--they only show the text.  A few googles later, I knew that it was either 1591 or CS1591, but no one told me anywhere, in general, now to find the full list of warning numbers.  I've wanted this list many a time in the past, so I set out to find out, once and for all.&lt;br /&gt;
&lt;br /&gt;
Eventually, I found that I needed to start at the &lt;a href="http://msdn2.microsoft.com/en-us/library/618ayhy6%28VS.80%29.aspx"&gt;top-level C# Reference page&lt;/a&gt; in MSDN2 (for the appropriate version of VS.NET), then search on "compiler warning " + "warning text".  So searching on "compiler warning missing XML comment" got me the precious warning number that I needed, which is CS1591.  But then I had to psychically understand, of course, that the CS must be left off, and only the 1591 entered.&lt;br /&gt;
&lt;br /&gt;
See my glorious build screen which finally suppressed the evil hundreds of unwanted warnings:&lt;br /&gt;
&lt;br /&gt;
&lt;img src="http://www.harbormist.com/pat/images_blog/warnings.gif" /&gt;&lt;br /&gt;
&lt;br /&gt;
UPDATE in Oct 2008: Now that I am using Visual Studio 2008, I have learned that I can right-click over a warning in the Error List pane, and it will pop up documentation about the warning that includes its error level and number, and from that, I can derive the 4 digits to place in the suppress box of the project Build properties.  It is not necessary to search on the Microsoft website.  I don't know if this feature was present in Visual Studio 2005 (and I just didn't know it), or not.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-5372793367848333343?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/5372793367848333343/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=5372793367848333343" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/5372793367848333343?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/5372793367848333343?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2007/12/suppressing-vsnet-2005-compiler.html" title="Suppressing VS.NET  Compiler Warnings (2005, 2008)" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;CkIEQH8yfyp7ImA9WxRQFU8.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-9049530329114344824</id><published>2007-09-28T16:06:00.001-04:00</published><updated>2008-10-08T22:48:21.197-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-08T22:48:21.197-04:00</app:edited><title>You go, Citizendium</title><content type="html">I have a love-hate relationship with Wikipedia, which has made huge amounts of information freely available, but whose contents cannot be controlled for quality. Thus, I became an author (and then an editor) for &lt;a href="http://www.citizendium.org/"&gt;Citizendium&lt;/a&gt;, a relatively new, expert-led online encyclopedia project. It was founded by Larry Sanger, a co-founder of Wikipedia, and is intended to be a more accurate and credible, publicly owned and authored encyclopedia.&lt;br /&gt;&lt;br /&gt;For a wiki to be successful, a critical mass of participants is needed. Your expertise is urgently needed to make Citizendium a success. Please consider joining Citizendium soon in the Computers Workgroup.  In Citizendium, people author using their real identities, and expert editors provide gentle oversight.  To join &lt;img src="http://en.citizendium.org/images/6/63/Citizendium_80x15.png" alt="Citizendium"&gt;, simply &lt;a href="http://www.citizendium.org/cfa.html"&gt;apply here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If there are going to be large quantities of information about computers available online, let's make sure it's of high quality.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-9049530329114344824?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://en.citizendium.org/" title="You go, Citizendium" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/9049530329114344824/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=9049530329114344824" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/9049530329114344824?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/9049530329114344824?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2007/09/you-go-citizendium.html" title="You go, Citizendium" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkMDQXsyeSp7ImA9WhVTEks.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-3041037419759476189</id><published>2007-07-21T11:53:00.000-04:00</published><updated>2012-02-26T10:01:10.591-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T10:01:10.591-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="System administration" /><title>Using Ruby's WSDL driver to call a Microsoft C# SOAP web service</title><content type="html">I've been learning Ruby and recently tried to call a Microsoft C# SOAP web service in Ruby.  First thing I needed to do was upgrade Instant Rails to use the latest soap4r library v1.5.7 (it came with v1.5.5).  How to do that is shown &lt;a href="http://dev.ctor.org/soap4r#Gem"&gt;here&lt;/a&gt; and further explained &lt;a href="http://alliance.seas.upenn.edu/%7Ecis700/wiki/index.php?n=Ruby.UpdateSOAP"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
After that, it took a while to learn how to 1) suppress warnings that turned out to be non-critical, and 2) figure out the syntax needed to send parameters. The soap4r library's documentation page, although posted all over the internet, is essentially empty and useless.  To save others some trouble, here's the code:&lt;br /&gt;
&lt;br /&gt;
Web service:&lt;a href="http://harbormist.com/rss_service/RSSService.asmx"&gt;RSS Service&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Method without parameter:&lt;a href="http://harbormist.com/cis700_07/code/GetAllSiteNames.txt"&gt;getAllSiteNames()&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Method with one parameter:&lt;a href="http://harbormist.com/cis700_07/code/GetURL.txt"&gt;getURL(siteName)&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-3041037419759476189?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://harbormist.com/cis700_07/code/GetURL.txt" title="Using Ruby's WSDL driver to call a Microsoft C# SOAP web service" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/3041037419759476189/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=3041037419759476189" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3041037419759476189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/3041037419759476189?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2007/07/using-rubys-wsdl-driver-to-call.html" title="Using Ruby's WSDL driver to call a Microsoft C# SOAP web service" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;Ak8MQX4-eCp7ImA9WBBXEUw.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-116043245686217490</id><published>2006-10-09T18:13:00.000-04:00</published><updated>2006-11-21T09:21:20.050-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-11-21T09:21:20.050-05:00</app:edited><title>Reasonably priced heat reduction for MacBook laptop</title><content type="html">&lt;img src="http://harbormist.com/pat/images_blog/sinkmat.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;I am using a low-cost, inverted &lt;a href="http://www.cooking.com/products/shprodde.asp?SKU=689863"&gt;sink cushion mat&lt;/a&gt; (manufactured by InterDesign), pictured above, underneath my MacBook.  It has good traction, is light-weight, provides plenty of air flow and heat insulation, and even looks nice (can barely be seen).  It's a decent alternative to spending ~$30 for some kind of industrial laptop cooling platform.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-116043245686217490?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/116043245686217490/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=116043245686217490" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/116043245686217490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/116043245686217490?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2006/10/reasonably-priced-heat-reduction-for.html" title="Reasonably priced heat reduction for MacBook laptop" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0UHQHc4eip7ImA9WBFVF0s.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-115938492737218039</id><published>2006-09-27T15:15:00.000-04:00</published><updated>2007-04-16T20:20:31.932-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-04-16T20:20:31.932-04:00</app:edited><title>Win XP Pro on MacBook at last!</title><content type="html">&lt;a href="http://www.markstivers.com/cartoons/Cartoons%202005/Stivers-6-14-05-Intel-Mac.gif"&gt;&lt;br /&gt;&lt;img src="http://www.markstivers.com/cartoons/Cartoons%202005/Stivers-6-14-05-Intel-Mac.gif"  width="250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After a week of failed install efforts, the sixth attempt finally seems to have succeeded.  This time, I went all the way back to Mac OS X, let it zap the old partition so I could start from scratch (using BootCamp 1.1.1 Beta).  After installing XP, I ran into a new problem--when trying to install the web server (IIS 6.0), XP said it could not copy files from the DVD.  Given the previous problems I'd had getting XP to run on the MacBook, I feared it meant another crash was coming, but after a long search, I am happy to report that it was Microsoft's problem, and they have a fix procedure that worked for me.  Microsoft's Knowledge Base contains &lt;a href="http://support.microsoft.com/kb/555268/en-us"&gt;this article (Knowledge Base #555268)&lt;/a&gt;, and the fix described there worked!&lt;br /&gt;&lt;br /&gt;So, for the first time, the MacBook is fully loaded with my development tools on Windows XP Pro SP2, and I can easily boot between Mac OS X and Windows XP.  Hallelujah.  If it will just be stable, now, I'll have finally accomplished two goals at once--getting myself a faster (Windows) laptop, and getting myself a Mac OS X testbed for Java applications, plus learning more about Mac OS X which is pretty neat in many ways.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-115938492737218039?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://harborsparrow.blogspot.com/2006/09/more-macbook-and-bootcamp-woes.html#links" title="Win XP Pro on MacBook at last!" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/115938492737218039/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=115938492737218039" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115938492737218039?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115938492737218039?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2006/09/win-xp-pro-on-macbook-at-last.html" title="Win XP Pro on MacBook at last!" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C0QMR3s_fip7ImA9WBBSGEs.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-115910965414343034</id><published>2006-09-24T10:45:00.000-04:00</published><updated>2006-10-26T07:16:26.546-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-10-26T07:16:26.546-04:00</app:edited><title>More MacBook and BootCamp Woes</title><content type="html">OK...I've made &lt;i&gt;some&lt;/i&gt; progress in understanding the problems in getting the MacBook to run Windows in a stable manner.  It has to do with accidentally or deliberately booting with a CD still in the drive.  Windows hangs and then crashes unrecoverably, sometimes, when this happens.  This does &lt;i&gt;not&lt;/i&gt; go down this way on regular PC's, and thus I think it has something to do with the buggy Mac drivers, probably the ones not correctly certified for Windows (apparently about 4 or 5 of them).&lt;br /&gt;&lt;br /&gt;Case in point...this time, I restarted Windows from scratch on a newly formatted NTFS partition, and everything was stable for about 8 hours.  I was loading up my development tools, rebooting often to make sure everything is still kosher, and using Restore Points as my safety net.  Then, while installing VS.NET 2005, I was told to reboot while the CD was still in.  What to do?  I knew the CD was potentially a problem, but I've installed VS.NET dozens of times on regular PC's, and I knew that VS.NET wasn't done yet and wanted to resume its install after the reboot--so I pressed Return--and it hung and crashed unrecoverably.  So badly, in fact, that it blew away my Restore Points.  So now I'm back in the OS blue screen trying to heal Windows XP so it will run again, and even if I do, heaven knows what state it will be in when it's done.&lt;br /&gt;&lt;br /&gt;In retrospect, I can see that many of my previous problems had to do with this.  The first time I used Boot Camp to install drivers, for example, I failed to eject the disk before rebooting (and yes, I know it tells you to, but I had just spent hours reading fine print--I saw my mistake immediately after hitting return, but there is no going back at that point--no eject button on the CD).  This is where not having Ctrl-Alt-Delete on the keyboard is fatal--when the reboot occurs, you can tell that something is hung, and on a normal PC, you'd just hit Ctrl-Alt-Delete and kill the hung process and get on with life.  But on the MacBook, you just have to sit there and agonize until it finally crashes or you get tired of waiting and force a shutdown, after which, your machine is, well, hosed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-115910965414343034?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://harborsparrow.blogspot.com/2006/09/macbook-and-bootcamp-111-beta.html#links" title="More MacBook and BootCamp Woes" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/115910965414343034/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=115910965414343034" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115910965414343034?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115910965414343034?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2006/09/more-macbook-and-bootcamp-woes.html" title="More MacBook and BootCamp Woes" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEAARng_eyp7ImA9WBNaFkQ.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-115902701009255845</id><published>2006-09-23T11:43:00.000-04:00</published><updated>2006-10-01T04:52:27.643-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-10-01T04:52:27.643-04:00</app:edited><title>MacBook and BootCamp 1.1.1 Beta</title><content type="html">&lt;img src="http://harbormist.com/pat/images_blog/macbook1.gif" height="209" width="350" /&gt;&lt;br /&gt;&lt;br /&gt;Above is a photo of my brand new MacBook.  It runs Mac OS X extremely well.   But in trying to run Windows XP Professional SP2.  I've seen lots of blue screens of death and suffered hangs and unwanted reboots while in Windows--all very uncharacteristic of the Windows XP Pro I know and love.  I believe I've been very careful to follow all the BootCamp instructions to the letter, but after two full days of trying to get the dual-boot working and stable, I'm feeling quite angry at the Apple engineers who so optimistically issued BootCamp.&lt;br /&gt;&lt;br /&gt;I'm using the latest BootCamp version 1.1.1 Beta, which apparently is newly posted this week. It's supposed to fix a lot of former problems. Well...I would hate to have seen the earlier versions if this is the best Apple can do.&lt;br /&gt;&lt;br /&gt;I've learned a way to force the last good configuration to roll back--it takes about 5 minutes to recover from a crash.  So I boot into Windows, change just one thing, and if that crashes, I reboot and use F8 to get into the XP recovery mode, boot into Safe Mode with Networking, and then rollback to the last restore point (requiring yet another reboot).&lt;br /&gt;&lt;br /&gt;Among the most annoying problems--and Apple should truly be embarrassed in my opinion--is that the video driver seems to be buggy.  I've turned off all acceleration--and I can only use 96 DPI fonts (120 crashes, go figure)--how could they mess up something as basic and essential as the built-in graphics support for Windows?&lt;br /&gt;&lt;br /&gt;I'll keep you posted as to whether I ever get the Windows install stable and fully updated and loaded with all the applications I need.  If I end up giving up, it's a $400 hit for me (that's what I spent buying the extra software for Windows) and I'm going to feel pretty cheated since there was every reason to believe, from the hype on the web, that dual-booting should work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-115902701009255845?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/115902701009255845/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=115902701009255845" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115902701009255845?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115902701009255845?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2006/09/macbook-and-bootcamp-111-beta.html" title="MacBook and BootCamp 1.1.1 Beta" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEQCRHs4fCp7ImA9WxVUFkg.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-115861865576947772</id><published>2006-09-18T18:23:00.001-04:00</published><updated>2009-03-21T12:19:25.534-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-21T12:19:25.534-04:00</app:edited><title>Ajax book reviews and code samples</title><content type="html">I had a really fun time the second half of the summer, co-teaching a special studies class with &lt;a href="http://www.cis.upenn.edu/%7Ematuszek/"&gt;Dave Matuszek&lt;/a&gt; on Ruby and Ajax.  The Wiki which the class used is broken already, but fortunately, I made a &lt;a href="http://alliance.seas.upenn.edu/~matuszek/wiki/wiki700/index.php?n=Main.ExamplePrograms"&gt;crappy copy&lt;/a&gt; of it.  Also, here are my &lt;a href="http://harbormist.com/cis700/books.html"&gt;Ajax book reviews&lt;/a&gt; and &lt;a href="http://harbormist.com/cis700/examples.html"&gt;Ajax code samples&lt;/a&gt; .&lt;br /&gt;&lt;br /&gt; I was pleased to learn some Ruby; the freedom from strong typing was welcome, and the deep integration of Rails with Ajax has some value.  I've even seen a job ad (from Vonage) requiring Ruby and Rails knowledge.  Some of the hype surrounding it, however, comes from the potential re-use whereby Rails pre-generates the framework of a website for you.  This is not a new idea, at least not in the Microsoft world, but apparently it is in the Java/Apache world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-115861865576947772?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="related" href="http://harbormist.com/cis700/books.html" title="Ajax book reviews and code samples" /><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/115861865576947772/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=115861865576947772" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115861865576947772?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/115861865576947772?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2006/09/ajax-book-reviews-and-code-samples.html" title="Ajax book reviews and code samples" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUMRH49fip7ImA9WBJQFUg.&quot;"><id>tag:blogger.com,1999:blog-17890083.post-114350684020815061</id><published>2006-03-27T19:44:00.000-05:00</published><updated>2006-03-28T10:04:45.066-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2006-03-28T10:04:45.066-05:00</app:edited><title>baby steps with Google maps apps</title><content type="html">I recently wrote my first Google map applications for learning purposes.   The most challenging part of these applications (warning--they are still very unpolished) was not in calling the Google Maps API, but rather, in figuring out how to call the free web geocoder service offered at &lt;a href="http://rpc.geocoder.us/"&gt; http://rpc.geocoder.us/&lt;/a&gt; to get an address converted to latitude and longitude.     I wanted to call it asynchronously (not knowing how long it might take to return a value) and this is a poorly documented matter that required quite of bit of exploration on the Microsoft website and various experiments.  Also, I had to read the fine print on the geocoder website until I located the correct WSDL file for C# which someone had kindly posted (&lt;a href="http://rpc.geocoder.us/dist/eg/clients/GeoCoder.wsdl"&gt;http://rpc.geocoder.us/dist/eg/clients/GeoCoder.wsdl &lt;/a&gt; in case  anyone cares).&lt;br /&gt;&lt;br /&gt;Not unlike a monkey typing at a keyboard, I finally got the geocoder call to work.  You can find all the code for the geocoder call via links on the site at &lt;a href="http://harbormist.com/maps/lookup/"&gt;http://harbormist.com/maps/lookup/&lt;/a&gt;.  The code is rough (I may update it shortly) but maybe posting it will help someone else get over the learning hump.&lt;br /&gt;&lt;br /&gt;My other little mashups are at &lt;a href="http://harbormist.com/maps/"&gt;http://harbormist.com/maps/&lt;/a&gt;, which deliniates PJ's Pancake House in Princeton, and &lt;a href="http://harbormist.com/maps/PrincetonCoffee/"&gt;http://harbormist.com/maps/PrincetonCoffee/&lt;/a&gt;, which shows three good coffee places right in Princeton.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17890083-114350684020815061?l=harborsparrow.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://harborsparrow.blogspot.com/feeds/114350684020815061/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=17890083&amp;postID=114350684020815061" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/114350684020815061?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/17890083/posts/default/114350684020815061?v=2" /><link rel="alternate" type="text/html" href="http://harborsparrow.blogspot.com/2006/03/baby-steps-with-google-maps-apps.html" title="baby steps with Google maps apps" /><author><name>Pat Palmer</name><uri>https://profiles.google.com/112647159313559436295</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-1SpHx0fi03g/AAAAAAAAAAI/AAAAAAAAARE/Ira4POSRmYo/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry></feed>

