<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Andornot Developers' Blog</title><link>http://www.andornot.com/about/developerblog/Default.aspx</link><description></description><language>en</language><managingEditor>noreply@blogger.com (Peter Tyrrell)</managingEditor><lastBuildDate>Wed, 27 May 2009 12:19:21 PDT</lastBuildDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">218</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/AndornotDevelopersBlog" type="application/rss+xml" /><item><title>What I have learned the hard way (as usual) with VMWare</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/RoYng9GkpD4/what-i-have-learned-hard-way-as-usual.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Wed, 27 May 2009 12:19:21 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-4367096141484321217</guid><description>&lt;span style="font-weight:bold;"&gt;Always take snapshots when the guest is powered-down.&lt;/span&gt;&lt;div&gt;Although in VMWare Workstation you can take a snapshot at any time, you cannot clone a snapshot taken of a powered-on guest. &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;So for example, I patched a new Windows Server 2003 guest OS with dozens of Windows Updates, installed SQL Server, installed and configured SQL Server Reporting Services, etc. It took hours. I made snapshots at each phase, and indeed was able to revert back to one after screwing up royally. However, when I later went to clone the "all patches" snapshot to re-use the guest somewhere else, I was unable to do so because the guest had been on when I took the snapshot. I pulled out all my teeth in frustration and smashed them with a hammer, then began uninstalling everything after the patches.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;Check the guest firewall settings if you have host-to-guest network problems&lt;/b&gt;&lt;/div&gt;&lt;div&gt;If you have double-checked that the virtual network settings are not to blame for an inability of the host to communicate with the guest, then ensure the guest firewall settings are not blocking incoming requests.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;In my case the guest was using bridged networking and could ping the host and connect to the internet via the LAN gateway. The host could not ping the guest, the reason being that the guest firewall disallowed incoming echo requests by default. Further, since I wanted to use the guest as an http server, I needed to allow http requests at the firewall level. The agony preceding this discovery was akin to a hot knife stabbing repeatedly into my liver. &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;b&gt;32 bit guests created on a 64 bit host can only be deployed on a 32 bit host if the deployed host hardware supports 64 bit processing&lt;/b&gt;&lt;/div&gt;&lt;div&gt;This one is counterintuitive. Just because it's a 32 bit guest doesn't mean it's going to run on a 32 bit host. &lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Newer machines tend to support 64 bit processing. Older ones don't. It's entirely possible that a host will be running a 32 bit OS but be 64 bit capable. How do you know? Download &lt;a href="http://www.cpuid.com/cpuz.php"&gt;CPU-Z&lt;/a&gt; and it will examine the hardware and tell you. The VMWare &lt;a href="http://vmware.com/download/shared_utilities.html"&gt;CPU Identification Utility&lt;/a&gt; might also help, but I'm unclear as to whether it just checks for a 64 bit OS, or hardware 64 bit capability.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-4367096141484321217?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/RoYng9GkpD4" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/05/what-i-have-learned-hard-way-as-usual.aspx</feedburner:origLink></item><item><title>TypeMock unit testing</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/FAvtz7UMM-Q/typemock-unit-testing.aspx</link><author>noreply@blogger.com (Ted Jardine)</author><pubDate>Wed, 20 May 2009 09:25:41 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-5353584270007510127</guid><description>I like free!

As &lt;a href="http://vaultofthoughts.net/FreeASPNETBundle.aspx"&gt;Michal Talaga in turn quotes TypeMock's promotion page&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;:&lt;/span&gt;
&lt;a href="http://vaultofthoughts.net/ct.ashx?id=cdec5758-51b7-4c18-acfc-e46b18fea544&amp;amp;url=http%3a%2f%2fwww.typemock.com%2f"&gt;&lt;/a&gt;&lt;a href="http://vaultofthoughts.net/ct.ashx?id=cdec5758-51b7-4c18-acfc-e46b18fea544&amp;amp;url=http%3a%2f%2fwww.typemock.com%2f"&gt;&lt;/a&gt;&lt;blockquote&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.

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;span style="color: rgb(0, 102, 0);"&gt;&lt;strong&gt;FREE licenses&lt;/strong&gt;&lt;/span&gt; to bloggers and their readers.

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.

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;.

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.

Also 8 bloggers will get an &lt;strong&gt;additional 2 licenses&lt;/strong&gt; (each) to give away to their readers / friends.

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;/blockquote&gt;Yep, free sounds good. I've not had a chance to try out TypeMock, so this will be a good opportunity.&lt;hints id="hah_hints"&gt;&lt;/hints&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-5353584270007510127?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/FAvtz7UMM-Q" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/05/typemock-unit-testing.aspx</feedburner:origLink></item><item><title>Inmagic Webpublisher works on Windows 7</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/JBDQXMAepHw/inmagic-webpublisher-works-on-windows-7.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Wed, 06 May 2009 13:35:18 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-941797723188233488</guid><description>I installed Windows 7 RC a few days ago and so far it looks like Inmagic DB/Textworks 11 and Webpublisher Pro 11 are compatible with it.

Both must be installed in "run as administrator" mode, of course. See &lt;a href="http://www.andornot.com/about/developerblog/2007/06/how-to-install-inmagic-dbtextworks-on.aspx"&gt;the post related to Vista installs&lt;/a&gt; for details and further links.

&lt;a href="http://www.andornot.com/about/developerblog/2008/05/how-to-install-webpublisher-on-64-bit.aspx"&gt;This post for installing Webpublisher on 64 bit IIS 7&lt;/a&gt; is still valid for Windows 7.

Also &lt;a href="http://www.andornot.com/about/developerblog/2008/07/inmagic-dbtextworks-and-vista.aspx"&gt;Denise's warning against putting textbases in the Program Files folder&lt;/a&gt; still applies. (Virtualization spirits the files away out of the Program Files folder.)

One thing unfortunately is insurmountable at this point: &lt;a href="http://support.microsoft.com/kb/917607"&gt;there is no WinHlp32 support for Windows 7 RC&lt;/a&gt; (though there will be when Windows 7 goes RTM) so no DB/Textworks help for me. I've memorized it anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-941797723188233488?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/JBDQXMAepHw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/05/inmagic-webpublisher-works-on-windows-7.aspx</feedburner:origLink></item><item><title>The importance of beauty</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/rD5NtDnleBI/importance-of-beauty.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Tue, 21 Apr 2009 10:55:02 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-1614505312607046783</guid><description>&lt;p&gt;A fine article from the good people at &lt;a href="http://alistapart.com/"&gt;A List Apart&lt;/a&gt; (the website for people who make websites). I always strive for aesthetically pleasing design in my work at Andornot. It just feels better when it looks good.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;In Defense of Eye Candy     &lt;br /&gt;&lt;/em&gt;&amp;quot;Research proves attractive things work better. How we think cannot be separated from how we feel. The next time a boss, client, or co-worker scoffs at the notion that beauty is an important aspect of interface design, point their peepers here.&amp;quot;    &lt;br /&gt;    &lt;br /&gt;&lt;a href="http://www.alistapart.com/articles/indefenseofeyecandy"&gt;http://www.alistapart.com/articles/indefenseofeyecandy&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-1614505312607046783?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/rD5NtDnleBI" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/04/importance-of-beauty.aspx</feedburner:origLink></item><item><title>MS Office Features for Tracking Revisions</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/3CpEnaJ6f_k/ms-office-features-for-tracking.aspx</link><category>Microsoft Word</category><category>MS Office 2007</category><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Thu, 16 Apr 2009 09:26:11 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-6370452324159566484</guid><description>&lt;p&gt;Have you ever sent a Word document or Excel spreadsheet out for review and asked the recipient to please, please, please either turn on Track Changes or insert Comments, so you can see their revisions, only to have the document come back with neither? If so, here are two features available in Word and Excel that will help.  &lt;p&gt;First, before sending a document out for review, you can turn on Track Changes in such a way that the recipient cannot turn it off without knowing a password. To do so in Word 2007:  &lt;ol&gt; &lt;li&gt;Select the Review tab on the Ribbon Bar, click the Protect Document button, and choose the Restrict Formatting and Editing option.  &lt;li&gt;In the panel that appears, ignore option 1, but tick option 2 and change the drop down selector to Tracked Changes (or Comments if you prefer to only allow comments to be made).  &lt;li&gt;Click the Yes, Start Enforcing Protection button and enter a password when prompted, to allow you to turn off Tracked Changes or Comments later. &lt;li&gt;Save the document and send it out for review.&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;The procedure is similar in Excel.  &lt;p&gt;In both applications, you can also be more fine-grained in what editing you allow, such as restricting editing to speciic cells in a spreadsheet or styles in a document (e.g. the user may edit body text but not headings).  &lt;p&gt;The document may be opened by the recipient as usual, but Track Changes or Comments will be enabled and may only be disabled by following the same steps as above, but disabling protection with the password.  &lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt; &lt;p&gt;If you had forgotten to add Track Changes (with a password) to the document that you sent, you can use the Compare option. Open your original document and the one that was edited without changes being tracked. You can then compare the two and produce a version with changes tracked, which you can then proceed to accept or reject as appropriate.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-6370452324159566484?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/3CpEnaJ6f_k" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/04/ms-office-features-for-tracking.aspx</feedburner:origLink></item><item><title>Errors when attempting to run Database Publishing Wizard on a 64-bit Vista machine</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/GPiaeeyUdx8/errors-when-attempting-to-run-database.aspx</link><category>tools</category><category>SQL Server</category><author>noreply@blogger.com (Ted Jardine)</author><pubDate>Wed, 15 Apr 2009 10:44:23 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-2671251715187224642</guid><description>If you're attempting to use Microsoft's &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=56E5B1C5-BF17-42E0-A410-371A838E570A&amp;amp;displaylang=en"&gt;Database Publishing Wizard&lt;/a&gt; you might run into an error like the following (if you're running SQL Server Express 2005 - don't know if you will run into it with SQL Server 2005 Standard etc.):

