<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8076318</id><updated>2011-07-31T02:31:33.277+01:00</updated><category term='xml'/><category term='clickonce CAS security AppDomain'/><category term='liberty'/><category term='windows media player'/><category term='tools'/><category term='SQL'/><category term='soap'/><category term='InvalidOperationException'/><category term='books'/><category term='asktom'/><category term='politics'/><category term='development'/><category term='programming'/><category term='dotnetnuke'/><category term='pseudoscience'/><category term='dataset'/><category term='.net interop com javascript eventsink'/><category term='Oracle'/><category term='config'/><category term='visual studio'/><category term='c#'/><category term='politics socialism'/><category term='dnn'/><category term='XmlSerializer'/><category term='custom'/><category term='windows forms'/><category term='.net regasm com'/><category term='xpath'/><category term='fisk'/><category term='.net'/><category term='soapextension'/><category term='phb'/><title type='text'>Random Jottings</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8076318.post-5189365575558054490</id><published>2009-07-17T08:36:00.001+01:00</published><updated>2009-07-17T08:36:15.096+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnetnuke'/><category scheme='http://www.blogger.com/atom/ns#' term='dnn'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>ORA-29701 when calling System.Data.OracleClient.OracleLob.Write</title><content type='html'>&lt;p&gt;I recently experienced some unhandled errors when attempting to install a custom module in a DotNetNuke site that had an Oracle back end.&amp;#160; The DB provider I was using was &lt;a href="http://www.acuitisolutions.com/Solutions/AcuitiDP.aspx"&gt;AcuitiDB&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;After some debugging, I was able to establish that the error was being raised from a call to AddDesktopModule, and the StackTrace showed that it was originating in a call to System.Data.OracleClient.OracleLob.Write:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[OracleException (0x80131938): ORA-29701: unable to connect to Cluster Manager&lt;/p&gt;    &lt;p&gt;]&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc) +304889&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; System.Data.OracleClient.OracleLob.Write(Byte[] buffer, Int32 offset, Int32 count) +587&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160; DotNetNuke.Data.OracleSqlHelper.CreateClobParameter(String ConnectionString, String ParameterName, String p) +229&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I contacted Sanjay Mehrota at &lt;a href="http://www.acuitisolutions.com"&gt;Acuiti&lt;/a&gt; and he was very helpful in assisting me to track down the cause of this.&amp;#160; Firstly, he suggested that I try some other areas of the site that created clobs, such as the text/html module.&amp;#160; This exhibited the same error.&amp;#160; He also provided some test code for creating a temporary clob which I added to a simple console app as a test harness.&amp;#160; This initially appeared to work correctly, but when I increased the size of the string being used to around 29,000 bytes, I got the same error.&amp;#160; It transpires that Temporary clobs are created in the temporary tablespace and that owing to some other testing work that was being performed on the DB, we had run out of tablespace.&amp;#160; I got the DBA to increase the size of the temporary tablespace and the problem disappeared.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-5189365575558054490?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/5189365575558054490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=5189365575558054490&amp;isPopup=true' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5189365575558054490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5189365575558054490'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2009/07/ora-29701-when-calling.html' title='ORA-29701 when calling System.Data.OracleClient.OracleLob.Write'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-7940548259410224716</id><published>2009-05-19T08:39:00.001+01:00</published><updated>2009-05-19T08:39:20.289+01:00</updated><title type='text'>Asp.Net Bundle from TypeMock</title><content type='html'>&lt;p&gt;&lt;a href="http://www.typemock.com/"&gt;Unit Testing&lt;/a&gt; ASP.NET? &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php"&gt;ASP.NET unit testing&lt;/a&gt; has never been this easy.    &lt;br /&gt;Typemock is launching a new product for ASP.NET developers – the &lt;strong&gt;ASP.NET Bundle&lt;/strong&gt; - and for the launch will be giving out &lt;strong&gt;FREE licenses&lt;/strong&gt; to bloggers and their readers.    &lt;br /&gt;The ASP.NET Bundle is the ultimate ASP.NET unit testing solution, and offers both &lt;a href="http://www.typemock.com/"&gt;Typemock Isolator&lt;/a&gt;, a &lt;a href="http://www.typemock.com/"&gt;unit test&lt;/a&gt; tool and &lt;a href="http://sm-art.biz/Ivonna.aspx"&gt;Ivonna&lt;/a&gt;, the Isolator add-on for &lt;a href="http://sm-art.biz/Ivonna.aspx"&gt;ASP.NET unit testing&lt;/a&gt;, for a bargain price.    &lt;br /&gt;Typemock Isolator is a leading &lt;a href="http://www.typemock.com/"&gt;.NET unit testing&lt;/a&gt; tool (C# and VB.NET) for many ‘hard to test’ technologies such as &lt;a href="http://typemock.com/sharepointpage.php"&gt;SharePoint&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://www.typemock.com/ASP.NET_unit_testing_page.php"&gt;MVC&lt;/a&gt;, &lt;a href="http://www.typemock.com/wcfpage.php"&gt;WCF&lt;/a&gt;, WPF, &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php"&gt;Silverlight&lt;/a&gt; and more. Note that for &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php"&gt;unit testing Silverlight&lt;/a&gt; there is an open source Isolator add-on called &lt;a href="http://www.typemock.com/Silverlight_unit_testing_page.php"&gt;SilverUnit&lt;/a&gt;.    &lt;br /&gt;The first 60 bloggers who will blog this text in their blog and &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html"&gt;tell us about it&lt;/a&gt;, will get a Free Isolator ASP.NET Bundle license (Typemock Isolator + Ivonna). If you post this in an ASP.NET &lt;strong&gt;dedicated&lt;/strong&gt; blog, you'll get a license automatically (even if more than 60 submit) during the first week of this announcement.    &lt;br /&gt;Also 8 bloggers will get an &lt;strong&gt;additional 2 licenses&lt;/strong&gt; (each) to give away to their readers / friends.    &lt;br /&gt;Go ahead, click the following link for &lt;a href="http://blog.typemock.com/2009/05/get-free-typemock-licenses-aspnet.html"&gt;more information &lt;/a&gt;on how to get your free license.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-7940548259410224716?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/7940548259410224716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=7940548259410224716&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/7940548259410224716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/7940548259410224716'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2009/05/aspnet-bundle-from-typemock.html' title='Asp.Net Bundle from TypeMock'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-8961732274866293030</id><published>2008-09-02T00:06:00.001+01:00</published><updated>2008-09-02T00:07:44.292+01:00</updated><title type='text'>Must add this to my blog..</title><content type='html'>&lt;a href="http://code.google.com/p/google-code-prettify/"&gt;Javascript code prettifier&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-8961732274866293030?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/8961732274866293030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=8961732274866293030&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8961732274866293030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8961732274866293030'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2008/09/must-add-this-to-my-blog.html' title='Must add this to my blog..'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-4253862957539759016</id><published>2008-08-07T13:18:00.001+01:00</published><updated>2008-08-07T13:18:32.035+01:00</updated><title type='text'>Writing to Event log with ASP.Net and Enterprise Library</title><content type='html'>&lt;p&gt;I recently had a problem writing to the event log from my application.&amp;#160; I had configured the application to use the Logging Application Block from the 3.1 version of the Microsoft Enterprise Library and followed the walk-through in the documentation to log exceptions to the Application Log, but nothing was appearing.&lt;/p&gt;  &lt;p&gt;I had amended the code so that it always through an exception on clicking a test button, and stepping through the code, I could see that Log.Write was being called and no error was raised from this call.&lt;/p&gt;  &lt;p&gt;A quick search on Google suggested that this was a permissions issue for the ASP.Net account, so I added the following key:&lt;/p&gt;  &lt;p&gt;HKLM\System\CurrentControlSet\Services\EventLog\Application\&amp;lt;my app name&amp;gt;&lt;/p&gt;  &lt;p&gt;I granted full control to the ASPNET account to this key and amended the source property of my trace listener to &amp;lt;my app name&amp;gt; using the Enterprise Library Configuration Manager.&lt;/p&gt;  &lt;p&gt;I now get events recorded in the Application log and their source is set to &amp;lt;my app name&amp;gt; so it is easy to filter them for the events I want.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-4253862957539759016?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/4253862957539759016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=4253862957539759016&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/4253862957539759016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/4253862957539759016'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2008/08/writing-to-event-log-with-aspnet-and.html' title='Writing to Event log with ASP.Net and Enterprise Library'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-7845499426129647389</id><published>2008-03-04T17:23:00.003Z</published><updated>2008-03-04T17:26:35.415Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='clickonce CAS security AppDomain'/><title type='text'>Code Access Security For Child AppDomain</title><content type='html'>&lt;p&gt;I recently configured an existing application to use ClickOnce deployment.  All seemed to go well until I tried to run the application, whereupon it threw an exception on a line that had previously been working perfectly:&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green128\blue0;\red0\green0\blue255;}??\fs20             \cf3 AppDomain\cf0  childDomain;\par ??            childDomain = \cf3 AppDomain\cf0 .CreateDomain(ChildAppDomainName);\par ??\par ??            \cf4 //Following line throws exception\par ??\cf0             childDomain.UnhandledException += \cf5 new\cf0  \cf3 UnhandledExceptionEventHandler\cf0 (UnhandledExceptionHandler);\par ??} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:courier new;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;AppDomain&lt;/span&gt; childDomain;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            childDomain = &lt;span style="color: rgb(43, 145, 175);"&gt;AppDomain&lt;/span&gt;.CreateDomain(ChildAppDomainName);&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color:green;"&gt;//Following line throws exception&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            childDomain.UnhandledException += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;UnhandledExceptionEventHandler&lt;/span&gt;(UnhandledExceptionHandler);&lt;/p&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;The exception was:&lt;/p&gt; &lt;p&gt;{"Request for the permission of type 'System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed."}&lt;/p&gt; &lt;p&gt;The application was configured to run as FullTrust.  To cut a long and frustrating story short, It turned out that the security settings were not being propagated to the child AppDomain.  I changed the code to the following:&lt;/p&gt; &lt;p&gt;  &lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red43\green145\blue175;\red0\green0\blue255;}??\fs20             \cf3 AppDomain\cf0  childDomain;\par ??\par ??            \cf3 Evidence\cf0  baseEvidence = \cf3 AppDomain\cf0 .CurrentDomain.Evidence;\par ??            \cf3 Evidence\cf0  childEvidence = \cf4 new\cf0  \cf3 Evidence\cf0 (baseEvidence);\par ??\par ??            childDomain = \cf3 AppDomain\cf0 .CreateDomain(ChildAppDomainName, childEvidence, \cf3 AppDomain\cf0 .CurrentDomain.SetupInformation);} --&gt; &lt;/p&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:courier new;font-size:10pt;color:black;"&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;AppDomain&lt;/span&gt; childDomain;&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;Evidence&lt;/span&gt; baseEvidence = &lt;span style="color: rgb(43, 145, 175);"&gt;AppDomain&lt;/span&gt;.CurrentDomain.Evidence;&lt;/p&gt; &lt;p style="margin: 0px;"&gt;            &lt;span style="color: rgb(43, 145, 175);"&gt;Evidence&lt;/span&gt; childEvidence = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;Evidence&lt;/span&gt;(baseEvidence);&lt;/p&gt; &lt;p style="margin: 0px;"&gt; &lt;/p&gt; &lt;p style="margin: 0px;"&gt;            childDomain = &lt;span style="color: rgb(43, 145, 175);"&gt;AppDomain&lt;/span&gt;.CreateDomain(ChildAppDomainName, childEvidence, &lt;span style="color: rgb(43, 145, 175);"&gt;AppDomain&lt;/span&gt;.CurrentDomain.SetupInformation);&lt;/p&gt;&lt;/div&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;This allowed the child AppDomain to inherit the settings from the parent domain and everything worked as expected once more.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-7845499426129647389?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/7845499426129647389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=7845499426129647389&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/7845499426129647389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/7845499426129647389'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2008/03/code-access-security-for-child.html' title='Code Access Security For Child AppDomain'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-2947093144800305214</id><published>2008-02-29T12:18:00.002Z</published><updated>2008-03-05T13:41:29.840Z</updated><title type='text'>Check for existence of DB objects</title><content type='html'>&lt;p&gt;Some queries I find useful to add before the Create/Alter Statements in SQL Server.&lt;/p&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;--Constraints&lt;br /&gt;IF EXISTS(&lt;br /&gt;SELECT NULL FROM INFORMATION_SCHEMA.Constraint_column_usage&lt;br /&gt;where table_name ='MyTable'&lt;br /&gt;and constraint_name = 'FK_COl1')  &lt;/p&gt;&lt;p&gt;--Check existence of stored_proc&lt;br /&gt;IF EXISTS (SELECT NULL&lt;br /&gt;           FROM   information_schema.routines r&lt;br /&gt;           WHERE  r.specific_schema = 'dbo'&lt;br /&gt;                  AND r.specific_name = 'MyProc')&lt;br /&gt;--Check column exists&lt;br /&gt;IF NOT EXISTS (&lt;br /&gt;SELECT NULL&lt;br /&gt;  FROM information_schema.columns&lt;br /&gt;where column_name='Col1'&lt;br /&gt;   AND table_name ='MyTable'&lt;br /&gt;   and table_schema='dbo')&lt;/p&gt;--Check for description&lt;br /&gt;IF not EXISTS(&lt;br /&gt;SELECT NULL  from sys.all_objects ao&lt;br /&gt;INNER JOIN sys.extended_properties ep on ao.object_id = ep.major_id and ep.name ='MS_Description'&lt;br /&gt; where ao.name ='FK_key_name')&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-2947093144800305214?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/2947093144800305214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=2947093144800305214&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/2947093144800305214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/2947093144800305214'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2008/02/check-for-existence-of-db-objects.html' title='Check for existence of DB objects'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-5515321527495472749</id><published>2008-01-25T16:48:00.000Z</published><updated>2008-01-25T16:58:33.685Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows media player'/><title type='text'>Disable full screen video on Dual monitor setup</title><content type='html'>I was recently trying to debug an application that hosts a windows media player control and I wanted the application to run full screen on my primary display with my Visual Studio IDE on the secondary display.  Annoyingly, although the application appeared on my primary display as expected, the secondary display had a full screen video output.  There appears to be nothing in the media player API to prevent this.  It turns out that you need to change your driver display settings to prevent this.  These settings are driver specific, for mine I needed to do:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Bring up display properties from control panel&lt;/li&gt;&lt;li&gt;Click Settings&lt;/li&gt;&lt;li&gt;Click Advanced&lt;/li&gt;&lt;li&gt;Click Quadro NVS 120 M (Nvidia specific)&lt;/li&gt;&lt;li&gt;Click Start NVidia control panel&lt;/li&gt;&lt;li&gt;Click Video and Television&lt;/li&gt;&lt;li&gt;Click Modify full screen options&lt;/li&gt;&lt;li&gt;Set "When watching video content" to Only show it in my viewing application&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-5515321527495472749?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/5515321527495472749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=5515321527495472749&amp;isPopup=true' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5515321527495472749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5515321527495472749'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2008/01/disable-full-screen-video-on-dual.html' title='Disable full screen video on Dual monitor setup'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-383535443910408026</id><published>2008-01-03T09:13:00.000Z</published><updated>2008-01-03T09:23:25.482Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='custom'/><category scheme='http://www.blogger.com/atom/ns#' term='windows forms'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='config'/><category scheme='http://www.blogger.com/atom/ns#' term='soapextension'/><title type='text'>Soap Extensions in web forms client</title><content type='html'>On my current project, I need to consume a web service from a Windows Client, the web service is decorated with a custom attribute on the server side that causes the SOAP message to be compressed, this code was written by another developer but I think he got it from &lt;a href="http://www.123aspx.com/redir.aspx?res=29459"&gt;here&lt;/a&gt;.  In order to uncompress it on the client, I needed to reference the assembly that contained the SoapExtension in my client and add the following section to the app.config:&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red163\green21\blue21;\red255\green0\blue0;\red0\green0\blue0;}??\fs20 \cf1 \tab &lt;\cf3 system.web\cf1 &gt;\par ??\tab \tab &lt;\cf3 webServices\cf1 &gt;\par ??\tab \tab \tab &lt;\cf3 soapExtensionTypes\cf1 &gt;\par ??\par ??\tab \tab \tab \tab &lt;\cf3 add\cf1  \cf4 type\cf1 =\cf0 "\cf1 myCompany.myProject.WebServices.SoapExtensions.CompressionExtension,myCompany.myProject.CompressionExtensionLib\cf0 "\par ??\cf1 \tab \tab \tab \tab \cf4 priority\cf1 =\cf0 "\cf1 3\cf0 "\cf1  \cf4 group\cf1 =\cf0 "\cf1 High\cf0 "\cf1  /&gt;\par ??\tab \tab \tab &lt;/\cf3 soapExtensionTypes\cf1 &gt;\par ??\tab \tab &lt;/\cf3 webServices\cf1 &gt;\par ??\tab &lt;/\cf3 system.web\cf1 &gt;} --&gt;&lt;br /&gt;&lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;    &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;        &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;webServices&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;            &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;soapExtensionTypes&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;                &lt;&lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;add&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;myCompany.myProject.WebServices.SoapExtensions.CompressionExtension,myCompany.myProject.CompressionExtensionLib&lt;/span&gt;"&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;                &lt;/span&gt;&lt;span style="color:red;"&gt;priority&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;3&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;group&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;High&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;            &lt;!--&lt;/span--&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;soapExtensionTypes&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;        &lt;!--&lt;/span--&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;webServices&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color:blue;"&gt;    &lt;!--&lt;/span--&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;system.web&lt;/span&gt;&lt;span style="color:blue;"&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;The first part of the type is the fully qualified class name, the second part is the namespace.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-383535443910408026?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/383535443910408026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=383535443910408026&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/383535443910408026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/383535443910408026'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2008/01/soap-extensions-in-web-forms-client.html' title='Soap Extensions in web forms client'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-8527514331547452368</id><published>2007-12-11T00:49:00.000Z</published><updated>2007-12-11T00:51:26.263Z</updated><title type='text'>Another "What  type of person are you ?" survey</title><content type='html'>&lt;p&gt;&lt;a href="http://www.tk421.net/character/"&gt;&lt;img src="http://www.tk421.net/character/picard.jpg" width="164" height="225" style="border-color:#f8f8ff;" border="2" alt="Which Fantasy/SciFi Character Are You?" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-8527514331547452368?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/8527514331547452368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=8527514331547452368&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8527514331547452368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8527514331547452368'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/12/another-what-type-of-person-are-you.html' title='Another &quot;What  type of person are you ?&quot; survey'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-1984260073992815548</id><published>2007-12-07T16:32:00.000Z</published><updated>2007-12-07T16:56:52.730Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='XmlSerializer'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='InvalidOperationException'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><title type='text'>XMLSerialization with multiple XMLRoot attributes</title><content type='html'>I recently had to construct an object hierarchy in order to produce an xml config file for a third party application.  A lot of the config file could be constructed from boiler plate xml, so I needed a way to load in sections.  The section I wanted to load was for a config element which occurs someway down the heirarchy:&lt;br /&gt;&lt;br /&gt;sometag&lt;br /&gt;  core&lt;br /&gt;    object_definitions&lt;br /&gt;      object_type type="myType" plugin="myPlugin"&lt;br /&gt;        config&lt;br /&gt;          moretags&lt;br /&gt;          moretags&lt;br /&gt;          moretags&lt;br /&gt;        config&lt;br /&gt;      object_type   &lt;br /&gt;sometag&lt;br /&gt;[Haven't worked out how to escape tags quickly, so I've stripped the brackets]&lt;br /&gt;The following code shows how I created a static method in my config class to load this.&lt;br /&gt;&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red128\green128\blue128;\red0\green128\blue0;\red43\green145\blue175;\red163\green21\blue21;\red0\green0\blue255;}??\fs20  \cf3 ///\cf4  \cf3 &lt;summary&gt;\par ??\cf0     \cf3 ///\cf4  Allows definition of all UI properties\par ??\cf0     \cf3 ///\cf4  \cf3 &lt;/summary&gt;\par ??\cf0     [\cf5 Serializable\cf0 ]\par ??    [\cf5 XmlRoot\cf0 (\cf6 "config"\cf0 )]\par ??    \cf7 public\cf0  \cf7 class\cf0  \cf5 ConfigureUIObjectConfig\cf0  : \cf5 ObjectConfigBase\par ??\cf0     \{\par ??        \cf7 public\cf0  \cf7 static\cf0  \cf5 ConfigureUIObjectConfig\cf0  LoadUIConfig(\cf7 string\cf0  filePath)\par ??        \{\par ??            System.IO.\cf5 StreamReader\cf0  sr=\cf7 null\cf0 ;\par ??            \cf5 ConfigureUIObjectConfig\cf0  conf;\par ??            \cf7 try\par ??\cf0             \{\par ??                \par ??                \cf5 XmlSerializer\cf0  xs = \cf7 new\cf0  \cf5 XmlSerializer\cf0 (\cf7 typeof\cf0 (ConfigObjects.ObjectTypes.\cf5 ConfigureUIObjectConfig\cf0 ));\par ??                \par ??                sr = \cf7 new\cf0  System.IO.\cf5 StreamReader\cf0 (filePath);\par ??                conf = (\cf5 ConfigureUIObjectConfig\cf0 )xs.Deserialize(sr);\par ??            \}\par ??            \cf7 catch\cf0  (\cf5 Exception\cf0 )\par ??            \{\par ??                \cf7 throw\cf0 ;\par ??            \}\par ??            \cf7 finally\par ??\cf0             \{\par ??                \cf7 if\cf0  (sr!=\cf7 null\cf0 )\par ??                    sr.Close();\par ??            \}\par ??\par ??            \cf7 return\cf0  conf;\par ??        \}} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    8&lt;/span&gt;  &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;    9&lt;/span&gt;     &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Allows definition of all UI properties&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   10&lt;/span&gt;     &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   11&lt;/span&gt;     [&lt;span style="color: rgb(43, 145, 175);"&gt;Serializable&lt;/span&gt;]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   12&lt;/span&gt;     [&lt;span style="color: rgb(43, 145, 175);"&gt;XmlRoot&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"config"&lt;/span&gt;)]&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   13&lt;/span&gt;     &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt; : &lt;span style="color: rgb(43, 145, 175);"&gt;ObjectConfigBase&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   14&lt;/span&gt;     {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   15&lt;/span&gt;         &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt; LoadUIConfig(&lt;span style="color:blue;"&gt;string&lt;/span&gt; filePath)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   16&lt;/span&gt;         {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   17&lt;/span&gt;             System.IO.&lt;span style="color: rgb(43, 145, 175);"&gt;StreamReader&lt;/span&gt; sr=&lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   18&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt; conf;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   19&lt;/span&gt;             &lt;span style="color:blue;"&gt;try&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   20&lt;/span&gt;             {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   21&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   22&lt;/span&gt;                 &lt;span style="color: rgb(43, 145, 175);"&gt;XmlSerializer&lt;/span&gt; xs = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;XmlSerializer&lt;/span&gt;(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(ConfigObjects.ObjectTypes.&lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt;));&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   23&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   24&lt;/span&gt;                 sr = &lt;span style="color:blue;"&gt;new&lt;/span&gt; System.IO.&lt;span style="color: rgb(43, 145, 175);"&gt;StreamReader&lt;/span&gt;(filePath);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   25&lt;/span&gt;                 conf = (&lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt;)xs.Deserialize(sr);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   26&lt;/span&gt;             }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   27&lt;/span&gt;             &lt;span style="color:blue;"&gt;catch&lt;/span&gt; (&lt;span style="color: rgb(43, 145, 175);"&gt;Exception&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   28&lt;/span&gt;             {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   29&lt;/span&gt;                 &lt;span style="color:blue;"&gt;throw&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   30&lt;/span&gt;             }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   31&lt;/span&gt;             &lt;span style="color:blue;"&gt;finally&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   32&lt;/span&gt;             {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   33&lt;/span&gt;                 &lt;span style="color:blue;"&gt;if&lt;/span&gt; (sr!=&lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   34&lt;/span&gt;                     sr.Close();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   35&lt;/span&gt;             }&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   36&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   37&lt;/span&gt;             &lt;span style="color:blue;"&gt;return&lt;/span&gt; conf;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   38&lt;/span&gt;         }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;I invoke it from what is normally the root class in my hierarchy in the constructor:&lt;br /&gt;&lt;!-- {\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue0;\red255\green255\blue255;\red0\green0\blue255;\red0\green128\blue0;\red43\green145\blue175;\red163\green21\blue21;}??\fs20        \cf3 public\cf0  ConfigFile()\par ??        \{\par ??            \cf4 //Add default object types\par ??\cf0             \cf5 ConfigureUIObjectConfig\cf0  uiConf = \cf3 new\cf0  \cf5 ConfigureUIObjectConfig\cf0 ();\par ??            \cf5 ObjectType\cf0  obj = \cf3 new\cf0  \cf5 ObjectType\cf0 ();\par ??            \cf4 //obj.Config = uiConf;\par ??\cf0             obj.Config = \cf5 ConfigureUIObjectConfig\cf0 .LoadUIConfig(\cf6 "DefaultUIConfig.xml"\cf0 );\cf4 //uiConf;\par ??\cf0             obj.Plugin = \cf6 "UiConfiguratorPlugin"\cf0 ;\par ??            obj.Type = \cf6 "ConfigureUI"\cf0 ;\par ??            \cf3 this\cf0 .Core.ObjectDefinitions.ObjectTypes.Add( obj);\par ??            \par ??        \}} --&gt; &lt;div    style="background: white none repeat scroll 0% 50%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;font-family:Courier New;font-size:10pt;color:black;"&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   52&lt;/span&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; ConfigFile()&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   53&lt;/span&gt;         {&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   54&lt;/span&gt;             &lt;span style="color:green;"&gt;//Add default object types&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   55&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt; uiConf = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   56&lt;/span&gt;             &lt;span style="color: rgb(43, 145, 175);"&gt;ObjectType&lt;/span&gt; obj = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color: rgb(43, 145, 175);"&gt;ObjectType&lt;/span&gt;();&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   57&lt;/span&gt;             &lt;span style="color:green;"&gt;//obj.Config = uiConf;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   58&lt;/span&gt;             obj.Config = &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt;.LoadUIConfig(&lt;span style="color: rgb(163, 21, 21);"&gt;"DefaultUIConfig.xml"&lt;/span&gt;);&lt;span style="color:green;"&gt;//uiConf;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   59&lt;/span&gt;             obj.Plugin = &lt;span style="color: rgb(163, 21, 21);"&gt;"UiConfiguratorPlugin"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   60&lt;/span&gt;             obj.Type = &lt;span style="color: rgb(163, 21, 21);"&gt;"ConfigureUI"&lt;/span&gt;;&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   61&lt;/span&gt;             &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Core.ObjectDefinitions.ObjectTypes.Add( obj);&lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   62&lt;/span&gt; &lt;/p&gt;&lt;p style="margin: 0px;"&gt;&lt;span style="color: rgb(43, 145, 175);"&gt;   63&lt;/span&gt;         }&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The key to getting this to work is to decorate the &lt;span style="color: rgb(43, 145, 175);"&gt;ConfigureUIObjectConfig&lt;/span&gt; class with the [&lt;span style="color: rgb(43, 145, 175);"&gt;XmlRoot&lt;/span&gt;(&lt;span style="color: rgb(163, 21, 21);"&gt;"config"&lt;/span&gt;)] attribute.  If you do not do this you will get an exception:&lt;br /&gt;&lt;br /&gt;System.InvalidOperationException: &lt;&lt;span style="color: rgb(163, 21, 21);"&gt;config &lt;/span&gt;xmlns=''&gt; was not expected.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This eluded me at first as I assumed that I could only mark one class with the &lt;span style="color: rgb(43, 145, 175);"&gt;XmlRoot &lt;/span&gt;attribute,  however, it appears that this does not matter in this instance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-1984260073992815548?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/1984260073992815548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=1984260073992815548&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1984260073992815548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1984260073992815548'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/12/xmlserialization-with-multiple-xmlroot.html' title='XMLSerialization with multiple XMLRoot attributes'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-2698318880927273934</id><published>2007-10-17T13:44:00.000+01:00</published><updated>2007-10-17T13:51:21.557+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='dataset'/><category scheme='http://www.blogger.com/atom/ns#' term='xpath'/><title type='text'>Typed DataSet NullValue behaviour</title><content type='html'>The default value for NullBehaviour in a typed DataSet in Visual Studio 2005 is to throw an exception.  I recently needed to change this in a dataset containing 50 tables.  Rather than edit it manually I edited the .xsd file using xml Notepad.  I found a &lt;a href="http://blogs.msdn.com/smartclientdata/archive/2005/08/13/NullValueForTypedDataSet.aspx"&gt;post &lt;/a&gt;on MSDN that indicated what needed changing:&lt;br /&gt;&lt;br /&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;msprop:nullValue="_empty"&lt;span style=""&gt;  &lt;/span&gt;-- (Empty)&lt;/p&gt; &lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;msprop:nullValue="_null" -- (Nothing) &lt;/p&gt; &lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;msprop:nullValue="_throw" -- (Throw exception) &lt;/p&gt; &lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt; &lt;/p&gt; &lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;msprop:nullValue="_throw" is the default value and it is not persisted by default.&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;The xpath queries I used were:&lt;/p&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;--Find string columns with no null value prop&lt;br /&gt;/xs:schema/xs:element/xs:complexType/xs:choice/xs:element/xs:complexType/xs:sequence/xs:element[(child::xs:simpleType/xs:restriction/@base='xs:string') and (not(@msprop:nullValue))]&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;and&lt;/p&gt;&lt;br /&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;--Find nodes where value exists and is not '_empty'&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0in; font-size: 10pt; font-family: Verdana;"&gt;xs:schema/xs:element/xs:complexType/xs:choice/xs:element/xs:complexType/xs:sequence/xs:element[xs:simpleType/xs:restriction/@base='xs:string']/@msprop:nullValue[.!='_empty']&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-2698318880927273934?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/2698318880927273934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=2698318880927273934&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/2698318880927273934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/2698318880927273934'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/10/typed-dataset-nullvalue-behaviour.html' title='Typed DataSet NullValue behaviour'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-3594034580712784548</id><published>2007-09-12T14:53:00.000+01:00</published><updated>2007-09-12T14:56:31.325+01:00</updated><title type='text'>Conditional build events</title><content type='html'>In my current C# interop project, I unregister the existing COM dll using a pre-build event:&lt;br /&gt;&lt;br /&gt;regasm /u $(TargetPath)&lt;br /&gt;&lt;br /&gt;However, this fails if the file is not present (after a clean), so I use the following command to only unregister it if it is present.&lt;br /&gt;&lt;br /&gt;path= $(TargetDir) for %f in ($(TargetFileName)) do C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe /u %f&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-3594034580712784548?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/3594034580712784548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=3594034580712784548&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/3594034580712784548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/3594034580712784548'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/09/conditional-build-events.html' title='Conditional build events'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-8836516398103197674</id><published>2007-09-12T09:53:00.000+01:00</published><updated>2007-09-12T10:06:55.529+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net interop com javascript eventsink'/><title type='text'>Exposing COM events from .Net to Javascript in web browser</title><content type='html'>A lot has already been written about this so I won't repeat all the details here.  These two links give a good guide to how to do it.&lt;br /&gt;&lt;a href="http://www.15seconds.com/issue/060309.htm"&gt;&lt;br /&gt;COM Interop Exposed - Part 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://support.microsoft.com/kb/313891"&gt;HOW TO: Sink Managed C# Events in Internet Explorer Script&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This post is about troubleshooting some common mistakes that may occur.  The key thing to note is that if you fail to follow the steps listed in these articles:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;you will NOT get a compile time error&lt;/li&gt;&lt;li&gt;you will NOT get an error when registering the component&lt;/li&gt;&lt;li&gt;you will NOT get an error at runtime when you attach the event handler.&lt;/li&gt;&lt;/ol&gt;Mistakes that I made were:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Did not put a Dispid attribute on the methods in my event interface.&lt;/li&gt;&lt;li&gt;Had name mismatches between the events in my main class and the method names in my interface.&lt;/li&gt;&lt;/ol&gt;I'll add some test code here later.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-8836516398103197674?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/8836516398103197674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=8836516398103197674&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8836516398103197674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8836516398103197674'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/09/exposing-com-events-from-net-to.html' title='Exposing COM events from .Net to Javascript in web browser'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-1549730910187757610</id><published>2007-09-07T22:14:00.000+01:00</published><updated>2007-09-07T22:29:14.613+01:00</updated><title type='text'>COM component not registering properly</title><content type='html'>Related to my previous post, I was also having trouble getting the new .net COM object to register properly, even when I had removed all references to earlier versions.  I had used:&lt;br /&gt;&lt;br /&gt;&gt;RegAsm &lt;span style="font-style: italic;"&gt;assemblyName&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;but was unable to invoke the component in a web page.  When I tried to examine it in OleView it initially seemed to be fine.  However, when I tried to expand the class name node (under .Net category) I got the following error:&lt;br /&gt;&lt;br /&gt;CoGetClassObject failed.&lt;br /&gt;The system cannot find the file specified.&lt;br /&gt;&lt;br /&gt;severity: SEVERITY_ERROR, facility: FACILITY_WIN32 ($80070002)&lt;br /&gt;&lt;br /&gt;Registering it with:&lt;br /&gt;&lt;br /&gt;&gt;RegAsm assemblyName /codebase&lt;br /&gt;&lt;br /&gt;fixed the issue&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-1549730910187757610?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/1549730910187757610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=1549730910187757610&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1549730910187757610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1549730910187757610'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/09/com-component-not-registering-properly.html' title='COM component not registering properly'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-5857731928136166473</id><published>2007-09-07T22:00:00.000+01:00</published><updated>2007-09-07T22:13:57.819+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.net regasm com'/><title type='text'>Regasm /u not working</title><content type='html'>I had a strange problem when trying to unregister a COM visible .Net component recently.  I had built and registered several versions but when I tried to unregister them I could still see them listed when using OleView.  It turns out that the command:&lt;br /&gt;&lt;br /&gt;RegAsm /u &lt;span style="font-style:italic;"&gt;assemblyName &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;will only remove the entries that match the version number of your assembly.  If you have been incrementing the version number of your component and registering the new one without unregistering the previous version then you will end up with entries for each version.  To clear them out you can just set the version number of the assembly, compile it and then unregister it with RegAsm.  Do this for each version that you need to unregister.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-5857731928136166473?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/5857731928136166473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=5857731928136166473&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5857731928136166473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5857731928136166473'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/09/regasm-u-not-working.html' title='Regasm /u not working'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-4828039505312642492</id><published>2007-07-23T08:31:00.000+01:00</published><updated>2007-07-23T08:32:33.595+01:00</updated><title type='text'>What card are you?</title><content type='html'>&lt;p align="center"&gt;&lt;img src="http://www.flarn.com/~warlock/tarot/dragon/5.jpg"&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2 align="center"&gt;&lt;font face="Verdana"&gt;&lt;b&gt;You are The Hierophant&lt;/b&gt;&lt;/font&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;font face="Verdana"&gt;Divine Wisdom. Manifestation. Explanation. Teaching. &lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;font face="Verdana"&gt;All things relating to education, patience, help from superiors.The Hierophant is often considered to be a Guardian Angel.&lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;font face="Verdana"&gt;The Hierophant's purpose is to bring the spiritual down to Earth. Where the High Priestess between her two pillars deals with realms beyond this Earth, the Hierophant (or High Priest) deals with worldly problems. He is well suited to do this because he strives to create harmony and peace in the midst of a crisis. The Hierophant's only problem is that he can be stubborn and hidebound. At his best, he is wise and soothing, at his worst, he is an unbending traditionalist. &lt;/font&gt;&lt;/p&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;font size="2" face="Verdana"&gt;&lt;b&gt;What Tarot Card are You?&lt;/b&gt;&lt;br&gt;&lt;a href="http://www.flarn.com/~warlock/tarot"&gt;Take the Test to Find Out.&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-4828039505312642492?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/4828039505312642492/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=4828039505312642492&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/4828039505312642492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/4828039505312642492'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/07/what-card-are-you.html' title='What card are you?'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-7582446016591180493</id><published>2007-05-22T10:09:00.000+01:00</published><updated>2007-05-22T10:11:39.182+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics socialism'/><title type='text'></title><content type='html'>Nice &lt;a href="http://brackenworld.blogspot.com/2007/05/why-i-am-interested-in-politics-and-why.html"&gt;post &lt;/a&gt;at A very British Dude on the evils of socialism.  Has this youTube video on the evils of communism:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="350"&gt;&lt;param name="movie" value="http://www.youtube.com/v/iyUu-8nbd58"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/iyUu-8nbd58" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-7582446016591180493?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/7582446016591180493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=7582446016591180493&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/7582446016591180493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/7582446016591180493'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/05/nice-post-at-very-british-dude-on-evils.html' title=''/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-4991007768476206934</id><published>2007-05-14T23:52:00.000+01:00</published><updated>2007-05-15T10:17:39.723+01:00</updated><title type='text'>Golden compass</title><content type='html'>There is a promotion site for the forthcoming film &lt;a href="http://www.goldencompassmovie.com/"&gt;The Golden Compass&lt;/a&gt; which is the american name for the book The Northern Lights, the first in Philip Pullman's trilogy "His Dark Materials".  They have a short personality test there which then assigns you a Daemon.  You can then email a link to it to let your friends answer the same questions about you and see if your Daemon changes.  Mine was initially a chimpanzee so I'll email a few people and see if it changes..&lt;br /&gt;&lt;br /&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab visible ontop" href="http://goldencompassmovie.com/goldenCompass_blog.swf?id=96556"&gt;&lt;/a&gt;&lt;object height="350" width="400"&gt;&lt;param name="movie" value="http://goldencompassmovie.com/goldenCompass_blog.swf?id=96556"&gt;&lt;embed src="http://goldencompassmovie.com/goldenCompass_blog.swf?id=96556" type="application/x-shockwave-flash" menu="false" height="350" width="400"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-4991007768476206934?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/4991007768476206934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=4991007768476206934&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/4991007768476206934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/4991007768476206934'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/05/golden-compass.html' title='Golden compass'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-5720666936016415402</id><published>2007-05-13T22:44:00.000+01:00</published><updated>2007-05-13T22:46:02.213+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Michael Howard vs Alastair Campbell</title><content type='html'>Via Chicken Yoghurt:&lt;br /&gt;&lt;br /&gt;&lt;object height="350" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/3H-HdizCnh8"&gt;&lt;param name="wmode" value="transparent"&gt;&lt;embed src="http://www.youtube.com/v/3H-HdizCnh8" type="application/x-shockwave-flash" wmode="transparent" height="350" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-5720666936016415402?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/5720666936016415402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=5720666936016415402&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5720666936016415402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5720666936016415402'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/05/michael-howard-vs-alastair-campbell.html' title='Michael Howard vs Alastair Campbell'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-1494406894541905019</id><published>2007-05-11T15:27:00.000+01:00</published><updated>2007-05-11T15:28:23.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><title type='text'>Ask Tom "Avoiding overlap values..."</title><content type='html'>Nice check for overlapping values in Oracle&lt;br /&gt;&lt;br /&gt;&lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:474221407101"&gt;Ask Tom "Avoiding overlap values..."&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-1494406894541905019?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/1494406894541905019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=1494406894541905019&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1494406894541905019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1494406894541905019'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/05/ask-tom-avoiding-overlap-values.html' title='Ask Tom &quot;Avoiding overlap values...&quot;'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-3638942482025954541</id><published>2007-05-10T12:21:00.000+01:00</published><updated>2007-05-10T13:14:19.837+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='books'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Prescient</title><content type='html'>The following passage is from the introduction of the &lt;a href="http://www.amazon.co.uk/Rapstone-Chronicles-John-Mortimer/dp/0670842192/ref=sr_1_3/202-9104531-9969438?ie=UTF8&amp;s=books&amp;amp;qid=1178799232&amp;sr=8-3"&gt;Rapstone Chronicles&lt;/a&gt; by John Mortimer:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The discovery that has struck the Titmuss philosopy and left it badly holed is that caring for the environment is quite inconsistent with the free-market economy.  Green and true-blue are colours that don't, unfortunately, mix.  Preserving the countryside, protecting the woodlands, concern for the ozone layer, all demand levels of government intervention unthinkable in the heady days of victory over the miners and the Falklands War.  The high spring of &lt;span style="font-style: italic;"&gt;laissez-faire&lt;/span&gt; economics is over, the bloom is gone and, such is the nature of politics, with the bloom goes Titmuss.&lt;br /&gt;&lt;br /&gt;  Who will take his place?  It seems likely that Conservatism in the Titmuss mould is now out of style, and his successors may be those prepared to revert to the old consensus days of Butler and Harold Wilson.  But what of the left?  If free-market Toryism has taken a beating it's as nothing to what recent events in Europe have done to the dreams of the Reverend Simcox.  The Labour Party seems to have achieved its huge rise in the opinion polls by freeing itself from what are seen as the tentacles of a Socialist octupus.  So what is the new, up-and-coming Labour M.P. going to be like?  No doubt he will have extinguished the dear old Trades Union dinosaur.  Unquestionably he will be outspoken, quick-witted, with a talent for P.R. and a complete freedom from class distinctions.  He will, of course, be wearing a blue suit with a discreet tie, own a car phone and a word processor and believe in free enterprise in a mixed economy.  Is the stage set, after the next election, for the emergence of the first Labour Titmuss?  Whatever happens, of one thing there is no doubt, British politics will remain a fertile ground for comedy.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;John Mortimer 1991&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-3638942482025954541?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/3638942482025954541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=3638942482025954541&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/3638942482025954541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/3638942482025954541'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/05/prescient.html' title='Prescient'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-5900912078048289733</id><published>2007-04-10T21:21:00.000+01:00</published><updated>2007-04-10T21:34:10.506+01:00</updated><title type='text'>Shameful</title><content type='html'>&lt;a href="http://www.suntimes.com/news/steyn/331879,CST-EDT-STEYN08.article"&gt;In the end, every great power is as great as its credibility, and the only consolation after these last two weeks is that Britain doesn't have much more left to lose.&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Ouch.  I tried to convince myself that the decision to allow the 15 to give interviews was part of a cunning strategy.  Then I saw this &lt;a href="http://devilskitchen.me.uk/2007/04/vomiting-for-britain.html"&gt;post&lt;/a&gt;.  I am utterly appalled.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-5900912078048289733?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/5900912078048289733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=5900912078048289733&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5900912078048289733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5900912078048289733'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/04/shameful.html' title='Shameful'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-505805704911853862</id><published>2007-04-09T23:14:00.000+01:00</published><updated>2007-04-09T23:22:50.701+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='liberty'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'></title><content type='html'>Goodbye Magna Carta &lt;a href="http://timesonline.co.uk/tol/news/uk/article1625714.ece"&gt;article&lt;/a&gt; in the Times about the ridiculous anti protest legislation brought in by this government.  I was rather ashamed to read the following:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-style: italic;"&gt; Twenty miles from London, along the Thames, you will find a field opposite an  island in the river. The field contains a monument erected by the American  Bar Association. In the field next to it there is a memorial garden to John  F Kennedy commemorating his role in the civil rights movement. Why on earth,  you may imagine, are there American monuments in fields by the Thames? There  are no other monuments. There is nothing to commemorate anything British. &lt;/p&gt;&lt;p style="font-style: italic;"&gt; Perhaps an important figure in American history was born there? Nope. The site  is far more important to the American people than that. On that unmarked  island in 1215 something was written down that more than 500 years later  became the fifth amendment of the American Bill of Rights. “No freeman shall  be taken, imprisoned . . . or in any other way destroyed . . . except by the  lawful judgment of his peers, or by the law of the land. To no one will we  sell, to none will we deny or delay, right or justice.”&lt;/p&gt;Contrast this with the way we seem to have taken it for granted and allowed our freedoms to be eroded.  At least the guys mentioned in the article are doing something about it.&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-505805704911853862?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/505805704911853862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=505805704911853862&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/505805704911853862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/505805704911853862'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/04/goodbye-magna-carta-article-in-times.html' title=''/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-197841084932990716</id><published>2007-04-03T13:17:00.000+01:00</published><updated>2007-04-03T13:18:30.116+01:00</updated><title type='text'></title><content type='html'>&lt;table align="center" border="0" cellpadding="2" cellspacing="0" width="350"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" bg style="color:#e1e1e1;"&gt;&lt;span style="color: black; font-size: 14pt;font-family:Georgia, Times New Roman, Times, serif;" &gt;&lt;b&gt;Your Personality Profile&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td bgcolor="#e1e1e1"&gt;&lt;center&gt;&lt;img src="http://images.blogthings.com/worldsshortestpersonalitytest/black.jpg" height="100" width="100" /&gt;&lt;/center&gt;&lt;span style="color:#000000;"&gt;&lt;br /&gt;You are elegant, withdrawn, and brilliant.&lt;br /&gt;Your mind is a weapon, able to solve any puzzle.&lt;br /&gt;You are also great at poking holes in arguments and common beliefs.&lt;br /&gt;&lt;br /&gt;For you, comfort and calm are very important.&lt;br /&gt;You tend to thrive on your own and shrug off most affection.&lt;br /&gt;You prefer to protect your emotions and stay strong.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div align="center"&gt;&lt;a href="http://www.blogthings.com/worldsshortestpersonalitytest/"&gt;The World's Shortest Personality Test&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Too kind, no,really..&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-197841084932990716?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/197841084932990716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=197841084932990716&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/197841084932990716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/197841084932990716'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/04/your-personality-profile-you-are.html' title=''/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-6705237144091459333</id><published>2007-04-03T11:59:00.000+01:00</published><updated>2007-05-14T23:59:15.300+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asktom'/><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='phb'/><title type='text'>My first question on asktom</title><content type='html'>Yay!  My first &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:176803900346767421"&gt;question &lt;/a&gt;has been answered on &lt;a href="http://asktom.oracle.com/"&gt;asktom&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-6705237144091459333?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/6705237144091459333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=6705237144091459333&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6705237144091459333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6705237144091459333'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/04/my-first-question-on-asktom.html' title='My first question on asktom'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-6665835673732230685</id><published>2007-03-26T23:26:00.000+01:00</published><updated>2007-05-15T09:11:10.792+01:00</updated><title type='text'></title><content type='html'>A common requirement when importing data into a table is to log any errors which occur due to constraint violation.  This often leads to people processing data in a Cursor FOR LOOP and doing one insert at a time so that they can catch and log the error:&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  FOR source_rec IN (SELECT * FROM all_objects a)&lt;br /&gt;  LOOP&lt;br /&gt;     BEGIN&lt;br /&gt;        INSERT INTO t1&lt;br /&gt;           (col1&lt;br /&gt;           ,col2&lt;br /&gt;           ,col3)&lt;br /&gt;        VALUES&lt;br /&gt;           (source_rec.owner&lt;br /&gt;           ,source_rec.object_name&lt;br /&gt;           ,source_rec.subobject_name);&lt;br /&gt;     EXCEPTION&lt;br /&gt;        WHEN OTHERS THEN&lt;br /&gt;           --log error using PLVISION&lt;br /&gt;           plvexc.recngo;&lt;br /&gt;     END;&lt;br /&gt;  END LOOP;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;Another option is to use the EXCEPTIONS INTO clause of ENABLE constraint:&lt;br /&gt;DECLARE&lt;br /&gt;  l_exc_count INTEGER;&lt;br /&gt;BEGIN&lt;br /&gt;  --Disable unique constraint&lt;br /&gt;  EXECUTE IMMEDIATE 'ALTER TABLE t1 DISABLE CONSTRAINT UNQ_CONST1';&lt;br /&gt;  --Copy data (inc duplicates) from source table&lt;br /&gt;  INSERT INTO t1 (SELECT * FROM t2);&lt;br /&gt;  --The EXCEPTIONS table can be created using $ORACLE_HOME/rdbms/admin/utlexcpt.sql.&lt;br /&gt;  EXECUTE IMMEDIATE 'ALTER TABLE t1 ENABLE CONSTRAINT UNQ_CONST1 EXCEPTIONS INTO EXCEPTIONS';&lt;br /&gt;  --If constraint is violated it will still be disabled at this point&lt;br /&gt;  SELECT COUNT(1) INTO l_exc_count FROM t3;&lt;br /&gt;  IF l_exc_count &gt; 0&lt;br /&gt;  THEN&lt;br /&gt;     --Copy invalid rows to errors table&lt;br /&gt;     EXECUTE IMMEDIATE 'CREATE TABLE errors_tab as SELECT * FROM t1,exceptions e where t1.rowid=e.row_id';&lt;br /&gt;&lt;br /&gt;     DELETE FROM t1&lt;br /&gt;      WHERE ROWID IN (SELECT minrid&lt;br /&gt;                        FROM (SELECT object_id&lt;br /&gt;                                    ,MIN(e.row_id) minrid&lt;br /&gt;                                FROM EXCEPTIONS e&lt;br /&gt;                                    ,t_dups     t&lt;br /&gt;                               WHERE t.ROWID = e.row_id&lt;br /&gt;                               GROUP BY object_id));&lt;br /&gt;  END IF;&lt;br /&gt;END;&lt;br /&gt;&lt;br /&gt;Cool new feature in Oracle 10gR2 is the LOG ERRORS clause&lt;br /&gt;&lt;br /&gt;&lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:47458244605081#53104016181239"&gt;Comment&lt;/a&gt; at &lt;a href="http://asktom.oracle.com/"&gt;asktom&lt;/a&gt; had the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;insert /*+ APPEND */ into t select * from t2&lt;br /&gt;LOG ERRORS REJECT LIMIT UNLIMITED;&lt;br /&gt;&lt;br /&gt;Further details &lt;a href="http://download-east.oracle.com/oowsf2005/204wp.pdf"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-6665835673732230685?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/6665835673732230685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=6665835673732230685&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6665835673732230685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6665835673732230685'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/03/common-requirement-when-importing-data.html' title=''/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-6410081133505538809</id><published>2007-03-22T13:10:00.000Z</published><updated>2007-03-22T13:10:02.242Z</updated><title type='text'>The Devil's Kitchen: 50 Reasons Why The Independent Hasn't Got A Clue</title><content type='html'>&lt;a href="http://devilskitchen.me.uk"&gt;Devil's Kitchen&lt;/a&gt; gives a thorough fisking of the Independent's article "&lt;a href="http://news.independent.co.uk/europe/article2377694.ece"&gt;50 reasons to love the EU&lt;/a&gt;"&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devilskitchen.me.uk/2007/03/50-reasons-why-independent-hasnt-got.html"&gt;The Devil's Kitchen: 50 Reasons Why The Independent Hasn't Got A Clue&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I particularly like number 28&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-6410081133505538809?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://devilskitchen.me.uk/2007/03/50-reasons-why-independent-hasnt-got.html' title='The Devil&apos;s Kitchen: 50 Reasons Why The Independent Hasn&apos;t Got A Clue'/><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/6410081133505538809/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=6410081133505538809&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6410081133505538809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6410081133505538809'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/03/devils-kitchen-50-reasons-why.html' title='The Devil&apos;s Kitchen: 50 Reasons Why The Independent Hasn&apos;t Got A Clue'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-5733468723221799700</id><published>2007-03-16T10:05:00.000Z</published><updated>2007-03-16T10:07:37.295Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Record Exists</title><content type='html'>Copied from some tips put together by Chris Rudd, ultimately sourced from Steven Feuerstein&lt;br /&gt;/*&lt;br /&gt;Note that the following shows three ways of checking if a record exists which have very similar response times, one way (implicit cursor) which is bad, and a fifth way&lt;br /&gt;( select count(*) ) which is a VERY BAD THING and will result in broken fingers for anyone found using it!&lt;br /&gt;*/&lt;br /&gt;SET VERIFY OFF&lt;br /&gt;@ssoo&lt;br /&gt;DECLARE&lt;br /&gt;/* Different approaches to answering "at least one?" */&lt;br /&gt; CURSOR empcur&lt;br /&gt; IS&lt;br /&gt;    SELECT employee_id&lt;br /&gt;      FROM employee_big WHERE department_id = &amp;&amp;amp;secondparm;&lt;br /&gt; v NUMBER;&lt;br /&gt; b BOOLEAN;&lt;br /&gt;BEGIN&lt;br /&gt; plvtmr.set_factor (&amp;&amp;amp;firstparm);&lt;br /&gt; plvtmr.capture;&lt;br /&gt; FOR i IN 1 .. &amp;&amp;amp;firstparm&lt;br /&gt; LOOP&lt;br /&gt;    BEGIN&lt;br /&gt;       SELECT employee_id INTO v FROM employee_big&lt;br /&gt;        WHERE department_id = &amp;&amp;amp;secondparm;&lt;br /&gt;       b := TRUE;&lt;br /&gt;    EXCEPTION&lt;br /&gt;       WHEN NO_DATA_FOUND THEN b := FALSE;&lt;br /&gt;       WHEN TOO_MANY_ROWS THEN b := TRUE;&lt;br /&gt;    END;&lt;br /&gt; END LOOP;&lt;br /&gt; PLVtmr.show_elapsed ('Implicit');&lt;br /&gt;&lt;br /&gt; plvtmr.capture;&lt;br /&gt; FOR i IN 1 .. &amp;&amp;amp;firstparm&lt;br /&gt; LOOP&lt;br /&gt;    OPEN empcur;&lt;br /&gt;    FETCH empcur INTO v;&lt;br /&gt;    b := empcur%FOUND;&lt;br /&gt;    CLOSE empcur;&lt;br /&gt; END LOOP;&lt;br /&gt; PLVtmr.show_elapsed ('Explicit');&lt;br /&gt;&lt;br /&gt; plvtmr.capture;&lt;br /&gt; FOR i IN 1 .. &amp;&amp;amp;firstparm&lt;br /&gt; LOOP&lt;br /&gt;    SELECT COUNT(*) INTO v&lt;br /&gt;      FROM employee_big WHERE department_id = &amp;&amp;amp;secondparm;&lt;br /&gt;    b := v &gt; 0;&lt;br /&gt; END LOOP;&lt;br /&gt; PLVtmr.show_elapsed ('COUNT');&lt;br /&gt;&lt;br /&gt; /* Ohio OUG Contributions.... */&lt;br /&gt; plvtmr.capture;&lt;br /&gt; FOR i IN 1 .. &amp;&amp;amp;firstparm&lt;br /&gt; LOOP&lt;br /&gt;    SELECT COUNT(1) INTO v&lt;br /&gt;      FROM employee_big WHERE department_id = &amp;&amp;amp;secondparm&lt;br /&gt;       AND ROWNUM &lt;&gt; 0;&lt;br /&gt; END LOOP;&lt;br /&gt; PLVtmr.show_elapsed ('COUNT ROWNUM&lt;2'); department_id =" &amp;&amp;amp;secondparm);"&gt; @atleastone 1000 20&lt;br /&gt;Implicit Elapsed: .45 seconds. Factored: .00045 seconds.&lt;br /&gt;Explicit Elapsed: .12 seconds. Factored: .00012 seconds.&lt;br /&gt;COUNT Elapsed: 2.21 seconds. Factored: .00221 seconds.&lt;br /&gt;COUNT ROWNUM&lt;2&gt; @atleastone 20000 20&lt;br /&gt;Implicit Elapsed: 8.06 seconds. Factored: .0004 seconds.&lt;br /&gt;Explicit Elapsed: 2.46 seconds. Factored: .00012 seconds.&lt;br /&gt;COUNT Elapsed: 42.21 seconds. Factored: .00211 seconds.&lt;br /&gt;COUNT ROWNUM&lt;2 Elapsed: 2.42 seconds. Factored: .00012 seconds.&lt;br /&gt;EXISTS Elapsed: 2.63 seconds. Factored: .00013 seconds.&lt;br /&gt;&lt;br /&gt;   * /&lt;br /&gt;&lt;br /&gt;END;&lt;br /&gt;/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-5733468723221799700?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/5733468723221799700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=5733468723221799700&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5733468723221799700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/5733468723221799700'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/03/record-exists.html' title='Record Exists'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-6312032944490993057</id><published>2007-03-08T13:47:00.000Z</published><updated>2007-03-08T13:47:17.419Z</updated><title type='text'>Ask Tom "Hierarchical query"</title><content type='html'>&lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10297016796441#51432761970983"&gt;Ask Tom "Hierarchical query"&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nice bit in follow up comments about collapsing rows using analytics.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-6312032944490993057?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:10297016796441#51432761970983' title='Ask Tom &quot;Hierarchical query&quot;'/><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/6312032944490993057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=6312032944490993057&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6312032944490993057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/6312032944490993057'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/03/ask-tom-hierarchical-query.html' title='Ask Tom &quot;Hierarchical query&quot;'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-8532381117515635097</id><published>2007-02-20T13:49:00.000Z</published><updated>2007-02-20T13:49:54.118Z</updated><title type='text'>Mr Eugenides: Menteurs</title><content type='html'>I'm not sure why the mendacity of this government still causes me to burst a blood vessel every now and then but this is extraordinary:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://mreugenides.blogspot.com/2007/02/menteurs.html"&gt;Mr Eugenides: Menteurs&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-8532381117515635097?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://mreugenides.blogspot.com/2007/02/menteurs.html' title='Mr Eugenides: Menteurs'/><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/8532381117515635097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=8532381117515635097&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8532381117515635097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/8532381117515635097'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/02/mr-eugenides-menteurs.html' title='Mr Eugenides: Menteurs'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-1958546751331678061</id><published>2007-02-13T08:50:00.000Z</published><updated>2007-02-08T13:38:01.920Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pseudoscience'/><category scheme='http://www.blogger.com/atom/ns#' term='fisk'/><title type='text'>Bad science - Gillian McKieth gets fisked</title><content type='html'>Ben Goldacre has a great &lt;a href="http://www.guardian.co.uk/food/Story/0,,2011095,00.html"&gt;piece &lt;/a&gt;in today's &lt;a href="http://www.guardian.co.uk"&gt;Guardian&lt;/a&gt; where he comprehensively demolishes the scientific pretensions of Gillian McKeith, who presents You are what you eat on Channel 4.&lt;br /&gt;&lt;br /&gt;"McKeith is a menace to the public understanding of science. She seems to misunderstand not nuances, but the most basic aspects of biology - things that a 14-year-old could put her straight on. She talks endlessly about chlorophyll, for example: how it's "high in oxygen" and will "oxygenate your blood" - but chlorophyll will only make oxygen in the presence of light. It's dark in your intestines, and even if you stuck a searchlight up your bum to prove a point, you probably wouldn't absorb much oxygen in there, because you don't have gills in your gut. In fact, neither do fish. In fact, forgive me, but I don't think you really want oxygen up there, because methane fart gas mixed with oxygen is a potentially explosive combination. Future generations will look back on this phenomenon with astonishment."&lt;br /&gt;&lt;br /&gt;hat tip to &lt;a href="http://plasticbag.org"&gt;Tom Coates&lt;/a&gt; and the &lt;a href="http://mreugenides.blogspot.com"&gt;poor little greek boy&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-1958546751331678061?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/1958546751331678061/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=1958546751331678061&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1958546751331678061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1958546751331678061'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2007/02/bad-science-gillian-mckieth-gets-fisked.html' title='Bad science - Gillian McKieth gets fisked'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-1886265122410637093</id><published>2006-11-29T08:36:00.000Z</published><updated>2006-11-29T08:39:38.878Z</updated><title type='text'></title><content type='html'>&lt;div&gt;&lt;br /&gt;  &lt;embed quality="high" type="application/x-shockwave-flash" wmode="transparent" src="http://www.frappr.com/ajax/yvmap.swf" flashvars="host=http://www.frappr.com/&amp;origin=blogger&amp;lo=1&amp;mvid=68719488105" salign="l" align="middle" scale="noscale" width="500" height="300"&gt;&lt;/embed&gt;&lt;br /&gt;  &lt;div&gt;&lt;br /&gt;    &lt;a href="http://visitor.frappr.com/?sig=visitor_map&amp;src_mvid=68719488105&amp;origin=blogger" target=_blank&gt;&lt;br /&gt;      &lt;img src="http://frappr.com/i/gyo.gif" border=0/&gt;&lt;br /&gt;    &lt;/a&gt;&lt;br /&gt;    &lt;a href="http://www.frappr.com/?a=showmap2&amp;mapid=68719488108&amp;src=flash_map&amp;sig=visitor_map&amp;src_mvid=68719488105&amp;origin=blogger&amp;ct=seemore" target=_blank&gt;&lt;img src="http://frappr.com/i/s.gif" border=0/&gt;&lt;/a&gt;&lt;a href="http://www.frappr.com/?a=showmap2&amp;mapid=68719488108&amp;src=flash_map&amp;sig=visitor_map&amp;src_mvid=68719488105&amp;origin=blogger&amp;ct=pendingpins" target=_blank&gt;&lt;img src="http://frappr.com/dyn_map/68719488108/origin:blogger/p.gif" border=0/&gt;&lt;/a&gt;&lt;a href="http://www.frappr.com/?a=feedback&amp;type=vm" target=_blank&gt;&lt;img src="http://frappr.com/i/h.gif" border=0/&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-1886265122410637093?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/1886265122410637093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=1886265122410637093&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1886265122410637093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/1886265122410637093'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2006/11/blog-post.html' title=''/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-115749127254306358</id><published>2006-09-05T21:22:00.000+01:00</published><updated>2006-12-07T13:13:05.783Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Stuff I find useful</title><content type='html'>Here is a list of some of the software I find useful:&lt;br /&gt;&lt;br /&gt;Visual Studio 2005&lt;br /&gt;&lt;a href="http://www.cygwin.com/"&gt;Cygwin &lt;/a&gt;- Free unix style utilities such as grep, xwindows client etc.&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/products/database/sql_developer/index.html"&gt;SQL Developer&lt;/a&gt; - Free ide from Oracle.  Extensible plug-in architecture.&lt;br /&gt;&lt;a href="http://www.mozilla.com/en-US/firefox/"&gt;Firefox &lt;/a&gt;- Much better browser than Internet Explorer.  Configurable.&lt;br /&gt;&lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.Net&lt;/a&gt; Continuous integration tool&lt;br /&gt;&lt;a href="http://www.google.co.uk/url?sa=t&amp;ct=res&amp;amp;cd=2&amp;url=http%3A%2F%2Fwww.sparxsystems.com%2Fproducts%2Fea.html&amp;amp;ei=KRZuRbjfFov6QZCMvJkL&amp;usg=__YeCwCDlmZKi5rfxw1-gFPOmIfTM=&amp;amp;sig2=E027RQoMg2eG43Fd7syDeg"&gt;Enterprise Architect&lt;/a&gt; - UML tool&lt;br /&gt;&lt;a href="http://www.textpad.com/"&gt;Textpad&lt;/a&gt;/&lt;a href="http://www.ultraedit.com/"&gt;UltraEdit32&lt;/a&gt; - Text editors, UltraEdit has more features but textpad is more lightweight.&lt;br /&gt;&lt;a href="http://www.devexpress.com/Products/NET/IDETools/VBRefactor/"&gt;Refactor&lt;/a&gt;! - Refactoring addin for Visual Studio&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gotdotnet.com/Team/FxCop/"&gt;FXCop Code analysis tool&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.nunit.org/"&gt;NUnit &lt;/a&gt;- Unit testing tool for .Net&lt;br /&gt;&lt;a href="http://www.toadworld.com/Downloads/ExclusiveToadWorldSoftware/tabid/78/Default.aspx"&gt;Quest Code Tester for Oracle&lt;/a&gt;(previously known as QUTE)&lt;br /&gt;&lt;a href="http://sharpdevelop.net/"&gt;SharpDevelop 2.0&lt;/a&gt; - Open Source IDE for .Net (C#,VB and Boo).  It includes a tool for converting VB to C# and vice versa.&lt;br /&gt;&lt;a href="http://www.oracle.com/technology/tech/dotnet/tools/index.html"&gt;Oracle Developer Tools&lt;/a&gt; - Addin for Visual Studio&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-115749127254306358?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/115749127254306358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=115749127254306358&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/115749127254306358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/115749127254306358'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2006/09/stuff-i-find-useful.html' title='Stuff I find useful'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-114534954490015127</id><published>2006-04-18T09:33:00.000+01:00</published><updated>2006-04-18T11:30:18.070+01:00</updated><title type='text'>Troubleshooting automated builds with CruiseControl.Net, PVCS and MSBuild</title><content type='html'>Following on from our efforts to automate our build process, I have been experimenting with &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/What+is+Continuous+Integration"&gt;Continuous Integration&lt;/a&gt; using &lt;a href="http://confluence.public.thoughtworks.org/display/CCNET/Welcome+to+CruiseControl.NET"&gt;CruiseControl.Net&lt;/a&gt;.  This integrates the various parts of the build process such as source control, build tools, testing tools etc. and can remove a lot of the grunt work from performing builds.  The cool thing about it is that it can be set up to poll the source control system for modifications and trigger a build whenever one of the source files changes so you get early notice of when the build is broken.&lt;br /&gt;&lt;br /&gt;The tool is fairly well documented using a wiki.  As with many wikis though, some parts of the documentation receive more attention than others.  This caused me a few problems as we are using an old version of PVCS for source control and the PVCS docs are a bit thin.  I got it working after a bit of trial and error and subsequent browsing of other areas of the site for different source control providers gave some tips that appear to be common to all source providers, so a common section would have been useful.&lt;br /&gt;&lt;br /&gt;Installation was fairly simple and I proceeded to set up a simple test project:&lt;br /&gt;&lt;br /&gt;&amp;lt;sourcecontrol type="pvcs"&amp;gt;&lt;br /&gt;      &amp;lt;!--client executable--&amp;gt;&lt;br /&gt;      &amp;lt;executable&amp;gt;X:\VM\Win32\Bin\pcli.exe&amp;lt;/executable&amp;gt;&lt;br /&gt;      &amp;lt;!--PVCS Database--&amp;gt;&lt;br /&gt;      &amp;lt;project&amp;gt;S:\PVCS Databases&amp;lt;/project&amp;gt;&lt;br /&gt;      &amp;lt;subproject&amp;gt;/LIBRARY/.Net/NullableDateTimePicker&amp;lt;/subproject&amp;gt;&lt;br /&gt;      &amp;lt;workingDirectory &amp;gt;C:\development\LIBRARY\.Net\NullableDateTimePicker&amp;lt;/workingDirectory&amp;gt;&lt;br /&gt;      &amp;lt;!--&amp;lt;recursive &amp;gt;true&amp;lt;/recursive&amp;gt;--&amp;gt;&lt;br /&gt;      &amp;lt;autoGetSource &amp;gt;True&amp;lt;/autoGetSource&amp;gt;&lt;br /&gt;      &amp;lt;labelOrPromotionName &amp;gt;shared_DEV&amp;lt;/labelOrPromotionName&amp;gt;&lt;br /&gt;    &amp;lt;/sourcecontrol&amp;gt;&lt;br /&gt;This configuration did not work and I had to investigate a bit more how it works.  What seems to happen is that CruiseControl issues a succession of pcli commands and use the output from each to build further batch files for use by the next command.  On my system, these batch files were saved to my temp directory:&lt;br /&gt;C:\Documents and Settings\myname\Local Settings\Temp&lt;br /&gt;&lt;br /&gt;When the next command attempted to use the file as input, the directory name was not escaped so the embedded spaces caused it to fail.  I worked around this by setting my TEMP and TMP environment variables to point to C:\agtemp\temp  this allowed me to proceed to the next step.&lt;br /&gt;&lt;br /&gt;Now that the pcli commands were succesfully running, I had to change a source file in order to trigger the build.  When I did this, I noticed that the pcli command produced by CruiseControl only got changed files when I had assumed that it would get all files in the project.  This does make sense as the structure in PVCS does not neccesarily map directly to the .Net project structure.  You are supposed to already have all the source code available in your working directory before starting CruiseControl which then just gets subsequent modifications before performing the build.  If you need to get all of it then you can do a get for a specific label or promotion group by adding a &amp;lt;/labelorpromotionname&amp;gt; element whose value corresponds to your label or promotion group.&lt;br /&gt;&lt;br /&gt;Finally, I wasn't getting any executables even though the build was reported as succesful.  This was another mistaken assumption on my part as I thought that it would automatically call MSBuild for the project.  I added an MSBuild task to the project and configured it to call my solution file which then resulted in a shiny new dll in the release folder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-114534954490015127?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/114534954490015127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=114534954490015127&amp;isPopup=true' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114534954490015127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114534954490015127'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2006/04/troubleshooting-automated-builds-with.html' title='Troubleshooting automated builds with CruiseControl.Net, PVCS and MSBuild'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-114496641612383878</id><published>2006-04-13T22:57:00.000+01:00</published><updated>2006-04-13T23:37:24.363+01:00</updated><title type='text'>Automating builds with PVCS and MSBuild</title><content type='html'>We are currently using PVCS version 6.8 as the Source Code Control system on a large .Net project.  The project consists of 30 Assemblies so the builds take quite a while.  I have been trying to get automated builds working so that we can run them as an overnight job.  The script turned out to be quite simple in the end but working out the right combination of options was a trial and error process.  Here is the script we used in the end:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#008000;"&gt;REM -a&lt;em&gt;workpath&lt;/em&gt; Path to place  workfiles in. Overrides default workspace for project&lt;br /&gt;REM -bp&lt;em&gt;projpath  &lt;/em&gt;path to base project to use when resolving references, required when -a or  -o specified&lt;br /&gt;REM -pr&lt;em&gt;DBpath&lt;/em&gt; to PVCS database&lt;br /&gt;REM -z recursive  flag, operate on specified project and all sub-projects&lt;br /&gt;REM  -g&lt;em&gt;PromotionGroup&lt;/em&gt; get files with specified promotion group or  higher&lt;br /&gt;REM &lt;em&gt;entity&lt;/em&gt; project to operate on&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;x:\vm\win32\bin\pcli get -bp"/Billing/Source" -gGBDEV  -pr"X:\VM\vmdevint" -aH:\gettest -z "/Billing/Source"&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#008000;"&gt;REM cd to workpath&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;cd  H:\gettest&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;REM&lt;br /&gt;REM  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild  /logger:EmailLogger,"C:\EmailLogger\bin\Release\EmailLogger.dll";To=buildmanager@tempuri.org;From=buildmanager@tempuri.org;Subject=BuildLog:%DATE%;Host=mail.tempuri.org  Billing.sln&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\msbuild  Billing.sln&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;The commented out call to msbuild includes a call to a custom logger that will email the results of the build.  The source code for the logger was obtained from this &lt;a style="color: rgb(51, 51, 51);" href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=136631&amp;amp;SiteID=1"&gt;blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-114496641612383878?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/114496641612383878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=114496641612383878&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114496641612383878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114496641612383878'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2006/04/automating-builds-with-pvcs-and.html' title='Automating builds with PVCS and MSBuild'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-114384011510098133</id><published>2006-03-31T22:14:00.000+01:00</published><updated>2006-03-31T23:25:17.726+01:00</updated><title type='text'>Photos</title><content type='html'>I've been playing with a number of different sites recently to store my digital photos and order prints.  One of the nicest for sharing photos is &lt;a href="http://flickr.com"&gt;flickr.com&lt;/a&gt;.  The UI is very slick and it is very flexible in the way that you can organize photos.  Unfortunately, you cannot (yet) order prints from a UK supplier from the site.&lt;br /&gt;&lt;br /&gt;Most of the UK print shops (Jessops, SupaSnaps etc.) have some online ordering and photo-sharing facilities, however they often have limits on the amount of time that photos will be kept for and/or storage limits.  Also, the bulk upload facilities often rely on ActiveX controls which is a pain if you use Firefox as your browser or a non-Windows OS such as Linux.&lt;br /&gt;&lt;br /&gt;I have finally settled on &lt;a href="http://www.photobox.co.uk"&gt;photobox.co.uk&lt;/a&gt;.  The browser based bulk upload tool is a java applet so it works on linux and they also allow you to upload files by FTP.  There is an initial storage limit of 200 Mb but this increases by 50Mb for each order placed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-114384011510098133?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/114384011510098133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=114384011510098133&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114384011510098133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114384011510098133'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2006/03/photos.html' title='Photos'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-114323743561924806</id><published>2006-03-24T21:47:00.000Z</published><updated>2006-03-24T21:57:15.620Z</updated><title type='text'>Finally resurrecting this blog</title><content type='html'>As I am on holiday this week I have finally got around to resurrecting my blog.  I originally opened it as somewhere to store links to sites I'd found on the internet but&lt;br /&gt;&lt;a href="http://del.icio.us/purplepangolin"&gt;del.icio.us&lt;/a&gt; is a much better alternative.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-114323743561924806?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/114323743561924806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=114323743561924806&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114323743561924806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/114323743561924806'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2006/03/finally-resurrecting-this-blog.html' title='Finally resurrecting this blog'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-109413195016258851</id><published>2004-09-02T14:32:00.000+01:00</published><updated>2006-08-23T21:53:16.233+01:00</updated><title type='text'>mono-debugger</title><content type='html'>Tried to compile mono-debugger-0.9 from source and got a similar error in wrapper.c to that in this &lt;a href="http://www.gotmono.com/cgi-bin/yabb/YaBB.pl?board=news;action=display;num=1088687560"&gt;post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-109413195016258851?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/109413195016258851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=109413195016258851&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/109413195016258851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/109413195016258851'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2004/09/mono-debugger.html' title='mono-debugger'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-109403786401990666</id><published>2004-09-01T12:24:00.000+01:00</published><updated>2007-03-16T10:07:57.182Z</updated><title type='text'>The Mono Handbook</title><content type='html'>&lt;a href="http://www.gotmono.com/docs/"&gt;The Mono Handbook&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-109403786401990666?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/109403786401990666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=109403786401990666&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/109403786401990666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/109403786401990666'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2004/09/mono-handbook.html' title='The Mono Handbook'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8076318.post-109346056984481176</id><published>2004-08-25T20:02:00.000+01:00</published><updated>2007-03-16T10:08:19.503Z</updated><title type='text'>What is Mono?</title><content type='html'>&lt;a href="http://www.mono-project.com/about/index.html"&gt;What is Mono?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mono is an open source implementation of the .Net platform&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8076318-109346056984481176?l=purplepangolin.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://purplepangolin.blogspot.com/feeds/109346056984481176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8076318&amp;postID=109346056984481176&amp;isPopup=true' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/109346056984481176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8076318/posts/default/109346056984481176'/><link rel='alternate' type='text/html' href='http://purplepangolin.blogspot.com/2004/08/what-is-mono.html' title='What is Mono?'/><author><name>purplepangolin</name><uri>http://www.blogger.com/profile/17297351611950245044</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
