<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Gary Sherman</title><link>http://blogs.dovetailsoftware.com/blogs/gsherman/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/GarySherman" type="application/rss+xml" /><feedburner:emailServiceId>GarySherman</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>A week of Monospace and Innotech</title><link>http://feedproxy.google.com/~r/GarySherman/~3/qZUQAbas1F0/a-week-of-monospace-and-innotech.aspx</link><pubDate>Mon, 02 Nov 2009 19:00:06 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11980</guid><dc:creator>gsherman</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11980.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11980</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11980</wfw:comment><description>&lt;p&gt;I spent last week at the &lt;a href="http://monospace.us/"&gt;Monospace&lt;/a&gt; conference, which was held concurrently with the annual Innotech conference here in Austin.&lt;/p&gt;  &lt;h2&gt;Monospace&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/monospace_logo_4DDABD4D.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:10px 0px 10px 10px;display:inline;border-top:0px;border-right:0px;" title="monospace_logo" border="0" alt="monospace_logo" align="right" src="http://blogs.dovetailsoftware.com/blogs/gsherman/monospace_logo_thumb_109A0886.jpg" width="125" height="108" /&gt;&lt;/a&gt;&lt;/h2&gt;  &lt;p&gt;This was the first year for &lt;a href="http://monospace.us/"&gt;Monospace&lt;/a&gt;, and it was fantastic. &lt;a href="http://blog.scottbellware.com/"&gt;Scott Bellware&lt;/a&gt; did a great job of organizing the conf, bringing in top notch attendees, and providing fun after-hours activities as well. &lt;a href="http://tirania.org/blog/"&gt;Miguel de Icaza&lt;/a&gt; (founder of the &lt;a href="http://www.mono-project.com"&gt;Mono project&lt;/a&gt;) attended, along with a good chunk of his team. There were plenty of local folks (including a few of us from Dovetail), folks from Microsoft, as well as a bunch of international developers as well. It was an incredible bunch of super-smart folks, all willing to share and help others kick ass. &lt;/p&gt;  &lt;p&gt;From the Monospace website:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Monospace is the conference that teaches .NET software developers and organizations how to use the Mono framework and Microsoft .NET to leverage existing investments in skills and applications on a broader array of platforms for a broader array of opportunities.&lt;/p&gt;    &lt;p&gt;The Mono framework lets you take advantage of not only Windows, but also Linux, Mac, iPhone, Android, and comprehensive cloud computing platforms like Amazon's EC2, and even special-purpose hardware platforms.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;For those not familiar with Mono, its a cross platform, open source .NET development framework. The &lt;a href="http://www.mono-project.com/FAQ:_General"&gt;Mono FAQ&lt;/a&gt; is a good place to start. &lt;/p&gt;  &lt;p&gt;I’m extremely impressed with what the Mono team has accomplished. &lt;/p&gt;  &lt;p&gt;The conference was 2 days of workshops followed by 2 days of Open Space. Since a good deal of us attendees were .NET developers, we were able to get acquainted with Mono, MonoDevelop and MonoTouch in the workshops, and then dive into various topics during the Open Space. There were open space topics on &lt;a href="http://www.codeplex.com/MEF"&gt;MEF&lt;/a&gt;, iPhone development, adding scripting to your application, &lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://nhforge.org/Default.aspx"&gt;NHibernate&lt;/a&gt;, and some good discussions around legal aspects of using open-source software. &lt;/p&gt;  &lt;p&gt;I loved the combination of workshops + Open Space. &lt;/p&gt;  &lt;h3&gt;MonoDevelop&lt;/h3&gt;  &lt;p&gt;I got to see my first glimpse of MonoDevelop. Impressive. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; is an IDE primarily designed for C# and other .NET languages. MonoDevelop enables developers to quickly write desktop and ASP.NET Web applications on Linux. MonoDevelop makes it easy for developers to port .NET applications created with Visual Studio to Linux and to maintain a single code base for all platforms.&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;MonoTouch&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://monotouch.net/"&gt;MonoTouch&lt;/a&gt; was one of the biggest hits of the show. &lt;/p&gt;  &lt;p&gt;From the MonoTouch website:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;MonoTouch allows developers to create C# and .NET based applications that run on Apple's iPhone and Apple's iPod Touch devices, while taking advantage of the iPhone APIs and reusing both code and libraries that have been built for .NET, as well as existing skills.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;It was pretty bad ass seeing .NET developers writing C# code to create iPhone apps. &lt;/p&gt;  &lt;h3&gt;SUSE Studio&lt;/h3&gt;  &lt;p&gt;We also saw &lt;a href="http://susestudio.com/"&gt;SUSE Studio&lt;/a&gt; in action. Miguel did a great demo when he showed building an application in Visual Studio in Windows, from VS, compiling/building in on Linux which created a RPM package. Uploading that to the cloud, using SUSE Studio to create a custom Linux distro, and running the just built app in the cloud. This custom distro can also be pushed to EC2. Totally. Bad. Ass. &lt;/p&gt;  &lt;h2&gt;InnoTech&lt;/h2&gt;  &lt;p&gt;In the midst of all the Monospace goodness, the &lt;a href="http://www.innotechconference.com/austin/"&gt;InnoTech&lt;/a&gt; conference happened on Thursday. I think this is my 4th year attending InnoTech here in Austin. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;InnoTech is an annual conference and exhibition built specifically for business and technology executives, highlighting the region's innovation and technology development opportunities by showcasing pioneering products and services.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;There were lots of talks on social media (no surprise), cloud computing (again, no surprise), as well as some technical talks including &lt;em&gt;ASP.NET MVC&lt;/em&gt;, &lt;em&gt;database change management&lt;/em&gt;, and one on &lt;em&gt;Operational Transformation: The Key to Understanding Google Wave&lt;/em&gt;. Great stuff. &lt;/p&gt;  &lt;p&gt;A wide range of topics – great for both business and technical folks.&lt;/p&gt;  &lt;h3&gt;Exhibitors&lt;/h3&gt;  &lt;p&gt;One of the fun parts of InnoTech is walking the exhibit floor, getting to see new products, and engage in good discussions. &lt;/p&gt;  &lt;p&gt;It was very cool to see multiple CRM companies exhibiting this year: &lt;a href="http://www.parature.com/"&gt;Parature&lt;/a&gt;, &lt;a href="http://txt4crm.com"&gt;txt4crm&lt;/a&gt;, and &lt;a href="http://www.teamsupport.com/"&gt;TeamSupport&lt;/a&gt;. This was my first exposure to TeamSupport – they have a nice product.&lt;/p&gt;  &lt;h3&gt;Get out of your office&lt;/h3&gt;  &lt;p&gt;If you haven’t attended InnoTech before – I would recommend it – especially if its local. Not only is it a great way to see and hear about new products and technology, but it’s an opportunity to get out and meet other tech pros, bounce some ideas around, and stay in touch with the ever-changing technology world that we live in.&lt;/p&gt;  &lt;p&gt;Whenever I go to a conference, my Idea faucet seems to open up wide. I’m constantly jotting down new ideas – I just wish I had time and resources to do them all!&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11980" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/qZUQAbas1F0" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/austin/default.aspx">austin</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/conference/default.aspx">conference</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/innotech/default.aspx">innotech</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/mono/default.aspx">mono</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/11/02/a-week-of-monospace-and-innotech.aspx</feedburner:origLink></item><item><title>Clarify Architect position</title><link>http://feedproxy.google.com/~r/GarySherman/~3/oszvXqdjjdw/clarify-architect-position.aspx</link><pubDate>Fri, 25 Sep 2009 16:04:41 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11951</guid><dc:creator>gsherman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11951.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11951</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11951</wfw:comment><description>&lt;p&gt;For any of you Clarify peeps out there looking for a gig, there’s a &lt;a href="http://seeker.dice.com/jobsearch/servlet/JobSearch?op=302&amp;amp;dockey=xml/8/2/82df19e7e76c9d01b3372f1eaee4f552@endecaindex&amp;amp;source=18"&gt;Clarify Architect position&lt;/a&gt; available in Cincinnati Ohio.&lt;/p&gt;  &lt;p&gt;Requirements:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Very Strong experience with Clarify/Amdocs product platform (Customer/Call management systems)&lt;/li&gt;    &lt;li&gt;Strong experience with installations, configurations and migrations of Clarify product platform&lt;/li&gt;    &lt;li&gt;Strong experience with TIBCO.&lt;/li&gt;    &lt;li&gt;Should be able to perform installations and configurations, as well as setting up interfaces etc&lt;/li&gt;    &lt;li&gt;Experience with Tuxedo and Weblogic are required.&lt;/li&gt;    &lt;li&gt;Should be able to perform installations and configurations, as well as any troubleshooting&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Note: This isn’t a position at Dovetail, and I don’t have any vested interest in filling this job. I’m simply sharing an opportunity with my Clarify compadres. &lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11951" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/oszvXqdjjdw" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/clarify+amdocs/default.aspx">clarify amdocs</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/25/clarify-architect-position.aspx</feedburner:origLink></item><item><title>Using Log4Net in PowerShell</title><link>http://feedproxy.google.com/~r/GarySherman/~3/To8GpDRS7Kg/using-log4net-in-powershell.aspx</link><pubDate>Wed, 23 Sep 2009 22:59:10 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11942</guid><dc:creator>gsherman</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11942.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11942</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11942</wfw:comment><description>&lt;p&gt;I was writing some PowerShell this week, and wanted to do some logging.&lt;/p&gt;  &lt;p&gt;I’ve blogged in the past about &lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2007/05/14/configuring-logging-in-the-fcsdk-without-a-config-file.aspx"&gt;configuring log4net with the fcSDK within Powershell&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;However, this method relied on the log4net handling within our SDK. What if I wanted to log before I got to the SDK initialization? &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/kmiller/"&gt;Kevin&lt;/a&gt; shared some of his &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt; fu, and I put it into Powershell.&lt;/p&gt;  &lt;h2&gt;Configure Logging&lt;/h2&gt;  &lt;p&gt;Here’s what I came up with:&lt;/p&gt;  &lt;p&gt;function configure-logging()   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; [system.reflection.assembly]::LoadWithPartialName(&amp;quot;log4net&amp;quot;) &amp;gt; $null;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $LogManager = [log4net.LogManager]&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $global:logger = $LogManager::GetLogger(&amp;quot;PowerShell&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if ( (test-path $appSettings[&amp;quot;logConfigFilePath&amp;quot;]) -eq $false)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $message = &amp;quot;WARNING: logging config file not found: &amp;quot; +&amp;#160; $appSettings[&amp;quot;logConfigFilePath&amp;quot;]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; write-host    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; write-host $message -foregroundcolor yellow    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; write-host    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; else    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $configFile = new-object System.IO.FileInfo( $appSettings[&amp;quot;logConfigFilePath&amp;quot;] );&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; $xmlConfigurator = [log4net.Config.XmlConfigurator]::ConfigureAndWatch($configFile);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;Notice that the logging config file is coming from $appSettings. &lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/11/more-fun-with-powershell.aspx"&gt;I blogged about this earlier&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Logging Config File&lt;/h2&gt;  &lt;p&gt;a pretty standard log4net config file setup with a rolling file appender:&lt;/p&gt;  &lt;p&gt;&amp;lt;log4net&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appender name=&amp;quot;PowerShellRollingFileAppender&amp;quot; type=&amp;quot;log4net.Appender.RollingFileAppender&amp;quot; &amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;File&amp;quot; value=&amp;quot;C:\logs\powershell.log&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;AppendToFile&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;RollingStyle&amp;quot; value=&amp;quot;Size&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;MaxSizeRollBackups&amp;quot; value=&amp;quot;100&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;MaximumFileSize&amp;quot; value=&amp;quot;1024KB&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;StaticLogFileName&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;lockingModel type=&amp;quot;log4net.Appender.FileAppender+MinimalLock&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;layout type=&amp;quot;log4net.Layout.PatternLayout&amp;quot;&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;param name=&amp;quot;ConversionPattern&amp;quot; value=&amp;quot;%d [%-5p] [%c] %n&amp;#160;&amp;#160;&amp;#160; %m%n%n&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/layout&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/appender&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;root&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;level value=&amp;quot;info&amp;quot; /&amp;gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/root&amp;gt;    &lt;br /&gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;logger name=&amp;quot;PowerShell&amp;quot; additivity=&amp;quot;false&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;level value=&amp;quot;info&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appender-ref ref=&amp;quot;PowerShellRollingFileAppender&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/logger&amp;gt;    &lt;br /&gt;&amp;lt;/log4net&amp;gt;&lt;/p&gt;  &lt;h2&gt;Logging functions&lt;/h2&gt;  &lt;p&gt;I then created some wrapper functions for messages &amp;amp; warnings that write to the output and to the log4net logger:&lt;/p&gt;  &lt;p&gt;function log-info ([string] $message)   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; write-host $message    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $logger.Info($message);    &lt;br /&gt;} &lt;/p&gt;  &lt;p&gt;function log-warn ([string] $message)   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; write-host &amp;quot;WARNING: $message&amp;quot; -foregroundcolor yellow    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $logger.Warn($message);    &lt;br /&gt;}&lt;/p&gt;  &lt;h2&gt;Startup function&lt;/h2&gt;  &lt;p&gt;This function loads up the configuration (which sets up $appSettings), and configures logging:&lt;/p&gt;  &lt;p&gt;function startup()   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .\LoadConfig dovetail.config    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; configure-logging;    &lt;br /&gt;}&lt;/p&gt;  &lt;h2&gt;Go-Go gadget logger&lt;/h2&gt;  &lt;p&gt;After calling startup, I can log away, and it will go to the console, and to my log file:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/powershell_207E9339.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="powershell" border="0" alt="powershell" src="http://blogs.dovetailsoftware.com/blogs/gsherman/powershell_thumb_4F80CF10.jpg" width="522" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11942" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/To8GpDRS7Kg" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/PowerShell/default.aspx">PowerShell</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/23/using-log4net-in-powershell.aspx</feedburner:origLink></item><item><title>Saving Searches in Dovetail applications</title><link>http://feedproxy.google.com/~r/GarySherman/~3/zdH6CN9Caz4/saving-searches-in-dovetail-applications.aspx</link><pubDate>Mon, 21 Sep 2009 21:03:13 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11938</guid><dc:creator>gsherman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11938.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11938</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11938</wfw:comment><description>&lt;h2&gt;Saving Searches in Dovetail Agent&lt;/h2&gt;  &lt;p&gt;One of the things under development for the next version of &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailAgent"&gt;Dovetail Agent&lt;/a&gt; is the ability to save your favorite searches.&lt;/p&gt;  &lt;p&gt;Here’s a screenshot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/search_4E6893B2.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="search" border="0" alt="search" src="http://blogs.dovetailsoftware.com/blogs/gsherman/search_thumb_6783EDEA.jpg" width="959" height="566" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So you can now save your searches, and easily execute them again at anytime.&lt;/p&gt;  &lt;p&gt;You can also name a search. By default, the name of the search will be the search terms. But you can rename it to whatever you want.   &lt;br /&gt;For example, as opposed to a search being named: “squeaking washer condition:open casetype:problem”    &lt;br /&gt;You may choose to rename it as “open cases for squeaky washer”&lt;/p&gt;  &lt;p&gt;Look for this functionality in the next release of &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailAgent"&gt;Dovetail Agent&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Saving Searches in Dovetail Mobile Agent and Agent Lite&lt;/h2&gt;  &lt;p&gt;Currently, we don’t have Saved Searches in &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailMobileAgent"&gt;Dovetail Mobile Agent&lt;/a&gt; or Agent Lite. This is on the enhancement list for the future.&lt;/p&gt;  &lt;p&gt;But, you can easily save a search today by simply using a browser bookmark/favorite.&lt;/p&gt;  &lt;p&gt;Here’s a screenshot of a search within Dovetail Agent Lite:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/search_agent_lite_45B81559.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="search_agent_lite" border="0" alt="search_agent_lite" src="http://blogs.dovetailsoftware.com/blogs/gsherman/search_agent_lite_thumb_3DC072F7.jpg" width="959" height="692" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Notice the URL:&lt;/p&gt;  &lt;p&gt;http://localhost/AgentLite/Search/query?query=squeaking+washer+condition:open+casetype:problem&amp;amp;searchDomain=case &lt;/p&gt;  &lt;p&gt;Notice that it has all of the search parameters within it.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The path to the search page: http://localhost/AgentLite/Search/query?query=&lt;/li&gt;    &lt;li&gt;The text keywords to search for: squeaking + washer&lt;/li&gt;    &lt;li&gt;Structured attributes: condition:open + casetype:problem&lt;/li&gt;    &lt;li&gt;And a search domain: &amp;amp;searchDomain=case &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;So you can simply bookmark this using your browser, and easily execute this query again at anytime.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/bookmarks_154190E3.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="bookmarks" border="0" alt="bookmarks" src="http://blogs.dovetailsoftware.com/blogs/gsherman/bookmarks_thumb_028C972C.jpg" width="949" height="314" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The functionality works exactly the same within &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailMobileAgent"&gt;Dovetail Mobile Agent&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11938" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/zdH6CN9Caz4" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/Dovetail+Agent/default.aspx">Dovetail Agent</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/search/default.aspx">search</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/seeker/default.aspx">seeker</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/Dovetail+Mobile+Agent/default.aspx">Dovetail Mobile Agent</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/Dovetail+Agent+Lite/default.aspx">Dovetail Agent Lite</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/21/saving-searches-in-dovetail-applications.aspx</feedburner:origLink></item><item><title>Migrating a case from Clarify into a Zendesk ticket</title><link>http://feedproxy.google.com/~r/GarySherman/~3/JPzty-4fotw/migrating-a-case-from-clarify-into-a-zendesk-ticket.aspx</link><pubDate>Mon, 21 Sep 2009 15:18:06 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11934</guid><dc:creator>gsherman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11934.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11934</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11934</wfw:comment><description>&lt;p&gt;I recently received a request asking how to migrate some data (specifically, cases) from Clarify into &lt;a href="http://www.zendesk.com"&gt;Zendesk&lt;/a&gt;. Seems the company is in the process of turning off Clarify and rolling out Zendesk.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/clarrify2zendesk_0C4F79E8.gif"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="clarrify to zendesk" border="0" alt="clarrify to zendesk" src="http://blogs.dovetailsoftware.com/blogs/gsherman/clarrify2zendesk_thumb_107951AD.gif" width="686" height="256" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;It’s all about the APIs&lt;/h2&gt;  &lt;p&gt;We provide a &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailSDK"&gt;full set of APIs for Clarify within our Dovetail SDK&lt;/a&gt;, and &lt;a href="http://www.zendesk.com/api"&gt;Zendesk also provides a set of APIs&lt;/a&gt;. So we just need to put them together.&lt;/p&gt;  &lt;h2&gt;PowerShell&lt;/h2&gt;  &lt;p&gt;I’ve been using &lt;a href="http://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx"&gt;PowerShell&lt;/a&gt; more and more lately, so I decided to use that as my environment. And because Powershell gives me full access to the .NET framework, I can use classes such as System.Net.WebClient, which makes it easy for me to call the &lt;a href="http://www.zendesk.com/api"&gt;Zendesk REST APIs&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Login to Clarify&lt;/h2&gt;  &lt;p&gt;In &lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/11/more-fun-with-powershell.aspx"&gt;a previous post&lt;/a&gt;, I showed how to use some common functions in PowerShell for logging into a Clarify database.&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;. .\DovetailCommonFunctions.ps1      &lt;br /&gt;$ClarifyApplication = create-clarify-application;       &lt;br /&gt;$ClarifySession = create-clarify-session $ClarifyApplication;&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Get the case data from Clarify&lt;/h2&gt;  &lt;p&gt;Now, we need to get the details of a case.&lt;/p&gt;  &lt;p&gt;A quick little function to get a case given its ID number:&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;function get-case-by-id([string] $id)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $dataSet = new-object FChoice.Foundation.Clarify.ClarifyDataSet($ClarifySession)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $caseGeneric = $dataSet.CreateGeneric(&amp;quot;case&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $caseGeneric.AppendFilter(&amp;quot;id_number&amp;quot;, &amp;quot;Equals&amp;quot;, $id)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $caseGeneric.Query();       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $caseGeneric.Rows[0];       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Then we can call this function that we just created:&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;$case = get-case-by-id &amp;quot;10&amp;quot;;&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;and get some case data:&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;$subject=$case[&amp;quot;title&amp;quot;];      &lt;br /&gt;$description = $case[&amp;quot;case_history&amp;quot;];&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;That’s all the Clarify stuff. Now onto the Zendesk side of things.&lt;/p&gt;  &lt;h2&gt;It’s a ticket in Zendesk&lt;/h2&gt;  &lt;p&gt;In Clarify, they’re called tickets. In Zendesk, they’re called tickets.&lt;/p&gt;  &lt;p&gt;First, we’ll create the XML needed by the &lt;a href="http://www.zendesk.com/api/tickets"&gt;create ticket API&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;$createTicketXML = &amp;quot;&amp;lt;ticket&amp;gt;&amp;quot;;      &lt;br /&gt;$createTicketXML+= &amp;quot;&amp;lt;subject&amp;gt;&amp;lt;![CDATA[&amp;quot; + $subject + &amp;quot;]]&amp;gt;&amp;lt;/subject&amp;gt;&amp;quot;;       &lt;br /&gt;$createTicketXML+= &amp;quot;&amp;lt;description&amp;gt;&amp;lt;![CDATA[&amp;quot; + $description + &amp;quot;]]&amp;gt;&amp;lt;/description&amp;gt;&amp;quot;;&amp;#160; &lt;br /&gt;$createTicketXML+= &amp;quot;&amp;lt;/ticket&amp;gt;&amp;quot;;&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Zendesk authentication and URL&lt;/h2&gt;  &lt;p&gt;&lt;font color="#800000"&gt;$zendeskLoginName = &amp;quot;myLoginName&amp;quot;;      &lt;br /&gt;$zendeskPassword = &amp;quot;myPassword&amp;quot;;       &lt;br /&gt;$zendeskURL = “http://myZendeskAccount.zendesk.com/”       &lt;br /&gt;$ticketsURL = $zendeskURL + &amp;quot;tickets.xml&amp;quot;&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;A simple web request&lt;/h2&gt;  &lt;p&gt;As I mentioned earlier, since I’m in Powershell, I can easily use the System.Net.WebClient object. Setup the login credentials, set the content type to be application/xml, and then we can post the XML to create a ticket.&lt;/p&gt;  &lt;p&gt;&lt;font color="#800000"&gt;$webClient = new-object &amp;quot;System.Net.WebClient&amp;quot;      &lt;br /&gt;$webClient.Credentials = new-object System.Net.NetworkCredential($zendeskLoginName,$zendeskPassword )       &lt;br /&gt;$webClient.Headers.Add(&amp;quot;Content-Type&amp;quot;, &amp;quot;application/xml&amp;quot;);       &lt;br /&gt;$webClient.UploadString($ticketsURL,$createTicketXML);&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;Status Check and output&lt;/h2&gt;  &lt;p&gt;&lt;font color="#800000"&gt;if ($webClient.ResponseHeaders[&amp;quot;Status&amp;quot;] -eq 201)      &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; write-host &amp;quot;Successfully created a new ticket in Zendesk at:&amp;quot; $webClient.ResponseHeaders[&amp;quot;Location&amp;quot;]       &lt;br /&gt;}&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This will output something like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/powershell_08EDE240.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="powershell" border="0" alt="powershell" src="http://blogs.dovetailsoftware.com/blogs/gsherman/powershell_thumb_6866A28D.jpg" width="987" height="175" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Successfully created a new ticket in Zendesk at: http://myZendeskAccount.zendesk.com/tickets/34.xml&lt;/p&gt;  &lt;h2&gt;Next steps&lt;/h2&gt;  &lt;p&gt;Next would be to probably get a list of cases from Clarify, loop through them, and for each one, create it in Zendesk.&amp;#160; I’ll leave that as an exercise for the reader. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h2&gt;Did I mention it’s all about the APIs?&lt;/h2&gt;  &lt;p&gt;Rock on.&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11934" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/JPzty-4fotw" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/CRM/default.aspx">CRM</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/clarify+amdocs/default.aspx">clarify amdocs</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/fcSDK/default.aspx">fcSDK</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/integration/default.aspx">integration</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/21/migrating-a-case-from-clarify-into-a-zendesk-ticket.aspx</feedburner:origLink></item><item><title>How do I know what ID to use for a new table or view?</title><link>http://feedproxy.google.com/~r/GarySherman/~3/b5lVgSPqzPg/how-do-i-know-what-id-to-use-for-a-new-table-or-view.aspx</link><pubDate>Fri, 18 Sep 2009 14:29:58 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11931</guid><dc:creator>gsherman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11931.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11931</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11931</wfw:comment><description>&lt;p&gt;When creating a new table or view in Clarify/Amdocs/Dovetail, a unique ID number must be supplied.&lt;/p&gt;  &lt;h2&gt;How do I know what ID to use?&lt;/h2&gt;  &lt;p&gt;Clarify has defined a range of numbers that are reserved for custom tables and views. They guarantee that they will not use any numbers in this range. So, you need to use a number in this range.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;There are two ranges reserves for custom IDs: 430-571 and 2000-4999. &lt;/strong&gt;The rest are reserved for Clarify baseline use.&lt;/p&gt;  &lt;p&gt;So, you simply need to pick a number in that range that hasn’t yet been used. &lt;/p&gt;  &lt;h2&gt;How do I know what numbers have already been used?&lt;/h2&gt;  &lt;p&gt;The most common method is to export your schema, pick a number, and search your schema to see if its in use. If it is, pick another number, search again. Repeat until you find an available number. &lt;/p&gt;  &lt;h2&gt;A better way&lt;/h2&gt;  &lt;p&gt;Since our BOLT product is a great way to visualize and navigate your way through the schema, it seemed natural to add this functionality to it.&lt;/p&gt;  &lt;p&gt;New in BOLT 2.8.1: a page that gives you information about user-defined table and view ID.&lt;/p&gt;  &lt;p&gt;It gives you information about each range, including which numbers have been used, and the lowest available number in the range.&lt;/p&gt;  &lt;p&gt;Here’s what it looks like:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/bolt_ids_5249153C.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="bolt_ids" border="0" alt="bolt_ids" src="http://blogs.dovetailsoftware.com/blogs/gsherman/bolt_ids_thumb_57B785E0.jpg" width="830" height="631" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This should make it easy to know what ID number you can use next time you want to create a new table or view.&lt;/p&gt;  &lt;h2&gt;Get it&lt;/h2&gt;  &lt;p&gt;If you have a logon to &lt;a href="http://www.dovetailsoftware.com/dtss/logon.asp"&gt;Dovevtail SelfService&lt;/a&gt;, login and request the latest version of BOLT. Or leave a comment on &lt;a href="http://blogs.dovetailsoftware.com/forums/thread/10804.aspx"&gt;this post on the Dovetail forums&lt;/a&gt;. &lt;/p&gt;  &lt;h2&gt;Genesis&lt;/h2&gt;  &lt;p&gt;I would love to say that I came up with this idea on my own, but, no. Interestingly, it actually came up from two different people at two different times.&lt;/p&gt;  &lt;p&gt;It was presented as a suggestion in our last &lt;a href="http://www.dovetailsoftware.com/services/developer_training.aspx"&gt;Dovetail Developer Workshop&lt;/a&gt;, and more recently, as a &lt;a href="http://crm.ittoolbox.com/groups/technical-functional/clarify-l/creating-viewtable-in-clarify-using-schemaeditor-2989998"&gt;question on the Clarify forum on Toolbox for IT&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;We love hearing ideas from the community – so keep ‘em coming!&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11931" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/b5lVgSPqzPg" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/clarify+amdocs/default.aspx">clarify amdocs</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/bolt/default.aspx">bolt</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/utilities/default.aspx">utilities</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/18/how-do-i-know-what-id-to-use-for-a-new-table-or-view.aspx</feedburner:origLink></item><item><title>Some notes on using Oracle 11 Database Instant Client</title><link>http://feedproxy.google.com/~r/GarySherman/~3/PICJemnMPHM/some-notes-on-using-oracle-11-database-instant-client.aspx</link><pubDate>Wed, 16 Sep 2009 15:58:23 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11925</guid><dc:creator>gsherman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11925.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11925</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11925</wfw:comment><description>&lt;p&gt;I recently upgraded my day-to-day environment to Windows 7 (64-bit) using MSSQL 2008. This week I needed to do some Oracle work, so I needed to get &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailAgent"&gt;DovetailAgent&lt;/a&gt; working with an Oracle 9 (technically 9.2.0.1.0) database, so I needed Oracle client software. The latest Oracle client version is 11, so I decided to give that a try. The actual Oracle database runs on a VM, so I just needed an Oracle client. &lt;/p&gt;  &lt;p&gt;Here are a few notes about getting this working.&lt;/p&gt;  &lt;h2&gt;Install Oracle Instant Client&lt;/h2&gt;  &lt;p&gt;Install the &lt;a href="http://www.oracle.com/technology/software/tech/oci/instantclient/index.html"&gt;Oracle 11 Instant Client for your platform&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;I installed mine into C:\oracle\product\11.1.0\client_1&lt;/p&gt;  &lt;p&gt;I went to edit the tnsnames.ora file, and quickly realized that there wasn’t one. A little googling led me to &lt;a href="http://www.dbatoolz.com/t/installing-oracle-instantclient-basic-and-instantclient-sqlplus-on-win32.html"&gt;a helpful blog post&lt;/a&gt; at DBAToolZ.&lt;/p&gt;  &lt;h2&gt;Environment Variables&lt;/h2&gt;  &lt;p&gt;Following the instructions from that blog post, I created a new system environment variable named&lt;strong&gt; TNS_ADMIN&lt;/strong&gt; that was set to C:\oracle\product\11.1.0\client_1&lt;/p&gt;  &lt;h2&gt;tnsnames.ora&lt;/h2&gt;  &lt;p&gt;I then created a tnsnames.ora file in the C:\oracle\product\11.1.0\client_1 directory, and edited it for my database:&lt;/p&gt;  &lt;p&gt;ORA9=   &lt;br /&gt;&amp;#160; (DESCRIPTION =    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (ADDRESS_LIST =    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (ADDRESS = (PROTOCOL = TCP)(HOST = ORA9)(PORT = 1521))    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; )    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; (CONNECT_DATA =    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (SERVICE_NAME = ORA9)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; )&lt;/p&gt;  &lt;h2&gt;Test connection using SQLPLUS&lt;/h2&gt;  &lt;p&gt;sqlplus user/pass@ORA9&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;c:\oracle\product\11.1.0\client_1&amp;gt;sqlplus sa/sa@ora9&lt;/p&gt;    &lt;p&gt;SQL*Plus: Release 11.1.0.7.0 - Production on Wed Sep 16 10:55:45 2009 &lt;/p&gt;    &lt;p&gt;Copyright (c) 1982, 2008, Oracle.&amp;#160; All rights reserved. &lt;/p&gt;    &lt;p&gt;Connected to:     &lt;br /&gt;Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production      &lt;br /&gt;With the Partitioning, OLAP and Oracle Data Mining options      &lt;br /&gt;JServer Release 9.2.0.1.0 - Production &lt;/p&gt;    &lt;p&gt;SQL&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Using sqlplus, I was able to successfully connect to the database.&lt;/p&gt;  &lt;h2&gt;Install DovetailAgent&lt;/h2&gt;  &lt;p&gt;I installed &lt;a href="http://www.dovetailsoftware.com/resources/docs.aspx?product=DovetailAgent"&gt;DovetailAgent&lt;/a&gt;, and edited the database info in the fc.env file:&lt;/p&gt;  &lt;p&gt;login_name=sa   &lt;br /&gt;db_password=sa     &lt;br /&gt;db_server=ORA9    &lt;br /&gt;db_name=ORA9    &lt;br /&gt;db_type=ORACLE&lt;/p&gt;  &lt;h2&gt;Enable 32-bit web applications&lt;/h2&gt;  &lt;p&gt;Because I am running on a 64-bit machine, I had to enable 32-bit applications in the web application pool. &lt;a href="http://www.dovetailsoftware.com/resources/solutions/303.aspx"&gt;Here’s a solution that shows how to do this&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Test Dovetail Agent&lt;/h2&gt;  &lt;p&gt;Using IE, I navigated to the DovetailAgent page, and got this error:&lt;/p&gt;  &lt;p&gt;System.Data.OracleClient requires Oracle client software version 8.1.7 or greater&lt;/p&gt;  &lt;h2&gt;Set Permissions on Oracle directory&lt;/h2&gt;  &lt;p&gt;A quick &lt;a href="http://www.dovetailsoftware.com/resources/knowledgeBaseSearch.aspx"&gt;search through our knowledgebase&lt;/a&gt; led me to this article:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dovetailsoftware.com/resources/solutions/92.aspx"&gt;Solution 92 - Oracle connection issues - BOLT, FCFL, fcClient, fcAdmin&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I followed the instructions in the 3rd resolution, which was to give the Authenticated Users group privilege to the Oracle Home directory (C:\oracle\product\11.1.0\client_1).&lt;/p&gt;  &lt;h2&gt;Test DovetailAgent &lt;/h2&gt;  &lt;p&gt;Using IE, I navigated to the DovetailAgent page, and was presented with the Login page.&lt;/p&gt;  &lt;h2&gt;Success&lt;/h2&gt;  &lt;p&gt;Oracle 11.1 instant client + Oracle 9.2 database + DovetailAgent 4.2 + Windows 7 (64-bit) + IIS 7.5 = success&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11925" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/PICJemnMPHM" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/fcClient/default.aspx">fcClient</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/Dovetail+Agent/default.aspx">Dovetail Agent</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/Oracle/default.aspx">Oracle</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/16/some-notes-on-using-oracle-11-database-instant-client.aspx</feedburner:origLink></item><item><title>More fun with Powershell</title><link>http://feedproxy.google.com/~r/GarySherman/~3/Rn1TWRcCfoU/more-fun-with-powershell.aspx</link><pubDate>Fri, 11 Sep 2009 16:19:07 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11916</guid><dc:creator>gsherman</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11916.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11916</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11916</wfw:comment><description>&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/powershell41_4EB969B9.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;margin:0px 0px 0px 15px;display:inline;border-top:0px;border-right:0px;" title="powershell[4][1]" border="0" alt="powershell[4][1]" align="right" src="http://blogs.dovetailsoftware.com/blogs/gsherman/powershell41_thumb_5832282F.jpg" width="240" height="177" /&gt;&lt;/a&gt;I was recently working on porting some existing ClearBasic batch (cbbatch) scripts to PowerShell.&lt;/p&gt;  &lt;p&gt;I’ve blogged in the past about &lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2007/04/25/using-the-fcsdk-in-powershell.aspx"&gt;using our SDK with Powershell&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For this particular project, I had multiple scripts to port, and I was looking to extract some common functions and utilities, so that they could be used between multiple scripts.&lt;/p&gt;  &lt;h2&gt;Configuration&lt;/h2&gt;  &lt;p&gt;When using the Dovetail SDK, one of the first tasks is to load up the configuration information and connect to the database.&lt;/p&gt;  &lt;p&gt;That would normally look something like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;$connectionString = “Data Source=localhost;Initial Catalog=dovetail;uid=user;pwd=pass&amp;quot;      &lt;br /&gt;$databaseType = “MSSQL”;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;    &lt;p&gt;[system.reflection.assembly]::LoadWithPartialName(&amp;quot;fcsdk&amp;quot;) &amp;gt; $null;     &lt;br /&gt;[system.reflection.assembly]::LoadWithPartialName(&amp;quot;FChoice.Toolkits.Clarify&amp;quot;) &amp;gt; $null; &lt;/p&gt;    &lt;p&gt;$config = new-object -typename System.Collections.Specialized.NameValueCollection;     &lt;br /&gt;$config.Add(&amp;quot;fchoice.connectionstring&amp;quot;,$connectionString);      &lt;br /&gt;$config.Add(&amp;quot;fchoice.dbtype&amp;quot;,$databaseType);      &lt;br /&gt;$config.Add(&amp;quot;fchoice.disableloginfromfcapp&amp;quot;, &amp;quot;false&amp;quot;);       &lt;br /&gt;$config.Add(&amp;quot;fchoice.nocachefile&amp;quot;, &amp;quot;true&amp;quot;); &lt;/p&gt;    &lt;p&gt;#Create and initialize the clarifyApplication object     &lt;br /&gt;$ClarifyApplication = [Fchoice.Foundation.Clarify.ClarifyApplication];      &lt;br /&gt;if ($ClarifyApplication::IsInitialized -eq $false ){      &lt;br /&gt;&amp;#160;&amp;#160; $ClarifyApplication::initialize($config) &amp;gt; $null;      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;h3&gt;Code for re-use&lt;/h3&gt;  &lt;p&gt;I didn’t want to repeat that in multiple scripts, so we can place that inside a function:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function create-clarify-application     &lt;br /&gt;{      &lt;br /&gt;&amp;#160; $connectionString = “Data Source=localhost;Initial Catalog=dovetail;uid=user;pwd=pass&amp;quot;       &lt;br /&gt;&amp;#160; $databaseType = “MSSQL”;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160; &amp;lt;snip&amp;gt; remainder of code here&amp;lt;/snip&amp;gt;      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I added that function to a script named DovetailCommonFunctions.ps1&lt;/p&gt;  &lt;p&gt;So now any script can use those functions by simply &lt;a href="http://www.microsoft.com/technet/scriptcenter/topics/winpsh/manual/run.mspx#EMBAC"&gt;dot sourcing&lt;/a&gt; this script, such as:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;. .\DovetailCommonFunctions.ps1 &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Notice that the line above is a dot, followed by a space, then the path to the script. If the script is in the same directory, then you would use dot slash, as shown.&amp;#160; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;Config files&lt;/h3&gt;  &lt;p&gt;But I didn’t want to have that configuration information hardcoded within that function.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!391.entry"&gt;Keith Hill has a nice blog post where he talks about using a configuration file for for Powershell scripts&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt; I created a config file named dovetail.config:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;     &lt;br /&gt;&amp;lt;configuration&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;startup&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/startup&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;appSettings&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add key=&amp;quot;connectionString&amp;quot; value=&amp;quot;Data Source=localhost;Initial Catalog=dovetail;uid=user;pwd=pass&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;add key=&amp;quot;databaseType&amp;quot; value=&amp;quot;MSSQL&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/appSettings&amp;gt;      &lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Then, using Keith’s LoadConfig script, my create-clarify-application function becomes:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function create-clarify-application     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; #Load the configuration file      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; .\LoadConfig dovetail.config      &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $connectionString = $appSettings[&amp;quot;connectionString&amp;quot;];      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $databaseType = $appSettings[&amp;quot;databaseType&amp;quot;];&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $config = new-object -typename System.Collections.Specialized.NameValueCollection;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $config.Add(&amp;quot;fchoice.connectionstring&amp;quot;,$connectionString);      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $config.Add(&amp;quot;fchoice.dbtype&amp;quot;,$databaseType);&lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;snip&amp;gt; remainder of code here&amp;lt;/snip&amp;gt;     &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So now I have one config file for setting application settings, including database connection information. &lt;/p&gt;  &lt;h3&gt;More code for re-use&lt;/h3&gt;  &lt;p&gt;Within DovetailCommonFunctions.ps1, I added another function for creating a clarify session:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;function create-clarify-session     &lt;br /&gt;{      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $clarifyapp = $args[0]      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; $ClarifySession = $clarifyapp::Instance.CreateSession();      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; return $ClarifySession      &lt;br /&gt;}&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now we can finally get to the task at hand. &lt;/p&gt;  &lt;h2&gt;Dispatching a Solution&lt;/h2&gt;  &lt;p&gt;I needed to create a script that would dispatch a solution to a given queue.&lt;/p&gt;  &lt;p&gt;My script is now pretty simple:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;param([string] $solutionId, [string] $queueName); &lt;/p&gt;    &lt;p&gt;. .\DovetailCommonFunctions.ps1      &lt;br /&gt;      &lt;br /&gt;$ClarifyApplication = create-clarify-application;       &lt;br /&gt;$ClarifySession = create-clarify-session $ClarifyApplication; &lt;/p&gt;    &lt;p&gt;$interToolkit= new-object FChoice.Toolkits.Clarify.Interfaces.InterfacesToolkit( $ClarifySession );     &lt;br /&gt;$DispatchSolutionSetup = new-object FChoice.Toolkits.Clarify.Interfaces.DispatchSolutionSetup($solutionId, $queueName);      &lt;br /&gt;$result = $interToolkit.DispatchSolution($DispatchSolutionSetup);&lt;/p&gt; &lt;/blockquote&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;So now I have the start of a common library of Dovetail functions (create-clarify-application, create-clarify-session), as well as a way to use a config file for application configuration information, including database connections. &lt;/p&gt;  &lt;p&gt;The more I use Powershell, the more I like it. I’ll continue to share my learnings as I progress. &lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11916" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/Rn1TWRcCfoU" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/clarify+amdocs/default.aspx">clarify amdocs</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/fcSDK/default.aspx">fcSDK</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/ClearBasic/default.aspx">ClearBasic</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/11/more-fun-with-powershell.aspx</feedburner:origLink></item><item><title>Displaying text using a fixed width font in the Clarify Client</title><link>http://feedproxy.google.com/~r/GarySherman/~3/k_meFl32paw/displaying-text-using-a-fixed-width-font-in-the-clarify-client.aspx</link><pubDate>Wed, 02 Sep 2009 15:54:50 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11910</guid><dc:creator>gsherman</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11910.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11910</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11910</wfw:comment><description>&lt;p&gt;We received a request recently about how to deal with some text in the system that was formatted using a fixed width font.&lt;/p&gt;  &lt;p&gt;For example, a customer might send in an email that contained some text that was laid out in a nicely formatted table structure. Such as this: &lt;/p&gt;  &lt;pre&gt;5.17637
|-----+-----+--------------+----------+--+-------+----------+-----+-----|
|     | JD00| firma ip     | gumpendor| 1| Wien  | Empfänger| fa. | 05.0|
|     | 0010| österreich   | ferstr.  | 0|       | verzogen | nich| 8.20|
| 5239| 4300| gmbh -       | 19-21    | 6|       |          | t   |   09|
| 1478| 0140|              |          | 0|       |          | mehr|     |
|     | 6959|              |          |  |       |          | da!!|     |
|     | 22  |              |          |  |       |          |     |     |
|     |     |              |          |  |       |          |     |     |
|-----+-----+--------------+----------+--+-------+----------+-----+-----|&lt;/pre&gt;