&lt;blockquote&gt;This wizard will close because it encountered the following error:

Could not load file or assembly 'Microsoft.SqlServer.BatchParser, Version=9.0.242.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified. (Microsoft.SqlServer.ConnectionInfo)&lt;/blockquote&gt;If you do, just download the x64 version of Microsoft SQL Server 2005 Management Objects Collection located &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=d09c1d60-a13c-4479-9b91-9e8b9d835cdc&amp;amp;displaylang=en"&gt;here&lt;/a&gt;. &lt;a href="http://forums.asp.net/t/1348920.aspx"&gt;This post pointed me in the right direction&lt;/a&gt; as the possible solution suggested does in fact resolve the issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-2671251715187224642?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/GPiaeeyUdx8" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/04/errors-when-attempting-to-run-database.aspx</feedburner:origLink></item><item><title>Genie Label Formatting Tricks</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/Wu14GOS3LhM/genie-label-formatting-tricks.aspx</link><category>Inmagic Genie</category><category>inmagic</category><category>label</category><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Tue, 17 Mar 2009 15:21:02 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-1597882397019249032</guid><description>&lt;h3&gt;Item Fields Appear After Catalog Fields&lt;/h3&gt; &lt;p&gt;When defining a catalog label in MyLabels.config, you can pull data from both the Catalog and Items textbases. Data from Items is wrapped in &amp;lt;ItemInfo&amp;gt; tags  &lt;p&gt;e.g. &lt;br&gt;&amp;lt;ItemInfo&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;Field Name="ItemVolume" Header="v." /&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;Field Name="ItemCopyInfo" Header="c." /&amp;gt;&lt;br&gt;&amp;lt;/ItemInfo&amp;gt;  &lt;p&gt;While you can place the ItemInfo section anywhere in the label definition, when the label is rendered on screen or printed, the ItemInfo section will always appear last. It's best to place it last in the config file section as well, so it's clear where it will appear on the label.&lt;/p&gt; &lt;p&gt;If you have a strong need to place some Item fields before or in between Catalog fields, it is possible to subdivide one of the boxes on the labels into smaller boxes, one with the Catalog fields and the other with the Item fields. It takes some dedicated work with a ruler and finessing of the label measurements, some trial and error with the printer, and a dose of patience, but it can be done.&lt;/p&gt; &lt;h3&gt;Limit Number of Words&lt;/h3&gt; &lt;p&gt;If you have a field on the label, such as Title or Subtitle, that tends to have quite a bit of data in it, it may not fit in the available space on the label, and will push other fields down and off the label. One remedy is to limit the amount of data from the field that appears. You can do this by adding this line&lt;/p&gt; &lt;p&gt;UseFunction="NumberOfWords(x)"&lt;/p&gt; &lt;p&gt;to the field (where x is a number).  &lt;p&gt;e.g. &lt;br&gt;&amp;lt;Field Name="CatTitle" Style="font-weight:bold" UseFunction="NumberOfWords(5)" /&amp;gt;  &lt;p&gt;This function is documented in the Inmagic Genie Technical Notes document in relation to the MyReports.config file. However, it works equally well in MyLabels.config. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-1597882397019249032?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/Wu14GOS3LhM" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/03/genie-label-formatting-tricks.aspx</feedburner:origLink></item><item><title>My Software Tools List: What I Put On My Machine</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/qPhwNJkrrPk/my-software-tools-list-what-i-put-on-my.aspx</link><category>tools</category><category>add-ons</category><category>software</category><category>Vista</category><category>utilities</category><category>Firefox</category><author>noreply@blogger.com (Ted Jardine)</author><pubDate>Tue, 10 Mar 2009 15:32:23 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-8893850381010110698</guid><description>&lt;p&gt;&lt;a href="http://www.shopping.hp.com/webapp/shopping/computer_can_series.do?storeName=computer_store&amp;amp;category=notebooks&amp;amp;a1=Brand&amp;amp;v1=HP+HDX&amp;amp;series_name=HDX18t_series" target="_blank"&gt;My new laptop&lt;/a&gt; should arrive any day now (yay! It just came!), so in preparation for setting it all up again, here's my list of everything I'll put on it (in the spirit of &lt;a href="http://www.hanselman.com/tools" target="_blank"&gt;Scott Hanselman's excellent "Ultimate Developer and Power Users Tool List for Windows"&lt;/a&gt;):&lt;/p&gt; &lt;h2&gt;Standard Fare and Utilities&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;font color="#3f3f3f"&gt;Windows Vista Ultimate (and soon Windows 7)&lt;br&gt;&lt;em&gt;I'd put the Beta on now, but that means a repave would come too soon.&lt;/em&gt;&lt;/font&gt;  &lt;li&gt;&lt;font color="#3f3f3f"&gt;&lt;a href="http://www.executor.dk/" target="_blank"&gt;Executor&lt;/a&gt;&lt;br&gt;&lt;em&gt;I bind it to Win-A and instantly have the best application launcher out there for Windows. Almost as pretty as &lt;/em&gt;&lt;a href="http://www.launchy.net/" target="_blank"&gt;&lt;em&gt;Launchy&lt;/em&gt;&lt;/a&gt;&lt;em&gt; and &lt;a href="http://www.humanized.com/" target="_blank"&gt;Enso&lt;/a&gt; (well, not quite, but we can't be too picky) and even more functional than &lt;/em&gt;&lt;a href="http://www.bayden.com/SlickRun/" target="_blank"&gt;&lt;em&gt;SlickRun&lt;/em&gt;&lt;/a&gt;&lt;em&gt;. After first trying it, it promptly became my launcher of choice; it's ridiculous how much you can do with it.&lt;/em&gt;&lt;/font&gt;  &lt;li&gt;&lt;font color="#3f3f3f"&gt;&lt;a href="http://www.realtimesoft.com/ultramon/" target="_blank"&gt;Ultramon&lt;/a&gt;&lt;br&gt;&lt;em&gt;Absolutely necessary when running multi-monitors (latest beta works without issues). &lt;/em&gt;&lt;a href="http://www.binaryfortress.com/displayfusion/" target="_blank"&gt;&lt;em&gt;DisplayFusion&lt;/em&gt;&lt;/a&gt;&lt;em&gt; looks good as well so I'm actually going to try it out as it's the first legitimate competitor I've seen for Ultramon in all the years I've used it.&lt;/em&gt;&lt;/font&gt;  &lt;li&gt;&lt;font color="#3f3f3f"&gt;&lt;a href="http://www.roboform.com/" target="_blank"&gt;Roboform&lt;/a&gt;&lt;br&gt;Phenomenal way to securely store and use login credentials and software codes, and autofill registration and checkout forms (including credit card information). Expensive but worth it. I've also been trying out &lt;a href="https://lastpass.com/" target="_blank"&gt;LastPass&lt;/a&gt; on my netbook. RoboForm's usability is a tiny bit better (for i.e. keyboard shortcuts are better, especially for initial login) and it is more secure because data is only stored locally (which I use Windows Live Sync - see below - to synchronize between multiple machines), but LastPass has the huge convenience of having a central repository so that data is instantly synced between all machines (including the ability to get access from other machines, including public ones where you can &lt;a href="https://lastpass.com/help.php?topic=otp&amp;amp;fromwebsite=1" target="_blank"&gt;utilize one time login credentials&lt;/a&gt; for greater security). Oh, and LastPass if free. Regardless, use something and create strong passwords.&lt;/font&gt;  &lt;li&gt;&lt;font color="#3f3f3f"&gt;&lt;a href="http://www.bluemars.org/clipx/" target="_blank"&gt;ClipX&lt;/a&gt;&lt;br&gt;&lt;em&gt;Tiny clipboard history manager. I've been using the beta x86 version with very few glitches for a long time now. Will be using the x64 beta on the new machine.&lt;/em&gt;&lt;/font&gt;  &lt;li&gt;&lt;a href="https://www.foldershare.com/" target="_blank"&gt;Windows Live Sync&lt;/a&gt; (aka FolderShare)&lt;br&gt;&lt;em&gt;Great way to securely sync files between your different machines, and if wanted, between different users. I use it to sync RoboForm data, YNAB data, and more.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.techsmith.com/screen-capture.asp" target="_blank"&gt;SnagIt&lt;/a&gt;&lt;br&gt;&lt;em&gt;Screen capturing software. When Peter first told me how much he loved it, I guffawed and told him it was screen capturing software! How could it be worth $50 USD?!? (even more in beaver bucks). But I tried out the trial and...well, me of so little faith: Peter was right. Phenomenal piece of software that I promptly purchased (do a google for a coupon codes for a price reduction).&lt;/em&gt;  &lt;li&gt;&lt;a href="http://notepad-plus.sourceforge.net/uk/site.htm" target="_blank"&gt;Notepad++&lt;/a&gt;  &lt;li&gt;Microsoft Office 2007  &lt;li&gt;QuickBooks&lt;br&gt;&lt;em&gt;Someday there will be a replacement for this software that seems stuck back in the 90's, but until there is, couldn't live without it even though it regularly contributes to a receding hair line (I am so thankful I am not a bookkeeper and I raise my glass to the wonderful bookkeepers in my life: Pat and &lt;/em&gt;&lt;a href="http://www.hilltopbookkeeping.com/" target="_blank"&gt;&lt;em&gt;Maxine&lt;/em&gt;&lt;/a&gt;&lt;em&gt;).&lt;/em&gt;  &lt;li&gt;&lt;a href="http://mozy.com/" target="_blank"&gt;Mozy&lt;/a&gt;&lt;br&gt;&lt;em&gt;Please backup, backup often, and backup off-site. Mozy makes the process easier, although I think I'll be trying out &lt;/em&gt;&lt;a href="http://www.idrive.com/" target="_blank"&gt;&lt;em&gt;IDrive&lt;/em&gt;&lt;/a&gt;&lt;em&gt; this time around because of many additional features including its ability to synchronize multiple machines to local media (external USB drive) which then syncs up online. I've got ~90GB of data so I'm hoping the synchronization process is a little faster with IDrive (Mozy churns away "replicating splines" when determining what of my local 90GB of data has changed/been added - apparently that's some sci-fi reference). Regardless, both are dirt cheap for personal home use (unlimited for $4.95/month with yearly discounts available). Eventually I'll get a &lt;/em&gt;&lt;a href="http://www.microsoft.com/windows/products/winfamily/windowshomeserver/default.mspx" target="_blank"&gt;&lt;em&gt;Windows Home Server&lt;/em&gt;&lt;/a&gt;&lt;em&gt; configured too, which will be even better!&lt;/em&gt;  &lt;li&gt;&lt;a href="http://download.live.com/?sku=messenger" target="_blank"&gt;Windows Live Messenger (aka MSN Messenger)&lt;/a&gt;&lt;br&gt;&lt;em&gt;Someday I'll find an alternative that works well (have tried &lt;/em&gt;&lt;a href="http://www.andornot.com/about/developerblog/2008/03/pidgin-and-toasters.aspx" target="_blank"&gt;&lt;em&gt;Trillian and Pidgin&lt;/em&gt;&lt;/a&gt;&lt;em&gt;, but both have bigger shortcomings either in usability or stability). At least there's a registry hack you can do to remove the ads in Windows Live Messenger (no, I am still not interested in "Singles in Surrey").&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.7-zip.org/" target="_blank"&gt;7-zip&lt;/a&gt;&lt;br&gt;&lt;em&gt;Great file compression (that can also read and write to RAR and ZIP).&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.randyrants.com/sharpkeys/" target="_blank"&gt;SharpKeys&lt;/a&gt;&lt;br&gt;&lt;em&gt;A registry hack that is used to make certain keys on a keyboard act like other keys. I use this to map unused keys on my Apple keyboard to something more useful:&lt;/em&gt;  &lt;ul&gt; &lt;li&gt;&lt;em&gt;f13: Print Screen (used all the time with SnagIt)&lt;/em&gt;  &lt;li&gt;&lt;em&gt;f14: Insert&lt;/em&gt;  &lt;li&gt;&lt;em&gt;f16: Mute&lt;/em&gt;  &lt;li&gt;&lt;em&gt;f17: Volume Down&lt;/em&gt;  &lt;li&gt;&lt;em&gt;f18: Volume Up&lt;/em&gt;  &lt;li&gt;&lt;em&gt;f19: Calculator&lt;/em&gt;  &lt;li&gt;&lt;em&gt;Right-Ctrl: Application Menu&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;li&gt;&lt;a href="http://insentient.net/" target="_blank"&gt;Switcher&lt;/a&gt;&lt;br&gt;&lt;em&gt;What Vista should have done for its Alt-Tab implementation.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.youneedabudget.com/features/" target="_blank"&gt;YNAB Pro&lt;/a&gt;&lt;br&gt;&lt;em&gt;Budgeting software that just works.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.skype.com" target="_blank"&gt;Skype&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.pantone.com/Pages/products/product.aspx?pid=562" target="_blank"&gt;Pantone Huey PRO&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.utorrent.com/" target="_blank"&gt;µTorrent&lt;/a&gt;&lt;br&gt;BitTorrent client.  &lt;li&gt;&lt;a href="http://www.ted.nu/" target="_blank"&gt;ted&lt;/a&gt;&lt;br&gt;Torrent Episode Downloader with a great name ;-)  &lt;li&gt;&lt;a href="http://www.andornot.com/about/developerblog/2009/03/startup-delayer-get-working-faster.aspx" target="_blank"&gt;Startup Delayer&lt;/a&gt;  &lt;li&gt;&lt;a href="http://windowslivewriter.spaces.live.com/" target="_blank"&gt;Windows Live Writer&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.free-codecs.com/download/K_Lite_Codec_Pack.htm" target="_blank"&gt;ffdshow and K-Lite Codec Pack&lt;/a&gt;&lt;br&gt;&lt;em&gt;Just use this codec pack to cover pretty much any codec you need to view or listen to digital media.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.plaxo.com/" target="_blank"&gt;Plaxo&lt;/a&gt;&lt;br&gt;&lt;em&gt;Used to sync contacts and calendar with all other machines for accounts other than Exchange.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.acronis.com/" target="_blank"&gt;Acronis TrueImage&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Development&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Microsoft Visual Studio 2008 Professional  &lt;li&gt;&lt;a href="http://www.jetbrains.com/resharper/" target="_blank"&gt;Resharper&lt;/a&gt;&lt;br&gt;&lt;em&gt;Friends don't let friends develop without it.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://subversion.tigris.org/" target="_blank"&gt;Subversion&lt;/a&gt;, &lt;a href="http://tortoisesvn.tigris.org/" target="_blank"&gt;TortoiseSVN&lt;/a&gt;, and &lt;a href="http://www.visualsvn.com/visualsvn/" target="_blank"&gt;VisualSVN&lt;/a&gt;&lt;br&gt;&lt;em&gt;I'd like to say something about this combo, but words fail me.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.roland-weigelt.de/ghostdoc/" target="_blank"&gt;GhostDoc&lt;/a&gt;&lt;br&gt;&lt;em&gt;Free add-in for visual Studio that automatically generates XML documentation comments for C#.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://vmware.com/products/player/" target="_blank"&gt;VMWare Player&lt;/a&gt;/&lt;a href="http://vmware.com/products/ws/" target="_blank"&gt;VMWare Workstation&lt;/a&gt;&lt;br&gt;&lt;em&gt;The former is free, and the latter is expensive. The latter also makes like easier, but you can hack things (legally of course) to get the player to do what you need it to. There wouldn't be a dilemma except for the fact that the player is prettier and has Unity (where the guest application windows look just like host application windows, but with color-coded borders - much easier to tab through applications while developing)! Unity is in Beta for Windows right now, so once it's out of beta, I guess I'll go for less pretty with more functionality (and the relatively hefty price tag).&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.gallio.org/" target="_blank"&gt;Gallio&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.testdriven.net/" target="_blank"&gt;TestDriven.NET&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.red-gate.com/Products/ants_profiler/index.htm" target="_blank"&gt;ANTS Profiler&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.microsoft.com/windows/downloads/virtualpc/default.mspx" target="_blank"&gt;Microsoft Virtual PC&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;.NET Reflector&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.adobe.com/products/creativesuite/design/" target="_blank"&gt;Adobe Creative Suite Design Premium&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.autohotkey.com/" target="_blank"&gt;AutoHotKey&lt;/a&gt;  &lt;li&gt;&lt;a href="http://www.nhprof.com/" target="_blank"&gt;NH Prof&lt;/a&gt;&lt;br&gt;&lt;em&gt;If you do anything at all with NHibernate, just buy this (beta promotional pricing still in affect).&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.scootersoftware.com/" target="_blank"&gt;Beyond Compare 3&lt;/a&gt;&lt;br&gt;&lt;em&gt;Another "just buy it" bit of software. I got a discount coupon through &lt;a href="http://www.donationcoder.com/" target="_blank"&gt;DonationCoder.com&lt;/a&gt; that is no longer there, but hopefully will return.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.regexbuddy.com/" target="_blank"&gt;RegexBuddy&lt;/a&gt;&lt;br&gt;&lt;em&gt;If you do anything with Regex, have mercy on yourself and buy this. Worth every penny.&lt;/em&gt;  &lt;li&gt;SQL Server  &lt;li&gt;&lt;a href="http://www.oracle.com/technology/tech/windows/odpnet/index.html" target="_blank"&gt;Oracle .NET Client&lt;/a&gt;  &lt;li&gt;And more of the usual...&lt;/li&gt;&lt;/ul&gt; &lt;h2&gt;Firefox and Add-Ons&lt;/h2&gt; &lt;p&gt;Deserves a section all to itself.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843" target="_blank"&gt;Firebug&lt;/a&gt;&lt;br&gt;&lt;em&gt;As they say, "Web Development Evolved"&lt;/em&gt;  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5369" target="_blank"&gt;YSlow&lt;/a&gt;&lt;br&gt;&lt;em&gt;Not only does it analyze web pages and help point out why they're slow, it also provides an easy way to view file references &lt;/em&gt; &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60" target="_blank"&gt;Web Developer&lt;/a&gt;  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3615" target="_blank"&gt;Delicious Bookmarks&lt;/a&gt;&lt;br&gt;&lt;em&gt;I'm kind of lost without this add-on. You can get it working with Google Chrome if you want too (and IE is supported).&lt;/em&gt;  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748" target="_blank"&gt;Greasemonkey&lt;/a&gt;&lt;br&gt;&lt;em&gt;Manages user scripts for firefox so that you can make a site, for i.e. Google Reader, look the way you want it to. For my Asus EEE PC, I use the &lt;a href="http://userstyles.org/styles/12691" target="_blank"&gt;"Google Reader Absolutely Compact" script&lt;/a&gt; to make the best use of the netbook's smaller screen.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://www.andornot.com/about/developerblog/2008/12/hit-hint-replacement-lol-fork-of-hah.aspx" target="_blank"&gt;LoL&lt;/a&gt;&lt;br&gt;Mouseless browsing.  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4762" target="_blank"&gt;Hide MenuBar&lt;/a&gt;&lt;br&gt;Hides the menu bar which is a complete waste of screen space (and still easily available by pressing the Alt key)  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/4014" target="_blank"&gt;Locationbar²&lt;/a&gt;&lt;br&gt;Formats and linkifies addresses in your address bar.  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/684" target="_blank"&gt;FireFTP&lt;/a&gt;&lt;br&gt;&lt;em&gt;FTP client integrated with the browser.&lt;/em&gt;  &lt;li&gt;&lt;a href="http://downloadstatusbar.mozdev.org/index.html" target="_blank"&gt;Download Statusbar&lt;/a&gt;  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/9403" target="_blank"&gt;SenSEO&lt;/a&gt;  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8160" target="_blank"&gt;jQuery Menu&lt;/a&gt;  &lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3653" target="_blank"&gt;Canadian English Dictionary&lt;/a&gt;&lt;br&gt;Hosehead is a word, eh!&lt;/li&gt;&lt;/ul&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-8893850381010110698?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/qPhwNJkrrPk" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/03/my-software-tools-list-what-i-put-on-my.aspx</feedburner:origLink></item><item><title>really truly private variables in javascript</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/z34iB4oUrkU/really-truly-private-variables-in.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Mon, 09 Mar 2009 09:09:17 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-6818423450108603024</guid><description>&lt;p&gt;I just read, and then for good measure re-read, &amp;quot;&lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742"&gt;JavaScript: The Good Parts&lt;/a&gt;&amp;quot; by &lt;a href="http://www.crockford.com/"&gt;Douglas Crockford&lt;/a&gt;, who is probably the foremost javascript authority on planet Earth. The book blew my mind. I thought I knew javascript; I thought I had a pretty good grasp of it; before I picked up this book I would have referred to myself as a javascript &lt;em&gt;expert&lt;/em&gt; when introducing myself at parties. It turns out I had a lot more to think about. I find this delightful.&lt;/p&gt;  &lt;p&gt;One of the valuable lessons I learned is a javascript module pattern, discussed with examples at the YUI (Yahoo! User Interface) blog: &lt;a href="http://yuiblog.com/blog/2007/06/12/module-pattern/"&gt;http://yuiblog.com/blog/2007/06/12/module-pattern/&lt;/a&gt;. The take home message is that you can create objects that support private members. I didn't even know that was possible, but it turns out that it is, due to &lt;a href="http://www.robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/"&gt;function scope and the concept of closure&lt;/a&gt;. It took me a few reads with furrowed brow to grok closure, so I can hardly explain it quickly, but essentially:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;A function can return a function and then wink out of existence.&lt;/li&gt;    &lt;li&gt;The returned inner function retains access to other members and data defined in its original parent function.&lt;/li&gt;    &lt;li&gt;Those other members and data are not directly accessible anymore, so they are private.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Fantastic.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-6818423450108603024?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/z34iB4oUrkU" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/03/really-truly-private-variables-in.aspx</feedburner:origLink></item><item><title>Visual Studio 2008 SP1 acting very intoxicated when attempting to step through a debug session</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/rCn4PkCEcw8/visual-studio-2008-sp1-acting-very.aspx</link><category>Visual Studio 2008 SP1</category><category>Visual Studio 2008</category><category>bug</category><author>noreply@blogger.com (Ted Jardine)</author><pubDate>Wed, 04 Mar 2009 16:50:44 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-5630284716710972734</guid><description>&lt;p&gt;I...really...thought...I...was...going...crazy. For some reason Visual Studio started to behave &lt;em&gt;very&lt;/em&gt; abnormally when attempting to debug and step through some code. When I asked it to step through, it stepped out. When I asked it to step out, it stepped in. Half the time it would ignore breakpoints, the other half of the time, it would make some up. To keep me on my toes, it just worked enough to make me think that the problem lay with me. An hour later, after (in completely random order):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Rebooting&lt;/li&gt; &lt;li&gt;Rebuilding&lt;/li&gt; &lt;li&gt;Rebuilding after cleaning a build&lt;/li&gt; &lt;li&gt;Googling "Visual Studio acting crazy while debugging" and other sundry queries&lt;/li&gt; &lt;li&gt;Cleaning out the keyboard (and thinking "oh no, &lt;a href="http://www.apple.com/keyboard/" target="_blank"&gt;my favourite keyboard&lt;/a&gt; is biting the dust &lt;a href="http://www.engadget.com/2009/03/03/apple-axes-the-numeric-keypad-on-imacs-standard-wired-keyboard/" target="_blank"&gt;just as Steve Jobs decides to chop off the numberpad&lt;/a&gt;" - yes, I know you can still get the old one, but...)&lt;/li&gt; &lt;li&gt;Clearing out ReSharper caches &lt;/li&gt; &lt;li&gt;Clearing out ASP.NET caches&lt;/li&gt; &lt;li&gt;Using the mouse to debug (how anybody does that is beyond me)&lt;/li&gt; &lt;li&gt;Rewriting code &lt;/li&gt; &lt;li&gt;Staring at the screen literally thinking I was going crazy&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;...I stumbled across this "&lt;a href="http://www.rp2c.com/blogofbob/VisualStudio2008SP1FunkyDebugSteppingAndMissedBreakpoints.aspx" target="_blank"&gt;Visual Studio 2008 SP1 Funky Debug Stepping and Missed Breakpoints&lt;/a&gt;" post from a &lt;a href="http://www.rp2c.com/blogofbob/" target="_blank"&gt;BlogOfBob&lt;/a&gt;. Yes, Visual Studio was drunk and &lt;a href="http://code.msdn.microsoft.com/KB957912/Release/ProjectReleases.aspx?ReleaseId=1796" target="_blank"&gt;MS has the fix&lt;/a&gt;. Now to undo the carnage: thank goodness for &lt;a href="http://subversion.tigris.org/" target="_blank"&gt;subversion&lt;/a&gt;; and whoever you are Bob, God bless you.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-5630284716710972734?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/rCn4PkCEcw8" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/03/visual-studio-2008-sp1-acting-very.aspx</feedburner:origLink></item><item><title>Inmagic Webpublisher and character encoding</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/k6cbP-kd5zw/inmagic-webpublisher-and-character.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Wed, 04 Mar 2009 13:49:38 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-4886752380012103820</guid><description>&lt;p&gt;There is a lot of potentially confusing information when speaking of character sets and encodings, so here's how it all relates to Inmagic DB/Text and Webpublisher, according to my understanding.&lt;/p&gt;  &lt;p&gt;Inmagic DB/Text supports the western Latin character set, which covers the characters used in Western European languages. (All the characters you would find in &lt;a href="http://en.wikipedia.org/wiki/Extended_ASCII"&gt;ANSI/ASCII&lt;/a&gt;.) It does not support &lt;a href="http://en.wikipedia.org/wiki/Unicode"&gt;Unicode&lt;/a&gt;, which is the Ultimate Character Set For Every Character Ever Conceived, Even Klingon.&lt;/p&gt;  &lt;p&gt;Inmagic Webpublisher supports two types of character encoding: &lt;a href="http://en.wikipedia.org/wiki/Iso-8859-1"&gt;ISO-8859-1&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Utf-8"&gt;UTF-8&lt;/a&gt;. Encodings are computer representations of character sets. ISO-8859-1 encodes just the western Latin character set, while UTF-8 encodes the western Latin character set plus the rest of Unicode. Thus you can ask Webpublisher to encode DB/Text data output to the browser in either. &lt;/p&gt;  &lt;p&gt;The de facto standard for web pages these days is UTF-8 encoding, for the obvious reason that it supports the widest possible range of characters. The browser is dependent on the web page itself to tell it what encoding is acceptable. If the web page is remiss in sending encoding instructions, then the browser is forced to fall back to a default position, which may differ from browser to browser. (Especially old browsers.) But that would only be the case for a web page or website that is not well designed! A good design completely controls the encoding: from the encoding a web page file is saved in, to the content-type header the HTTP server emits, which must match! A meta tag that sets content-type only matters in offline viewing.&lt;/p&gt;  &lt;p&gt;Webpublisher serves up data dynamically, so there is no web page file to worry about. However, it does by default encode with ISO-8859-1, and one must explicitly tell it to encode with UTF-8 if that is desired.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Query string parameters that govern encoding&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;OEH=UTF-8 (&lt;a href="http://andornot.com/dbtw-wpd/exec/dbtwpub.dll?ac=query&amp;amp;tn=cars&amp;amp;qy=findall&amp;amp;mr=1&amp;amp;oeh=UTF-8"&gt;cars query example&lt;/a&gt;)    &lt;br /&gt;This query string parameter tells Webpublisher to emit HTML encoded in UTF-8. Sure enough, Webpublisher adds a content-type header set to &amp;quot;text/html; charset=UTF-8&amp;quot;. Interestingly, Webpublisher does not set any content-type header by default for HTML, so it's best to always supply an OEH value.&lt;/p&gt;  &lt;p&gt;OEX=UTF-8 (&lt;a href="http://andornot.com/dbtw-wpd/exec/dbtwpub.dll?ac=query&amp;amp;tn=cars&amp;amp;qy=findall&amp;amp;mr=1&amp;amp;oex=UTF-8&amp;amp;xm=1"&gt;cars query example&lt;/a&gt;)    &lt;br /&gt;This query string parameter tells Webpublisher to emit XML encoded in UTF-8. Webpublisher correctly sets the encoding attribute on the xml tag to &amp;lt;?xml encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;. However, it also adds a content-type header set to &amp;quot;text/xml; charset=ISO-8859-1&amp;quot; on every XML response, regardless of OEX value, which appears to be incorrect.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Further reading:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The Definitive Guide to Web Character Encoding&lt;/em&gt; by Tommy Olsson (2007)    &lt;br /&gt;&lt;a title="http://www.sitepoint.com/article/guide-web-character-encoding/" href="http://www.sitepoint.com/article/guide-web-character-encoding/"&gt;http://www.sitepoint.com/article/guide-web-character-encoding/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)&lt;/em&gt; by Joel Spolsky (2003)    &lt;br /&gt;&lt;a title="http://www.joelonsoftware.com/articles/Unicode.html" href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;http://www.joelonsoftware.com/articles/Unicode.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Presto&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Inmagic &lt;a href="http://www.inmagic.com/products/Presto/"&gt;Presto&lt;/a&gt; supports Unicode, and defaults to UTF-8 encoding. Yay!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-4886752380012103820?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/k6cbP-kd5zw" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/03/inmagic-webpublisher-and-character.aspx</feedburner:origLink></item><item><title>Startup Delayer: Get Windows up and running faster</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/84tGvJt8gbI/startup-delayer-get-working-faster.aspx</link><category>tools</category><category>utilities</category><author>noreply@blogger.com (Ted Jardine)</author><pubDate>Mon, 02 Mar 2009 11:09:09 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-3930891241192268882</guid><description>&lt;p&gt;&lt;a href="http://simpable.com/software/startup-delayer/"&gt;Found this great utility through Scott Watermasysk's&lt;/a&gt; blog: &lt;a title="Startup Delayer" href="http://www.r2.com.au/software.php?page=2&amp;amp;show=startdelay"&gt;Startup Delayer&lt;/a&gt;. I quote:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;When Windows loads it's [&lt;em&gt;sic&lt;/em&gt;] Startup file, it attempts to load every program in there at the same time. Therefore if you have quite a lot of programs starting when Windows starts, each program will try and grab CPU time so that it can load.  &lt;p&gt;If each program tries to do this at the same time, you soon notice the slow down that occurs, due to your CPU trying to help all the programs to load, and your hard disk accessing multiple files.  &lt;p&gt;Startup Delayer allows you to setup how many seconds after Windows has started, to load each program.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Works just as advertised. Just configure it to get those slow loading applications (Skype anyone?) to load up at a later time and save your quad-core from thrashing.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/StartupDelayerGetworkingfaster_9B65/StartupDelayerConfiguration.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Startup-Delayer-Configuration" src="http://www.andornot.com/about/developerblog/uploaded_images/StartupDelayerGetworkingfaster_9B65/StartupDelayerConfiguration_thumb.png" width="404" height="176"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can configure it to just work in the background, or with a visual GUI:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/StartupDelayerGetworkingfaster_9B65/StartupDelayer.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; border-top: 0px; border-right: 0px" border="0" alt="Startup-Delayer" src="http://www.andornot.com/about/developerblog/uploaded_images/StartupDelayerGetworkingfaster_9B65/StartupDelayer_thumb.png" width="400" height="63"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There's even an auto-config option to have everything in your startup menu startup at a set interval (say 10 seconds). Couldn't be easier or more effective so definitely worth the download (and works on XP and Vista). &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-3930891241192268882?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/84tGvJt8gbI" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/03/startup-delayer-get-working-faster.aspx</feedburner:origLink></item><item><title>Turning Carriage Return / Line Feeds into HTML Line Breaks in Inmagic Genie</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/2oVmQMONYt0/turning-carriage-return-line-feeds-into.aspx</link><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Wed, 25 Feb 2009 15:07:55 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-4598513860367426833</guid><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;If you have imported information into Genie from another source, using TextWorks or the importer, or typed it in directly in TextWorks, you may have lines of text that are separated only by line feeds, rather than entered as subfields.&amp;nbsp; They may have appeared to have the correct layout in TextWorks, but when displayed on the web in Genie, may appear to run together.  &lt;p&gt;For example, text that started out like this: &lt;p&gt;Contents  &lt;p&gt;Chapter 1: Feasibility  &lt;p&gt;Chapter 2: Accountability  &lt;p&gt;Chapter 3: Operational Issues  &lt;p&gt;may appear online as:  &lt;p&gt;ContentsChapter 1: FeasibilityChapter 2: AccountabilityChapter 3: Operational Issues  &lt;p&gt;To have this appear as intended in Genie, you could edit each record individually in the Genie Catalog, but a faster way is to use TextWorks to Batch Replace those line breaks with subfield marks. (You will need to have access to the TextWorks Windows client to do this) . &lt;p&gt;To do this:  &lt;p&gt;1. In TextWorks, search for all records with data in the field requiring modification, using the * wildcard in that field.  &lt;p&gt;2. Select Records &amp;gt; Batch Modify from the TextWorks menu.  &lt;p&gt;3. Complete the Batch Modify dialogue as follows:  &lt;ul&gt; &lt;li&gt;Field to Modify: select the field requiring modification  &lt;li&gt;Operation: "Substitute Text"  &lt;li&gt;Affects: Matching  &lt;li&gt;Find What: {LF}  &lt;li&gt;Replace With: {SF} &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;{LF} represents a line feed or paragraph break. {SF} represents a subfield indicator.  &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/TurningLineFeedsintoHTMLLineBreaksinInma_10FDA/image_3.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="314" alt="image" src="http://www.andornot.com/about/developerblog/uploaded_images/TurningLineFeedsintoHTMLLineBreaksinInma_10FDA/image_thumb_3.png" width="350" border="0"&gt;&lt;/a&gt;  &lt;p&gt;4. Perform the batch modification to change all occurrences of the line feed character in the selected field in the selected records to a subfield indicator, then check the results in Genie.  &lt;p&gt;&lt;b&gt;Note&lt;/b&gt;: If you are at all in doubt about the batch modification process, backup your complete database before making any changes. &lt;/p&gt; &lt;p&gt;Next, you would edit the MyReports.config configuration file. In this file, find the OPACFull report and the relevant field within that report definition, and add the following line:  &lt;p&gt;Separator="&amp;amp;lt;br/&amp;amp;gt;"  &lt;p&gt;e.g. &amp;lt;Field Name="CatAbstract" Separator="&amp;amp;lt;br/&amp;amp;gt;"/&amp;gt;  &lt;p&gt;This causes every subfield to be separated with the &amp;lt;br/&amp;gt; tag. Repeat for the CatalogFull report and any other reports in which this field appears.  &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/TurningLineFeedsintoHTMLLineBreaksinInma_10FDA/image.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="128" alt="image" src="http://www.andornot.com/about/developerblog/uploaded_images/TurningLineFeedsintoHTMLLineBreaksinInma_10FDA/image_thumb.png" width="394" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Another option in Genie is to edit the MyReports.config file to wrap the field in &amp;lt;pre&amp;gt; tags, which causes the text to display exactly as entered, without the use of subfields. The disadvantage of this approach is that the text will appear in a fixed-width font and long lines will not wrap. If you wish to try this, edit the field definition as described above, in MyReports.config, to add &lt;/p&gt; &lt;p&gt;Header="&amp;amp;lt;pre&amp;amp;gt;"and Footer="&amp;amp;lt;/pre&amp;amp;gt;"  &lt;p&gt;e.g. &amp;lt;Field Name="CatAbstract" Header="&amp;amp;lt;pre&amp;amp;gt;" Footer="&amp;amp;lt;/pre&amp;amp;gt;"/&amp;gt;  &lt;p&gt;and see if you like this look in Genie.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-4598513860367426833?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/2oVmQMONYt0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/02/turning-carriage-return-line-feeds-into.aspx</feedburner:origLink></item><item><title>Fix CSS positioning and floats in IE</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/wJDg_ieVphI/fix-css-positioning-and-floats-in-ie.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Fri, 20 Feb 2009 13:15:20 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-3472469421682263968</guid><description>&lt;p&gt;I run into CSS position problems with IE6 every so often when using elements that float, or with position:absolute inside a position:relative parent. Not so often that I immediately recall how to fix it, of course, and each time the problem crops up it's just different enough from last time to appear as a separate and unrelated problem. Here's hoping that writing it down will make it stick. And of course, I get some catharsis in pointing a hysterical finger at that Great Satan behind all the problems, &lt;em&gt;IE6 itself&lt;/em&gt;, which &lt;a href="http://blog.wired.com/business/2009/02/norwegian-websi.html"&gt;Norway has declared war on&lt;/a&gt;. I'm cheering for Norway, but IE6 has all the staying power and good looks of the cockroach, so I rather suspect it will smugly survive the Norwegian Gambit and become the official browser of the post-nuclear-exchange web.&lt;/p&gt;  &lt;p&gt;The best description I've ever read of IE's layout deficiencies are covered in depth in the &amp;quot;&lt;a href="http://www.satzansatz.de/cssd/onhavinglayout.html"&gt;On having layout&lt;/a&gt;&amp;quot; article at &lt;a title="http://www.satzansatz.de/cssd/onhavinglayout.html" href="http://www.satzansatz.de/cssd/onhavinglayout.html"&gt;http://www.satzansatz.de/cssd/onhavinglayout.html&lt;/a&gt;, but for those who are more interested in applying the fix quickly without whys and wherefores, here it is: force the element to have &amp;quot;layout&amp;quot; by applying a width or height. There is more than one way to do this, but the following fulfills my needs.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Part One - zoom:1&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms531189.aspx"&gt;Zoom&lt;/a&gt; is an MS proprietary CSS property that forces layout to any element in IE5.5+. Hide zoom with conditional comments if you want the CSS to validate. Doesn't work on IE5.0.&lt;/p&gt;  &lt;div&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;!--[if lte IE 7]&amp;gt;&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #008000"&gt;    .someElement { zoom:1; }&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #008000"&gt;&amp;lt;/style&amp;gt;&amp;lt;![endif]--&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         &lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;More info in the &amp;quot;On having layout&amp;quot; article on &lt;a href="http://www.satzansatz.de/cssd/onhavinglayout.html#hackmanagement"&gt;hack management&lt;/a&gt;: &lt;a title="http://www.satzansatz.de/cssd/onhavinglayout.html#hackmanagement" href="http://www.satzansatz.de/cssd/onhavinglayout.html#hackmanagement"&gt;http://www.satzansatz.de/cssd/onhavinglayout.html#hackmanagement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part Two - Standards Mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This should really be part one. Do not allow your website to render in &lt;a href="http://www.quirksmode.org/css/quirksmode.html"&gt;quirks mode&lt;/a&gt;! Choose and use a valid doctype &lt;em&gt;before&lt;/em&gt; designing your layout so that all browsers render your pages in standards mode. Else you really cannot count on this fix or any other. Unless of course you are designing your site to only be viewed in IE6 come the onset of that nuclear winter, in which case you will also want to consider the usability requirements of your primary end user: the cockroach.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-3472469421682263968?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/wJDg_ieVphI" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/02/fix-css-positioning-and-floats-in-ie.aspx</feedburner:origLink></item><item><title>Importing biblios.net records into Inmagic Genie</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/Wb5Ut_aKEyI/importing-bibliosnet-records-into.aspx</link><category>Inmagic Genie</category><author>noreply@blogger.com (Kathy Bryce)</author><pubDate>Sun, 01 Feb 2009 22:43:51 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-7895769587571677589</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://biblios.net/home" target="_blank"&gt;&amp;Dagger;biblios.net&lt;/a&gt;&lt;/strong&gt; from LibLime was &lt;a href="http://liblime.com/news-items/press-releases/announcing-biblios-net-the-worlds-largest-database-of-freely-licensed-library-records/" target="_blank"&gt;launched&lt;/a&gt; at the ALA Midwinter meeting in Denver last week. It is a free browser-based cataloging service with a data store containing over &lt;a href="$biblios_net.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; margin: 10px 10px 10px 0px; border-left: 0px; border-bottom: 0px" height="150" alt="biblios_net" src="http://www.andornot.com/about/developerblog/uploaded_images/Importingbibl.netrecordsintoInmagicGenie_EC02/biblios_net_thumb.jpg" width="244" align="left" border="0"&gt;&lt;/a&gt; 30 million records. Records are licensed under the Open Data Commons, making the service the world's largest repository of freely-licensed library records.&amp;nbsp; For additional information you can also listen to a &lt;a href="http://blogs.talis.com/panlibus/archives/2009/01/bibliosnet-free-cataloguing.php" target="_blank"&gt;podcast&lt;/a&gt; with the LibLime CEO, Josh Ferraro.&lt;a href="http://liblime.com/about/management"&gt;&lt;/p&gt;&lt;/a&gt; &lt;p&gt;The site features a very clean, easy to use interface with options to select target libraries and refine search results by authors, publishers, subjects and dates. &amp;Dagger;biblios.net also offers the ability to export records in MARC XML, and in my tests so far, this data imports nicely into &lt;em&gt;Genie&lt;/em&gt; in the Inmagic Library Suite. To see the level of detail in the default upload, check out our &lt;a href="http://192.168.0.221/InmagicGenie/opac.aspx?QueryScreen=opac_search" target="_blank"&gt;Genie demo site&lt;/a&gt; and search for "Torts" in the Anyword box.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;The built in ability in &lt;em&gt;Genie&lt;/em&gt; to upload &lt;a href="http://www.webclarity.info/" target="_blank"&gt;BookWhere&lt;/a&gt; generated MARC XML can be used to also upload &amp;Dagger;biblios.net records. BookWhere users will miss features such as the rating of the quality of the MARC records. However &amp;Dagger;biblios.net provides libraries that don't use BookWhere with another option for obtaining high quality catalog records.&amp;nbsp; As for BookWhere records, the XSL file included with &lt;em&gt;Genie&lt;/em&gt; can be modified to include additional MARC fields if needed, for example no call numbers are added by default, but the XSL can be edited to add whichever MARC tag is appropriate for the classification scheme in use.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://liblime.com/about/management"&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-7895769587571677589?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/Wb5Ut_aKEyI" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/02/importing-bibliosnet-records-into.aspx</feedburner:origLink></item><item><title>All About Favicons</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/oYOxVfWurwk/all-about-favicons.aspx</link><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Wed, 28 Jan 2009 16:34:46 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-6208048821748464160</guid><description>&lt;p&gt;Y'know those small images that appear in your web browser's address bar as you move from site to site? Or that appear in your list of favourites or bookmarks next to each site?  &lt;p&gt;&amp;nbsp;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/AllAboutFavicons_8793/favicons3.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="61" alt="favicons3" src="http://www.andornot.com/about/developerblog/uploaded_images/AllAboutFavicons_8793/favicons3_thumb.jpg" width="398" border="0"&gt;&lt;/a&gt;  &lt;p&gt;Those are Favicons, short for Favourites Icons. They are a great way to help users see at a glance what site is open in their browser, especially if they have several tabs open at once.  &lt;h3&gt;How do I create one?&lt;/h3&gt; &lt;p&gt;A favicon is simply a 16 x 16 pixel square image. &lt;/p&gt; &lt;p&gt;Typically the icon is a representation of your organization's logo or letters of its name or colour scheme. The image below shows some examples open in separate tabs in the Firefox browser.  &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/AllAboutFavicons_8793/favicons4.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="61" alt="favicons4" src="http://www.andornot.com/about/developerblog/uploaded_images/AllAboutFavicons_8793/favicons4_thumb.jpg" width="397" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You can create one from scratch using your favourite image editing program (or asking your graphic designer for a favour), or you can use one of several online tools to create one for you. &lt;/p&gt; &lt;p&gt;These two tools generate icons from images you upload:  &lt;p&gt;&lt;a href="http://www.favicongenerator.com/" target="_blank"&gt;http://www.favicongenerator.com/&lt;/a&gt;  &lt;p&gt;&lt;a href="http://www.html-kit.com/favicon/" target="_blank"&gt;http://www.html-kit.com/favicon/&lt;/a&gt;  &lt;p&gt;The following tool generates an icon from text you type (great for organizations without a logo, or one that doesn't reproduce well in the small size of an icon):  &lt;p&gt;&lt;a href="http://antifavicon.com/" target="_blank"&gt;http://antifavicon.com/&lt;/a&gt;  &lt;p&gt;The image can be in any format supported that a web browser can display, such as GIF, PNG and JPEG.  &lt;h3&gt;How do I add one to my website?&lt;/h3&gt; &lt;p&gt;Once you have an icon image, save it to a location on your web server. Traditionally the file was named "favicon.ico" and saved in the root folder. However, the latest browsers support alternate locations and file names.  &lt;p&gt;If you choose to name your file favicon.ico, note that the image format may still be a PNG, GIF, JPEG, etc.; it's only the extension that is changed to ".ico".  &lt;p&gt;To include the icon in your website, edit the pages to add one of the following lines to the &amp;lt;head&amp;gt; section:  &lt;p&gt;Either  &lt;p&gt;&amp;lt;link rel="shortcut icon" href="favicon.ico" &amp;gt;  &lt;p&gt;or  &lt;p&gt;&amp;lt;link rel="icon" type="image/png" href="/path/favicon.png"/&amp;gt;  &lt;p&gt;where type is the image type (e.g. png, jpg, gif, etc.) and href points to the image location on your web server.  &lt;p&gt;Note that the first link tag example &lt;a href="http://en.wikipedia.org/wiki/Favicon#Standardization" target="_blank"&gt;does not conform to W3C recommendations&lt;/a&gt;, so the second example is preferred.  &lt;h3&gt;How do I add one to my Inmagic WebPublisher PRO pages? &lt;/h3&gt; &lt;p&gt;If you have used the &lt;a href="http://www.andornot.com/Products/Addons/ask.aspx" target="_blank"&gt;Andornot Starter Kit&lt;/a&gt; to publish your textbase online, you may be able to simply edit the file "\layout\include\HeadTag.htm" to add the above line to the &amp;lt;head&amp;gt; section of most pages served by WebPublisher PRO. You may also need to edit your search pages. It all depends on how your site is configured. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-6208048821748464160?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/oYOxVfWurwk" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/01/all-about-favicons.aspx</feedburner:origLink></item><item><title>How to make and use file DSNs for Inmagic ODBC</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/GBbb4UdpQvo/how-to-make-and-use-file-dsns-for.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Sun, 25 Jan 2009 12:28:37 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-6722543761763494310</guid><description>&lt;p&gt;There are three ways to set up a DSN for ODBC connections: System DSN, User DSN, and File DSN. The first two store the connection settings in the registry, while the third stores all the connection info in a text file. The latter can be easily copied, filed with its parent project, put in source control, and modified by a build process. Plus just having that file there is a reminder that an ODBC connection is an application requirement. (Oh, I *have* forgotten.)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Create the file DSN&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You can create a file DSN by opening the ODBC Data Source Administrator dialog (listed as &amp;quot;Data Sources (ODBC)&amp;quot; from the Windows Start Menu), but I have encountered problems doing it that way.* It's easy to do from scratch, anyway.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Create a text file with a .dsn extension: MyFileDsn.dsn &lt;/li&gt;    &lt;li&gt;Fill in the contents as follows: &lt;/li&gt; &lt;/ol&gt;  &lt;div&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; [ODBC]&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; DRIVER=Inmagic DB/Text Driver (*.tba)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; READONLY=1&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; SERVER=NotTheServer&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; DBQ=c:\project\textbases\&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; PWD=INMAGIC&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; UID=&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Each key-value pair is on its own line separated by a carriage return. Ignore the fact that the view you're looking at on the blog may be wrapping. &lt;/li&gt;

  &lt;li&gt;The Inmagic ODBC driver must be installed on any machine using this connection. &lt;/li&gt;

  &lt;li&gt;ReadOnly can be set to 1 for readonly access. READONLY=0 means write access as well. &lt;/li&gt;

  &lt;li&gt;PWD can be blank if the textbase(s) don't use passwords. &lt;/li&gt;

  &lt;li&gt;UID is always blank. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;* E.g. password not being written to the file DSN, and the potential for confusion between 64bit and 32bit ODBC Data Sources, since a 64bit machine has both and has separate Admin dialogs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the file DSN&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pass a connection string to your application which points to the file you created:&lt;/p&gt;

&lt;div&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// C# file DSN example&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; connectionString = &lt;span style="color: #006080"&gt;&amp;quot;filedsn=c:\MyFileDsn.dsn&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-6722543761763494310?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/GBbb4UdpQvo" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2009/01/how-to-make-and-use-file-dsns-for.aspx</feedburner:origLink></item><item><title>Hit-a-Hint replacement: LoL fork of HaH</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/RDX18q4GLrc/hit-hint-replacement-lol-fork-of-hah.aspx</link><category>tools</category><category>add-ons</category><category>Firefox</category><author>noreply@blogger.com (Ted Jardine)</author><pubDate>Mon, 01 Dec 2008 12:19:41 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-8731526207474891722</guid><description>&lt;p&gt;Back in June I posted about &lt;a href="http://www.andornot.com/about/developerblog/2008/06/firefox-3-release-candidate-1-and-hit.aspx"&gt;how to get Hit-a-Hint to work with Firefox 3.*&lt;/a&gt;. HaH is a Firefox extension that aims to make web surfing with a keyboard as usable as possible. However, HaH is no longer under active development (which actually was the impetus for the June post as it needed some tweaks just to get it to work with newer versions of Firefox).&lt;/p&gt; &lt;p&gt;But now there's a replacement! &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8781"&gt;A new extension on the block, LoL,&lt;/a&gt; is a new and improved fork of HaH (and although I am a Nerd, I don't know why it's called LoL because I don't know what it would have to do with laughing out loud - can anybody enlighten me?). It's got everything HaH had, but also provides user-configurable keys and the ability to "intercept" link clicks with the space bar. Of course, it also work with Firefox 3 right out of the virtual box. Check out the developer's site at &lt;a title="http://elder-gods.org/lol/" href="http://elder-gods.org/lol/" target="_blank"&gt;http://elder-gods.org/lol/&lt;/a&gt;. Thanks Larry!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-8731526207474891722?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/RDX18q4GLrc" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/12/hit-hint-replacement-lol-fork-of-hah.aspx</feedburner:origLink></item><item><title>Enhancing the Genie OPAC Page Header</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/0NVOBf7zYWQ/enhancing-genie-opac-page-header.aspx</link><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Sun, 09 Nov 2008 22:24:01 PST</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-3394495257749394515</guid><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;The options for including a header across the top of the Genie OPAC pages that are supported by Genie out-of-the-box&amp;nbsp; are limited to referencing an image in the myGenie.config file, using the following line:  &lt;p&gt;&amp;lt;add key="MyLogo" value="images/your_logo.gif" /&amp;gt;  &lt;p&gt;The image referenced in this line appears at the top of all OPAC pages. The image can be a small logo, or can extend the full width of the OPAC pages (approx. 800 pixels) to provide an eye-catching header. For some sites, this is all that is required.  &lt;p&gt;However, if you want to have the Genie OPAC header match an existing public or internal website, a simple image may not be sufficient. Typically a header includes text, images and site navigation, so HTML may be required, not just an image.  &lt;p&gt;You can insert a custom header that includes HTML in the Genie header by editing the OPAC .aspx files directly. These include:  &lt;ul&gt; &lt;li&gt;opac.aspx  &lt;li&gt;opac_report.aspx  &lt;li&gt;opac_cart.aspx  &lt;li&gt;opac_items_search.aspx  &lt;li&gt;opac_items_report.aspx  &lt;li&gt;opac_loans_checkout.aspx  &lt;li&gt;opac_loans_report.aspx  &lt;li&gt;login.aspx  &lt;li&gt;logout.aspx&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;While you may include the complete header HTML in these .aspx pages directly, it is more efficient to place it in a separate file, then use an ASP.net user control to pull it in. For example, if a file called header.ascx is created and contains the HTML for the site header, then add the following statement at the top of opac.aspx:&lt;/p&gt; &lt;p&gt;&amp;lt;%@ Register Src="~/include/header.ascx" TagName="Header" TagPrefix="uc" %&amp;gt;  &lt;p&gt;and the following statement immediately after the &amp;lt;body&amp;gt; tag in opac.aspx: &lt;p&gt;&amp;lt;uc:Header ID="Header1" runat="server"&amp;gt;&amp;lt;/uc:Header&amp;gt;  &lt;p&gt;This will result in the contents of header.ascx being included in the page when served to the user.  &lt;p&gt;By separating the header HTML from the page, rather than embedding it in each of the OPAC pages, it is easy to subsequently edit the header to match changes to the rest of the site, without having to edit each OPAC page.  &lt;p&gt;The same technique may be used to include a footer, or any other secondary content, within the OPAC pages.  &lt;p&gt;You can see an example of this style of header at &lt;a href="http://geniehost23.inmagic.com/InmagicGenie/opac.aspx"&gt;http://geniehost23.inmagic.com/InmagicGenie/opac.aspx&lt;/a&gt;  &lt;p&gt;&lt;a href="http://geniehost23.inmagic.com/InmagicGenie/opac.aspx" target="_blank"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="Catalog Search_1217479621728" src="http://www.andornot.com/about/developerblog/uploaded_images/EnhancetheGenieOPACPageHeader_7862/CatalogSearch_1217479621728.png" width="233" border="0"&gt;&lt;/a&gt;  &lt;p&gt;One caveat of this technique is that if future versions of Genie include changes to any of the OPAC .aspx pages, the upgrade process will likely overwrite the modified versions. It is therefore important to keep a backup copy of those pages, and following the upgrade, to edit the new OPAC .aspx pages to re-insert the above code.  &lt;p&gt;Note also that in the above example, in the path "~/include/header.ascx", the ~ means "resolve to application root", which is typically the folder in which Genie is installed, and /include/ is a new folder created to store all the files and images related to the header, to keep it separate from the Genie files themselves.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-3394495257749394515?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/0NVOBf7zYWQ" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/11/enhancing-genie-opac-page-header.aspx</feedburner:origLink></item><item><title>Genie en Francais!</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/IGcTNoWuDqg/genie-en-francais.aspx</link><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Thu, 30 Oct 2008 08:12:11 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-5624738735340673013</guid><description>&lt;p&gt;When initially installed, Genie is set up with an English-language interface. However, Genie can also be set up with French-language screens so that staff and users can work in the language of their choice.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/GenieLocalizationMultilingualInterface_BFE4/Genie_French.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="277" alt="Genie_French" src="http://www.andornot.com/about/developerblog/uploaded_images/GenieLocalizationMultilingualInterface_BFE4/Genie_French_thumb.png" width="406" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Installation is fairly straightforward using Inmagic's instructions and localization files, but does involve editing some Genie .config files.&lt;/p&gt; &lt;p&gt;From your library home page, you can direct end users to the OPAC and have it start in either language, simply by specifying the language in the URL.  &lt;p&gt;e.g. &lt;a title="http://216.187.67.111/InmagicGenie/opac.aspx?Language=fr-CA" href="http://216.187.67.111/InmagicGenie/opac.aspx?Language=fr-CA"&gt;http://216.187.67.111/InmagicGenie/opac.aspx?Language=fr-CA&lt;/a&gt; will start the OPAC in Canadian French (this site is Andornot's &lt;a href="http://www.andornot.com/Products/Inmagic/Genie/genie_demo.aspx"&gt;Genie demo&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Library staff can also choose a language for working with the Catalog, Serials and other modules. &lt;/p&gt; &lt;p&gt;In both the OPAC and library staff area, a cookie is set to retain the language choice.&lt;/p&gt; &lt;p&gt;Contact Andornot or Inmagic, Inc. to obtain the French localization files and step-by-step instructions for installation. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-5624738735340673013?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/IGcTNoWuDqg" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/10/genie-en-francais.aspx</feedburner:origLink></item><item><title>Use Genie Resource Files to Change Textual Elements</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/ntxaF7WQTcQ/use-genie-resource-files-to-change.aspx</link><author>noreply@blogger.com (Jonathan Jacobsen)</author><pubDate>Wed, 08 Oct 2008 14:58:22 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-7731301799914863671</guid><description>&lt;p&gt;The Genie config files allow changes to many textual elements within Genie, from field names and labels to the names of the Browse buttons.&lt;/p&gt; &lt;p&gt;However, not everything that appears on the Genie screens is exposed in the config files. Other text is stored in a resource file, one for different languages, that can be copied and edited using the procedure below. Note that there is currently no documentation for changing these files.&lt;/p&gt; &lt;p&gt;1. Locate the file "GlobalResource.RESX ". It is typically installed in C:\Program Files\Inmagic\Genie\App_GlobalResources. &lt;/p&gt; &lt;p&gt;2. Create a new plain text file in this same folder called "GlobalResource.en-US.RESX" (or if your instance of Genie is configured for a different locale, change en-US to that locale).&lt;/p&gt; &lt;p&gt;3. Copy the following from the GlobalResource.RESX file to the new .RESX file:&lt;/p&gt; &lt;ul&gt; &lt;ul&gt; &lt;li&gt;The header information: Everything from the top of the file to just before the first &amp;lt;data&amp;gt; tag.  &lt;li&gt;Only those &amp;lt;data&amp;gt; tags containing messages that you want to be different than the original message.  &lt;li&gt;The &amp;lt;/root&amp;gt; tag from the bottom of the file.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; &lt;p&gt;4. Within the &amp;lt;data&amp;gt; tags you copied, edit the text between &amp;lt;value&amp;gt; and &amp;lt;/value&amp;gt; to change the message.&lt;/p&gt; &lt;p&gt;For example, to change the name of the InfoCart to "Record List", you would copy all of the &amp;lt;data&amp;gt; tags that refer to the InfoCart and edit their values to incorporate Records List.&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/UseGenieResourceFilestoChangeText_C6CE/resource_file.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="186" alt="resource_file" src="http://www.andornot.com/about/developerblog/uploaded_images/UseGenieResourceFilestoChangeText_C6CE/resource_file_thumb.png" width="400" border="0"&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-7731301799914863671?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/ntxaF7WQTcQ" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/10/use-genie-resource-files-to-change.aspx</feedburner:origLink></item><item><title>Index Popups 2008.2.9.10 Update</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/dCwW4YTMUzk/index-popups-20082910-update.aspx</link><category>inmagic</category><category>Webpublisher</category><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Wed, 10 Sep 2008 12:52:23 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-8548637877066687653</guid><description>&lt;p&gt;Index popups for Inmagic Webpublisher Pro have been updated to fix some subtle bugs:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Entering certain characters in find box causes invalid XML errors. &lt;/li&gt;    &lt;li&gt;Previous Page and Last Page do not work with some secondary fieldnames, or when fieldname is provided whose sentence case does not match actual field exactly. &lt;/li&gt;    &lt;li&gt;Passwords are not passed through after the initial page. (Ok, not so subtle this one.) &lt;/li&gt;    &lt;li&gt;Code fields can cause invalid XML errors. &lt;/li&gt;    &lt;li&gt;Last Page fails if icsweb.ini/dbtwpub.ini SoapFormat=0 or SoapFormat=n and fieldname requires modification for XML use. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Unfixable issue:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Previous Page fails if icsweb.ini/dbtwpub.ini SoapFormat=0 or SoapFormat=n and fieldname requires modification for XML use. (Can only fix by changing SoapFormat=1 due to Webpublisher restrictions on fetching index lists with a key delta.) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://www.andornot.com/downloads/indexpopups_2008.2.9.10.zip"&gt;Download Index Popups 2008.2.9.10&lt;/a&gt; (~600 kB)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-8548637877066687653?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/dCwW4YTMUzk" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/09/index-popups-20082910-update.aspx</feedburner:origLink></item><item><title>Virtual PC 2007 networking tip</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/rwo4C_p8qb0/virtual-pc-2007-networking-tip.aspx</link><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Fri, 05 Sep 2008 17:21:20 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-8065170643290681349</guid><description>&lt;p&gt;If you want to interact with a virtual machine as part of your network, you need to adjust its networking settings to specifically use one of the host machine's network adapters.&lt;/p&gt;  &lt;p&gt;Don't set the adapter to &amp;quot;Shared networking (NAT)&amp;quot;. This isolates the virtual machine behind the virtual networking adapter. You'll find you can't even ping the VM from the host.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Good for interacting&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/VirtualPC2007networkingtip_F408/vm_adapter_set.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="174" alt="vm_adapter_set" src="http://www.andornot.com/about/developerblog/uploaded_images/VirtualPC2007networkingtip_F408/vm_adapter_set_thumb.png" width="244" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Bad for interacting&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.andornot.com/about/developerblog/uploaded_images/VirtualPC2007networkingtip_F408/vm_nat.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="208" alt="vm_nat" src="http://www.andornot.com/about/developerblog/uploaded_images/VirtualPC2007networkingtip_F408/vm_nat_thumb.png" width="244" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-8065170643290681349?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/rwo4C_p8qb0" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/09/virtual-pc-2007-networking-tip.aspx</feedburner:origLink></item><item><title>DB/Text trace log format method</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/-4B2-8MXVsA/dbtext-trace-log-format-method.aspx</link><category>javascript</category><category>db/textworks</category><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Fri, 08 Aug 2008 10:21:12 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-5577188125354382929</guid><description>&lt;p&gt;Further to &lt;a href="http://www.andornot.com/about/developerblog/2007/05/how-to-make-javascript-trace-log.aspx"&gt;my post of May 2007&lt;/a&gt;, where I described how to create a trace log in DB/Text and handle exceptions, here is a method that is handy for building more complex log statements.&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// construct formatted log statement&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; logFormat(val, arg1, arg2, arg3)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; formattedVal = val;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (arg1 != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)    {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         formattedVal = formattedVal.replace(&lt;span style="color: #006080"&gt;&amp;quot;{0}&amp;quot;&lt;/span&gt;, arg1);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (arg2 != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         formattedVal = formattedVal.replace(&lt;span style="color: #006080"&gt;&amp;quot;{1}&amp;quot;&lt;/span&gt;, arg2);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (arg3 != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;         formattedVal = formattedVal.replace(&lt;span style="color: #006080"&gt;&amp;quot;{2}&amp;quot;&lt;/span&gt;, arg3);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;     log(formattedVal);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt; &lt;span style="color: #008000"&gt;// write log statement to form box&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; log(val)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; box = Form.boxes(&lt;span style="color: #006080"&gt;&amp;quot;boxDebugLog&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (box == &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt;;    &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;     &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (box.content != &lt;span style="color: #006080"&gt;''&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;     {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;         box.content += &lt;span style="color: #006080"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;;    &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;     }    &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt;     box.content += val;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;logFormat&lt;/em&gt; takes a string value and up to 3 arguments, and replaces tokens found in the string value with those arguments. It's based on C#'s &lt;em&gt;string.Format&lt;/em&gt; method, and others like it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's easier to read (and write) a format string that contains tokens than a string concatenated together with plus signs.&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; count = 10;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; name = &lt;span style="color: #006080"&gt;&amp;quot;Peter&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; duration = 30;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; LogTheOldWay()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     log(name + &lt;span style="color: #006080"&gt;&amp;quot; was lashed with a wet noodle &amp;quot;&lt;/span&gt; + count + &lt;span style="color: #006080"&gt;&amp;quot; times for &amp;quot;&lt;/span&gt; + duration + &lt;span style="color: #006080"&gt;&amp;quot; seconds.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; LogTheNewWay()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; {    &lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     logFormat(&lt;span style="color: #006080"&gt;&amp;quot;{0} was lashed with a wet noodle {1} times for {2} seconds.&amp;quot;&lt;/span&gt;, name, count, duration);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My example above only proves how piddly my skills really are. There's a *much* better way of doing this that allows for &lt;em&gt;n&lt;/em&gt; arguments instead of a maximum of three. I had forgotten that every javascript function has a local property called &lt;font face="Courier New"&gt;arguments&lt;/font&gt; that contains all parameters passed to the function as an array.&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; logFormat(val)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; formattedVal = val;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;for&lt;/span&gt;(i = 1; i &amp;lt; arguments.length; i++)&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;   {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     formattedVal = formattedVal.replace(&lt;span style="color: #006080"&gt;&amp;quot;{&amp;quot;&lt;/span&gt; + (i - 1) + &lt;span style="color: #006080"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;, arguments[i]);&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;   }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;   &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; formattedVal;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-5577188125354382929?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/-4B2-8MXVsA" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/08/dbtext-trace-log-format-method.aspx</feedburner:origLink></item><item><title>"Static" properties in javascript. Kinda.</title><link>http://feedproxy.google.com/~r/AndornotDevelopersBlog/~3/-XB-DBSuj1M/properties-in-javascript-kinda.aspx</link><category>javascript</category><category>db/textworks</category><author>noreply@blogger.com (Peter Tyrrell)</author><pubDate>Tue, 05 Aug 2008 22:55:26 PDT</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-15297768.post-2659495912683657683</guid><description>&lt;p&gt;The following gives me the ability to access javascript properties in a static kind of way. Not really, since the object has been instantiated, but at least I don't have to define a specific object, then call its constructor all the time to new it up and get at its properties.&lt;/p&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// declare globally&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; Artist = {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     Fields: {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         Id: &lt;span style="color: #006080"&gt;&amp;quot;ID&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         FullName: &lt;span style="color: #006080"&gt;&amp;quot;Term&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         FirstName: &lt;span style="color: #006080"&gt;&amp;quot;First Name&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         LastName: &lt;span style="color: #006080"&gt;&amp;quot;Last Name&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         Birth: &lt;span style="color: #006080"&gt;&amp;quot;Date of Birth&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         Death: &lt;span style="color: #006080"&gt;&amp;quot;Date of Death&amp;quot;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;     }&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; };&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I like to store DB/Text field names in this way, as they become (pseudo) strongly-typed and the magic strings are stored in one place only, instead of scattered across my code like dandelion seeds.&lt;/p&gt;

&lt;p&gt;It can be difficult to work in javascript after C# and other full-featured languages. This is the closest I could come to static properties or a struct. If I weren't scripting in DB/Text, a proprietary closed system, I would be using &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; or &lt;a href="http://mootools.net/"&gt;mootools&lt;/a&gt;, which put the joy back in joyvascript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now I can access field names statically as follows. Look ma, no constructors!&lt;/p&gt;

&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;
  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;
    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;function&lt;/span&gt; SomeMethod()&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;var&lt;/span&gt; idFieldName = Artist.Fields.Id;&lt;/pre&gt;

    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; }&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='//blogger.googleusercontent.com/tracker/15297768-2659495912683657683?l=www.andornot.com%2Fabout%2Fdeveloperblog%2FDefault.aspx'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/AndornotDevelopersBlog/~4/-XB-DBSuj1M" height="1" width="1"/&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.andornot.com/about/developerblog/2008/08/properties-in-javascript-kinda.aspx</feedburner:origLink></item></channel></rss>