&lt;p&gt;But, when viewing it in the Clarify Classic Client, it looked like this:&lt;/p&gt;

&lt;p&gt;5.17637 
  &lt;br /&gt;|-----+-----+--------------+----------+--+-------+----------+-----+-----| 

  &lt;br /&gt;|&amp;#160;&amp;#160;&amp;#160;&amp;#160; | JD00| firma ip&amp;#160;&amp;#160;&amp;#160;&amp;#160; | gumpendor| 1| Wien&amp;#160; | Empfänger| fa. | 05.0| 

  &lt;br /&gt;|&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 0010| österreich&amp;#160;&amp;#160; | ferstr.&amp;#160; | 0|&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | verzogen | nich| 8.20| 

  &lt;br /&gt;| 5239| 4300| gmbh -&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 19-21&amp;#160;&amp;#160;&amp;#160; | 6|&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | t&amp;#160;&amp;#160; |&amp;#160;&amp;#160; 09| 

  &lt;br /&gt;| 1478| 0140|&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 0|&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | mehr|&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 

  &lt;br /&gt;|&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 6959|&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; | da!!|&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 

  &lt;br /&gt;|&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 22&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 

  &lt;br /&gt;|&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; |&amp;#160;&amp;#160;&amp;#160;&amp;#160; | 

  &lt;br /&gt;|-----+-----+--------------+----------+--+-------+----------+-----+-----|&lt;/p&gt;

&lt;p&gt;The reason is that by default, the Clarify Client does not use a fixed width font (where each character is given the same width, as by a typewriter)&lt;/p&gt;

&lt;p&gt;If you changed the font used by Clarify to be a fixed width font (such as courier), then the text would look OK. But most users wouldn’t want to work with a fixed width font all day long within Clarify (I know I wouldn’t). &lt;/p&gt;

&lt;p&gt;And because this situation is a rarity, we want to be able to handle it as an exceptional case, as opposed to the norm.&lt;/p&gt;

&lt;h2&gt;One solution: use a different text box control&lt;/h2&gt;

&lt;p&gt;The multi-line text box control within Clarify does not allow the font to be set independently (either at design time or at run time). Instead, we can use a different text box control that does allow for this. One example is the Microsoft Forms 2.0 Textbox.&lt;/p&gt;

&lt;p&gt;The plan:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Add a 2nd textbox to the form. &lt;/li&gt;

  &lt;li&gt;Allow the user to click a link if the text isn’t rendering properly. &lt;/li&gt;

  &lt;li&gt;This button will copy the contents of the default textbox into the new textbox. &lt;/li&gt;

  &lt;li&gt;The new textbox will have its font set to a fixed width font &lt;/li&gt;

  &lt;li&gt;Hide the baseline textbox &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this example, we’ll use the Communication form.&lt;/p&gt;

&lt;h3&gt;Design the form in UI Editor&lt;/h3&gt;

&lt;p&gt;We’ll add a new label that will “switch” the text boxes.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/ui_editor_form_0BD6A929.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ui_editor_form" border="0" alt="ui_editor_form" src="http://blogs.dovetailsoftware.com/blogs/gsherman/ui_editor_form_thumb_64BBE9E6.jpg" width="615" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Add a new ActiveX control to the form. In this case, it’s the Microsoft Forms 2.0 TextBox.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/insert_activex_23AD6A82.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="insert_activex" border="0" alt="insert_activex" src="http://blogs.dovetailsoftware.com/blogs/gsherman/insert_activex_thumb_46FA5F27.jpg" width="371" height="358" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Next, set the properties on the textbox.&lt;/p&gt;

&lt;p&gt;Notice the we’ve set:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Font: Courier &lt;/li&gt;

  &lt;li&gt;Locked: Yes &lt;/li&gt;

  &lt;li&gt;Scroll Bars: Both &lt;/li&gt;

  &lt;li&gt;MultiLine: Yes &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/ui_editor_property_663D05FA.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="ui_editor_property" border="0" alt="ui_editor_property" src="http://blogs.dovetailsoftware.com/blogs/gsherman/ui_editor_property_thumb_01755EFC.jpg" width="425" height="753" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;Add a bit of ClearBasic code:&lt;/h3&gt;

&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;p&gt;Sub Form_Load() 
          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Me.DoDefault 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lbl_switch.Tag = &amp;quot;system&amp;quot; 

          &lt;br /&gt;End Sub&lt;/p&gt;

        &lt;p&gt;Sub lbl_switch_click() 
          &lt;br /&gt;If lbl_switch.Tag = &amp;quot;system&amp;quot; Then 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; mstextbox.Value = txtBody.Text 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; mstextbox.Font.Name = &amp;quot;Courier&amp;quot; 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; txtBody.Visible = False 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lbl_switch.Caption = &amp;quot;Display Message Text in the System Font&amp;quot; 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lbl_switch.Tag = &amp;quot;fixed_width&amp;quot; 

          &lt;br /&gt;Else 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; txtBody.Visible = True 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lbl_switch.Caption = &amp;quot;Text not formatted properly? Click here to switch to a fixed width font.&amp;quot;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; lbl_switch.Tag = &amp;quot;system&amp;quot; 

          &lt;br /&gt;End If 

          &lt;br /&gt;End Sub&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;h3&gt;And now our form renders like so:&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/communication_44712D69.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="communication" border="0" alt="communication" src="http://blogs.dovetailsoftware.com/blogs/gsherman/communication_thumb_71861A37.jpg" width="600" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;and clicking the link changes the form to:&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/communication_fixed_width_1E9B0706.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="communication_fixed_width" border="0" alt="communication_fixed_width" src="http://blogs.dovetailsoftware.com/blogs/gsherman/communication_fixed_width_thumb_01B1E231.jpg" width="606" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;h2&gt;An alternative solution: display the text in a dialog&lt;/h2&gt;

&lt;p&gt;Instead of swapping out text boxes, we can simply popup a new dialog window.&lt;/p&gt;

&lt;p&gt;We’ll use the Dialog capabilities of BasicScript (the underlying scripting engine of ClelarBasic). Dialogs such as this are rarely used, but I’ve never had an with them.&lt;/p&gt;

&lt;p&gt;The reason I chose a Dialog object is that you can set the font programmatically.&lt;/p&gt;

&lt;h3&gt;The ClearBasic code:&lt;/h3&gt;

&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;td&gt;
        &lt;p&gt;Sub Form_Load() 
          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Me.DoDefault 

          &lt;br /&gt;End Sub &lt;/p&gt;

        &lt;p&gt;Begin Dialog TextBoxDialog 20,20,500,420,&amp;quot;Text (in a fixed width font)&amp;quot; 
          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; OKButton 450,10,40,14 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; TextBox 10,10,400,400,.Textbox1,1 Or &amp;amp;H8000,&amp;quot;Courier&amp;quot; 

          &lt;br /&gt;End Dialog &lt;/p&gt;

        &lt;p&gt;Sub DisplayTextDialog(textToDisplay As String) 
          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dim textDialog As TextBoxDialog 

          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; textDialog.TextBox1=textToDisplay&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Dialog textDialog,-1,0 

          &lt;br /&gt;End Sub &lt;/p&gt;

        &lt;p&gt;Sub lbl_dialog_click() 
          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; DisplayTextDialog txtBody.Text 

          &lt;br /&gt;End Sub&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p&gt;Notice that we’ve set the font to Courier when defining the TextBox. Even though we set it at design time, I had to also set it at runtime to make it work.&lt;/p&gt;

&lt;h3&gt;Now clicking the link, will display a Dialog:&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/dialog_60BE6F89.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="dialog" border="0" alt="dialog" src="http://blogs.dovetailsoftware.com/blogs/gsherman/dialog_thumb_201C231A.jpg" width="514" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;h2&gt;Fun with ASCII Art&lt;/h2&gt;

&lt;p&gt;While looking for some examples of formatted text, I stumbled into the &lt;a href="http://www.google.com/search?q=ascii+art"&gt;wide world of ASCII art&lt;/a&gt;. wow. some people have a LOT of time on their hands. (BTW, check out the Google logo when you &lt;a href="http://www.google.com/search?hl=en&amp;amp;q=ascii+art&amp;amp;btnG=Search"&gt;search for ascii art&lt;/a&gt;)&lt;/p&gt;

&lt;pre&gt;                           !
                          /^\
                        /     \
     |               | (       ) |               |
    /^\  |          /^\ \     / /^\          |  /^\
    |O| /^\        (   )|-----|(   )        /^\ |O|
    |_| |-|    |^-^|---||-----||---|^-^|    |-| |_|
    |O| |O|    |/^\|/^\||  |  ||/^\|/^\|    |O| |O|
    |-| |-|    ||_|||_||| /^\ |||_|||_||    |-| |-|
    |O| |O|    |/^\|/^\||(   )||/^\|/^\|    |O| |O|
    |-| |-|    ||_|||_||||   ||||_|||_||    |-| |-|
    |O| |_|----|___|___|||___|||___|_|_|    |O| |O|
    |_|                                         |_|
       /_______________________________________\
    __|_______________________________________|___|&lt;/pre&gt;

&lt;h2&gt;&amp;#160;&lt;/h2&gt;

&lt;h2&gt;Other Ideas?&lt;/h2&gt;

&lt;p&gt;Got some other ideas on how to solve this problem? Lets hear them! Leave a comment, or &lt;a href="mailto:gary@dovetailsoftware.com"&gt;drop me an email&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11910" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/k_meFl32paw" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/clarify+amdocs/default.aspx">clarify amdocs</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/customization/default.aspx">customization</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/ClearBasic/default.aspx">ClearBasic</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/09/02/displaying-text-using-a-fixed-width-font-in-the-clarify-client.aspx</feedburner:origLink></item><item><title>Amdocs Product Support: this month's winning customer is: an Amdocs employee!</title><link>http://feedproxy.google.com/~r/GarySherman/~3/5sHoHmzw0Lg/amdocs-product-support-this-month-s-winning-customer-is-an-amdocs-employee.aspx</link><pubDate>Wed, 05 Aug 2009 19:39:40 GMT</pubDate><guid isPermaLink="false">5c171a62-8cd2-4aac-8f20-46c3ac3f3269:11865</guid><dc:creator>gsherman</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.dovetailsoftware.com/blogs/gsherman/comments/11865.aspx</comments><wfw:commentRss>http://blogs.dovetailsoftware.com/blogs/gsherman/commentrss.aspx?PostID=11865</wfw:commentRss><wfw:comment>http://blogs.dovetailsoftware.com/blogs/gsherman/rsscomments.aspx?PostID=11865</wfw:comment><description>&lt;p&gt;I received this email from Amdocs Product Support, announcing the winning customer for this month.&lt;/p&gt;  &lt;p&gt;For this month, the winning &lt;strong&gt;*customer*&lt;/strong&gt; is: an Amdocs employee. &lt;/p&gt;  &lt;p&gt;&amp;lt;shaking head in disbelief&amp;gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.dovetailsoftware.com/blogs/gsherman/WindowsLiveWriter/AmdocsProductSupportthismonthswinningcus_CE28/amdocs_2.jpg"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px;" height="817" alt="amdocs" src="http://blogs.dovetailsoftware.com/blogs/gsherman/WindowsLiveWriter/AmdocsProductSupportthismonthswinningcus_CE28/amdocs_thumb.jpg" width="839" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.dovetailsoftware.com/aggbug.aspx?PostID=11865" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/GarySherman/~4/5sHoHmzw0Lg" height="1" width="1"/&gt;</description><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/clarify+amdocs/default.aspx">clarify amdocs</category><category domain="http://blogs.dovetailsoftware.com/blogs/gsherman/archive/tags/wtf/default.aspx">wtf</category><feedburner:origLink>http://blogs.dovetailsoftware.com/blogs/gsherman/archive/2009/08/05/amdocs-product-support-this-month-s-winning-customer-is-an-amdocs-employee.aspx</feedburner:origLink></item></channel></rss>
