<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns="http://purl.org/rss/1.0/" xmlns:l="http://purl.org/rss/1.0/modules/link/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
 <!-- Generated by Ektron CMS400.NET -->
 <channel rdf:about="http://www.skonet.com/Resources/Articles/Read.aspx?blogid=91">
  <title>Articles</title>
  <link>http://www.skonet.com/Resources/Articles/Read.aspx?blogid=91</link>
  <description></description>
  <dc:date>2010-09-07T22:56:29Z</dc:date>
  <dc:language>en-US</dc:language>
  <items>
   <rdf:Seq>
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Visio_Macro_To_List_Document_Tabs.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Helpful_Sql_Scripts_for_Ektron_CMS_400_Net.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Programmatically_Enable_ThickBox_Functionality_in_Ektron_CMS_400_Net.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/CMS400-Plugin_Event_Log_Errors.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/TortoiseSVN_Global_Ignore_Pattern.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Shrink_or_Clear_Out_Large_SQL_Server_Log_Files.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Enable_Aliases_With_Localized_Content.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Online_Project_Management_Systems.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Purge_Content_and_Asset_History_Utility.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Run_IIS_and_Apache_on_the_Same_Machine.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_NET_Helper_Utilities.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Search.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_eSync.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_eSync_Error_Generating_Security_Certificates.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_eSync_Failing_With_Faulted_State_Error_Message.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_Upgrade_on_Replicated_SQL_Server_Instance.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Progressive_Solution_for_Handling_Browsers_That_Have_Disabled_JavaScript_for_Your_Web_Site.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Take_an_IIS_Web_Site_Offline.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_To_Disable_Ektron_Modules_and_Handlers_in_IIS_7_Virtual_Applications.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Enable_SMTP_Authentication_for_Outlook_2007.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Redirect_Reference_for_Microsoft_IIS_6_0.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Leverage_machine_config_comments_to_Learn_How_to_Configure_Your_ASP_NET_Web_Sites.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Script_to_Start-Stop_All_Running_Ektron_Services_on_Local_Workstation.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Salesforce_com_Web-To-Lead_CSharp_Class.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/PHP_Flickr_Photo_Rotator_Class.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Web_Page_Layout.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Breaking_HttpModule_Inheritance_-_InheritInChildApplications.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Generic_JavaScript_Page_onLoad_Event_Handler.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Take_a_Screenshot_of_a_Windows_Media_Video_Movie.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Tips_to_Protect_Yourself_From_Phishing_Schemes.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Configure_Custom_QuickLinks_in_Ektron.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Convert__NET_DateTime_to_UNIX_Timestamp.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Encoding_and_Downloading_FLV_Media.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_API_to_Access_Localization_Tag.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/How_to_Delete_a_Windows_Service.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/Ektron_Issues_with_Redirecting_Submitted_Form_Data.aspx?blogid=91" />
    <rdf:li rdf:resource="http://www.skonet.com/Articles_Archive/SharePoint_Wiki_Homepage_Not_Working.aspx?blogid=91" />
   </rdf:Seq>
  </items>
 </channel>
 <item rdf:about="/Articles_Archive/Visio_Macro_To_List_Document_Tabs.aspx?blogid=91">
  <title>Visio Macro To List Document Tabs</title>
  <link>http://www.skonet.com/Articles_Archive/Visio_Macro_To_List_Document_Tabs.aspx?blogid=91</link>
  <description><![CDATA[<p>Some I wrote up quickly to throw a sequential list of all the tabs (pages) of a Microsoft Visio document into a Shape (e.g. table of contents). Create your overview page Drop a shape onto the canvas Open the shape</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-06-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I wrote up quickly to throw a sequential list of all the tabs (pages) of a Microsoft Visio document into a Shape (e.g. table of contents).</p>
<ol>
<li>Create your overview page</li>
<li>Drop a shape onto the canvas</li>
<li>Open the shape sheet and assign the sheet a name (mine is called "Tabs")</li>
<li>Open the VBA editor (ALT + F11)</li>
<li>Paste the code from below into your document's code window</li>
<li>Make sure the name of your shape matches the <em>Shape</em> reference in the code</li>
<li>Right-click the shape and assign a macro behavior to the new macro/method</li>
<li>Double-click the shape</li>
<li>You're welcome</li>
</ol>
<pre class="code">
Public Sub FillOverViewPage()
    Dim vsoChars As Visio.Characters
    Dim vsoPages As Visio.Pages
    Dim i As Integer
    
    Set vsoPages = Me.Pages
    Set vsoChars = Me.Pages(1).Shapes("Tabs").Characters
    
    ' clear whats in there now
    vsoChars.Text = ""
    
    ' loop pages and add page name to the chars
    For i = 1 To vsoPages.Count
        If vsoPages(i).Background = False Then
            vsoChars.Text = vsoChars.Text &amp; i &amp; " - " &amp; vsoPages(i).Name &amp; vbCrLf
        End If
    Next i
End Sub
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Helpful_Sql_Scripts_for_Ektron_CMS_400_Net.aspx?blogid=91">
  <title>Helpful Sql Scripts for Ektron CMS 400.Net</title>
  <link>http://www.skonet.com/Articles_Archive/Helpful_Sql_Scripts_for_Ektron_CMS_400_Net.aspx?blogid=91</link>
  <description><![CDATA[<p>Helpful Sql Scripts for Ektron CMS 400.Net A compilation of various SQL scripts I have acquired, modified or written myself to perform various tasks not possible through the workarea (at least as of 8.0). Disclaimer if you are downloading and</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-06-12T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>A compilation of various SQL scripts I have acquired, modified or written myself to perform various tasks not possible through the workarea (at least as of 8.0).</p>
<p><em>Disclaimer: if you are downloading and utilizing these scripts, one can only assume you are familiar with SQL Server and: 1) have backed up your database, 2) have tested on a dev or staging instance, 3) run uncommitted until you are certain the appropriate results have been verified. I have spoken.</em></p>
<ul>
<li><a title="Ektron Find Replace In Content Html" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_Content_Html.txt" target="_blank">Ektron Find Replace In Content Html</a>—Script to search and replace specific content/phrases through the entire content table. This script can be modified to handle different scenarios as well.</li>
<li><a title="Ektron Find Replace In Library" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_Library.txt" target="_blank">Ektron Find Replace In Library</a>—Script to search and replace specific library links.</li>
<li><a title="Ektron Find Replace In SiteMap" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_In_SiteMap.txt" target="_blank">Ektron Find Replace In SiteMap</a>— Script to search and replace sitemap links/titles/etc.</li>
<li><a title="Ektron Find Replace Library Folder Names" href="http://www.skonet.com/uploadedFiles/Snippets/Sql_Server/Ektron_Find_Replace_Library_Folder_Names.txt" target="_blank">Ektron Find Replace Library Folder Names</a>—Script to rename folder paths of renamed cms folders. </li>
<li>Ektron Retrieve Current Version Script— 

<pre style="HEIGHT: 70px" class="code">
select convert(varchar,version) from settings
</pre></li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Programmatically_Enable_ThickBox_Functionality_in_Ektron_CMS_400_Net.aspx?blogid=91">
  <title>How to Programmatically Enable ThickBox Functionality in Ektron CMS 400.Net</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Programmatically_Enable_ThickBox_Functionality_in_Ektron_CMS_400_Net.aspx?blogid=91</link>
  <description><![CDATA[Ektron CMS 400.Net includes a proprietary version of jQuery  to handle most if not all its DHTML/AJAX client-side requirements. I wanted to demonstrate how a developer could leverage the out-of-box ThickBox (lightbox, etc.) functionality that is used throughout the Ektron components.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-04-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p><a target="_blank" title="Ektron CMS 400.Net" href="http://www.ektron.com">Ektron CMS 400.Net</a> includes a <a target="_blank" title="proprietary version" href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=17838">proprietary version</a> of <a target="_blank" title="jQuery" href="http://www.jquery.org">jQuery</a> to handle most if not all its DHTML/AJAX client-side requirements. I wanted to demonstrate how a developer could leverage the out-of-box <a target="_blank" title="ThickBox" href="http://jquery.com/demo/thickbox/">ThickBox</a> (lightbox, etc.) functionality that is used throughout the Ektron components. Do not include your own jQuery library (unless you are forced to). You will end up killing your site performance by loading two complete jQuery libraries.</p>
<ol>
<li>Make sure the Ektron version of the ThickBox library is loaded. The easiest and least conflicting way is to register the JavaScript and StyleSheet in your .CS page OnInit or OnLoad events:
<pre class="code">// make sure we're loading the ektron thickbox script<br />Ektron.Cms.API.JS.RegisterJS(this, Ektron.Cms.API.JS.ManagedScript.EktronThickBoxJS);<br />Ektron.Cms.API.Css.RegisterCss(this, Ektron.Cms.API.Css.ManagedStyleSheet.EktronThickBoxCss);</pre></li>
<li>Tag your links with the necessary Ektron ThickBox class name:
<pre class="code">class="ek_thickbox"</pre></li>
<li>Modify any Ektron ThickBox attributes (based on the standard ThickBox URL tags):
<pre class="code">href="http://www.example.org?KeepThis=true&amp;EkTB_iframe=true&amp;height=500&amp;width=750</pre></li>
<li>Done!</li>
</ol>
<p>Obviously there is much more you can do to customize your interface, styles, etc. But for a quick and dirty yet functional "lights out" effect, you can't beat this.</p>
<p>Carry on.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/CMS400-Plugin_Event_Log_Errors.aspx?blogid=91">
  <title>CMS400-Plugin Event Log Errors</title>
  <link>http://www.skonet.com/Articles_Archive/CMS400-Plugin_Event_Log_Errors.aspx?blogid=91</link>
  <description><![CDATA[<p>Ektron has a snazzy <a href="../../../../../../../../../../../../../../workarea/help/Extra%20developer%20topics/Plug-in%20Architecture.htm" title="plug-in framework" target="_blank" style="">plug-in framework</a> that 
allows developers to write applications that hook directly into the CMS 
event model, thereby allowing us to create our own logic that is handled
 inline, alongside, within the CMS's.</p>
<p>If you have installed the <a href="../../../../../../../../../../../../../../workarea/help/Extra%20developer%20topics/DeveloperSDK.htm#DeveloperSDK_1781729295_1007576" title="Ektron Developer SDK" target="_blank" style="">Ektron Developer SDK</a> 
as part of your core platform installation, this service will run 
automatically and has a couple of default plug-ins (Google, etc.) that 
run after installation.</p>
<p>The problem is that out of the box, these modules are not configured,
 so every time someone does anything in the work area that causes the 
plug-ins to fire, you <em>may</em> get errors.</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-04-08T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Ektron has a snazzy <a href="http://www.skonet.com/workarea/help/Extra%20developer%20topics/Plug-in%20Architecture.htm" title="plug-in framework" target="_blank">plug-in framework</a> that allows developers to write applications that hook directly into the CMS event model, thereby allowing us to create our own logic that is handled inline, alongside, within the CMS's.</p>
<p>If you have installed the <a href="http://www.skonet.com/workarea/help/Extra%20developer%20topics/DeveloperSDK.htm#DeveloperSDK_1781729295_1007576" title="Ektron Developer SDK" target="_blank">Ektron Developer SDK</a> as part of your core platform installation, this service will run automatically and has a couple of default plug-ins (Google, etc.) that run after installation.</p>
<p>The problem is that out of the box, these modules are not configured, so every time someone does anything in the work area that causes the plug-ins to fire, you <em>may</em> see errors similar to this in your Event Viewer/Log:</p>
<p><img src="http://www.skonet.com/uploadedImages/Ektron CMS-PlugIn Event Log Error.png" alt="Ektron CMS-PlugIn Event Log Error" title="Ektron CMS-PlugIn Event Log Error" /></p>
<p>This can be somewhat annoying when dealing with larger CMS sites that have hundreds or thousands of users, constantly adding, editing, and deleting content. I would imagine most installations do not need the service running, and it was probably installed by accident by the system/server administrator. In these circumstances, the easiest thing to do is to just disable the service in the Windows Services Manager. However, if you actually have a need for the plug-in service to run, you will need to manually configure the problematic plug-ins through the <a href="http://www.skonet.com/workarea/help/Extra%20developer%20topics/Configuring_a_Plug_in_Ex.htm#Plug_in_Architecture_185590548_1053631" title="Extensibility Configuration Editor" target="_blank">Extensibility Configuration Editor</a>. More than likely your developers have already done this is probably irrelevant.</p>
<p>Hopefully this helps someone searching for a reason for all the "CMS-Plugin" even log errors.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/TortoiseSVN_Global_Ignore_Pattern.aspx?blogid=91">
  <title>TortoiseSVN Global Ignore Pattern</title>
  <link>http://www.skonet.com/Articles_Archive/TortoiseSVN_Global_Ignore_Pattern.aspx?blogid=91</link>
  <description><![CDATA[I use Subversion as my version control system both at work and at home. To interact with the various Subversion repositories, I use TortoiseSVN, a SCM / source control software for Microsoft Windows and possibly the best standalone Subversion client there is. Over the years I have amassed a somewhat lengthy global ignore pattern used to prevent unversioned files from showing up in the commit dialog.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-04-07T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I use <a href="http://subversion.apache.org/" target="_blank">Subversion</a> as my version control system both at work and at home. To interact with the various Subversion repositories, I use <a title="TortoiseSVN" href="http://tortoisesvn.net/" target="_blank">TortoiseSVN</a>, a SCM / source control software for Microsoft Windows and possibly the best standalone Subversion client there is. Over the years I have amassed a somewhat lengthy <a title="global ignore pattern" href="http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-settings.html" target="_blank">global ignore pattern</a> used to prevent unversioned files from showing up in the commit dialog.</p>
<p>There are exclusions for standard <a title="Ektron" href="http://www.ektron.com/" target="_blank">Ektron</a> folders and files, Visual Studio files, etc. I expect to update this as I add/remove from my client on a regular basis.</p>
<p>Enjoy!</p>
<pre class="code">
#*# *.*~ *.a *.al *.back *.cer *.csproj.user *.data *.la *.lo *.o *.pfx *.pvk *.pyc *.pyo *.rej *.resharperoptions *.so *.so.[0-9]* *.suo *.swd *.swo *.swp *.tmp *.user *.webinfo *~ .#* .*.swp .DS_Store .libs .project .settings .svn EkDAVlog.txt EktSyncStatus PrivateAssets Thumbs.db [Aa]dx [Aa]sset[Mm]anagement [Aa]ssets [Dd]ebug [Pp]rivate[Aa]ssets [Rr]elease [Uu]ploaded[Ff]iles [Uu]ploaded[Ii]mages [Ww]idgets [Ww]orkarea _Resharper* _UpgradeReport_Files aspnet_client bin obj *.msi *.exe
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Shrink_or_Clear_Out_Large_SQL_Server_Log_Files.aspx?blogid=91">
  <title>How To Shrink or Clear Out Large SQL Server Log Files</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Shrink_or_Clear_Out_Large_SQL_Server_Log_Files.aspx?blogid=91</link>
  <description><![CDATA[While migrating our database server environment, I was reminded how huge
 SQL Server transaction log files can get. Of course in a development 
environment, transaction logs are irrelivant, so prior to migrating it 
is always best to truncate the log files as not to move GIGs of log 
files. These are the ways I am aware of to do such a thing.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-04-06T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>First, let me preface this article for all you SQL Server DBAs reading this, in no way am I recommending that the following procedure be used in a production (or development depending on your restoration policy) environment unless you know what you are doing, and are aware of the repercussions to clearing the transaction logs. If not, feel free to read <a target="_blank" title="Aaron Bertrand's post on the topic" href="http://sqlblog.com/blogs/aaron_bertrand/archive/2009/07/27/oh-the-horror-please-stop-telling-people-they-should-shrink-their-log-files.aspx">Aaron Bertrand's post on the topic</a>. The main purpose of this article is for those that are in the same situation I often find myself, quickly configured databases in a development environment that do <strong>NOT</strong> require transactions <strong>NOR</strong> restoration to any other point other than the last FULL database backup (*.bak).</p>
<p>Now, on to the article...</p>
<p>While migrating our <strong>development</strong> database server environment, I was reminded how huge SQL Server transaction log files can get. Of course in a development environment, transaction logs <strike>are</strike> may be irrelevant, so prior to migrating it is always best to truncate the log files as not to move GIGs of log files. These are the ways I am aware of to do such a thing.</p>
<p>First, perform a FULL DB BACKUP of the database (yes, seems redundant, but you will be glad if something fails and you don't lose a days worth of work.)</p>
<p><strong>Update: </strong>I've been getting so much flak from people in the community using truncate_only, I have decided to scratch it out. Continue to the recommended method below.</p>
<p><strike>You can use the following SQL command to backup the log file while truncating the existing logs <em>(note: this is deprecated in 2008)</em>:</strike></p>
<pre class="code" style="height: 100px;"><strike>backup log [dbname] with truncate_only<br />go<br /><br />dbcc shrinkdatabase ([dbname], 10, truncateonly)<br />go</strike><br /></pre><p>OR</p>
<p>You can do the same through SQL Server Management Studio:</p>
<ol>
<li>Right click the database to be "shrunk" | Properties</li>
<li>Under Select a page click Options</li>
<li>Change Recovery Model to Simple | Ok</li>
<li>Right click the database | Tasks | Shrink | Database | Ok</li>
<li>Make sure to set the recovery mode back to Full (or not, depending on your needs)</li>
<li>Done!</li>
</ol>
<p>Obviously if you are in a production environment, you probably want to actually backup your logs before you truncate.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Enable_Aliases_With_Localized_Content.aspx?blogid=91">
  <title>How to Enable Aliases With Localized Content</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Enable_Aliases_With_Localized_Content.aspx?blogid=91</link>
  <description><![CDATA[By default, the disable language awareness flag is "disabled" (ironic). 
By enabling this flag, the content for the specific language will 
display based the alias of the default language content block.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-03-27T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>This past week I had a client ask me to look into an issue they were having with their localized content not inheriting the content block's alias for the default language. I have quite a bit of localization background, but to be honest, I had not worked a lot with aliases on localized sites (we never used the built in aliasing with Ektron with the previous localized sites.) The problem was that the page rendering the content block for the default language would work, but when the site language ID was changed, the localized requests would fail (404 errors).</p>
<p>I had begun to write a custom application to manually assign the aliases to the localized content blocks, but found a buried configuration flag within the aliasing modules that resolves this issue.</p>
<p>By default, the disable language awareness flag is "disabled" (ironic). By enabling this flag, the content for the specific language will display based the alias of the default language content block.</p>
<ol>
<li>Log in to the work area as administrator</li>
<li>Browse to Settings | Configuration | Url Aliasing | Settings</li>
<li>Enter edit mode</li>
<li>Check the <strong>Disable Language Awareness</strong> checkbox</li>
<li>Save your settings<br /></li>
</ol>
<p>Also keep in mind that if you have multiple aliases for a single content block, you must set the alias you want to cascade down to be the "default" alias or else your localized content blocks will not inherit the desired alias.</p>
<p>Here is the help link reference to <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=URL_aliasing_KY.78.38.html" title="enable language aware aliases" target="_blank">enable language aware aliases</a>.</p>
<p><img src="http://www.skonet.com/uploadedImages/ektron_disable_language_awareness.png" alt="Ektron Disable Language Awareness Flag" title="Ektron Disable Language Awareness Flag" /></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Online_Project_Management_Systems.aspx?blogid=91">
  <title>Online Project Management Systems</title>
  <link>http://www.skonet.com/Articles_Archive/Online_Project_Management_Systems.aspx?blogid=91</link>
  <description><![CDATA[I have been asked on more than one occasion what online project management solution I would recommend. After emailing this list time over, I have decided to post it, permanently, on my site. For now, most of my ratings are]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-03-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have been asked on more than one occasion what <a href="http://en.wikipedia.org/wiki/Project_management_software" title="online project management solution" target="_blank">online project management solution</a> I would recommend. After emailing this list time over, I have decided to post it, permanently, on my site.</p>
<p>For now, most of my ratings are based on a combination of cost/user/feature comparison. Nothing mathematical or statistical (yet.) I hope to write more on each one as I have time to review them more.</p>
<p>I will caveat this by saying I have signed up for a trial account for all of these so I can at least say I have looked at them to a certain extent.</p>
<p>At work, we use <a href="http://www.aceproject.com" title="Ace Project" target="_blank">Ace Project</a>. Mainly because back when I was evaluating solutions, it was the best bang for the buck (and offered a hosted solution with unlimited users.)</p>
<p>Enjoy.</p>
<table cellpadding="0" class="matrix" cellmargin="0">
<tbody>
<tr>
<th>Application Name</th>
<th width="1%">Recommended</th>
</tr>
<tr class="even">
<td><a href="http://www.project-open.org/" target="_blank">Project-Open</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.assembla.com/" target="_blank">Assembla</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="even">
<td><a href="http://www.deskaway.com/index.php" target="_blank">DeskAway</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.dotproject.net/" target="_blank">dotProject</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.easyprojects.net/" target="_blank">EasyProjects</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.fogcreek.com/FogBugz/" target="_blank">FogBugs</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.liquidplanner.com/" target="_blank">Liquid Planner</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://nokahuna.com/" target="_blank">NoKahuna</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://projects.zoho.com/" target="_blank">Zoho Projects</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.phprojekt.com/" target="_blank">PHProjekt</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.aceproject.com/" target="_blank">Ace Project</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.huddle.net/price-plans/" target="_blank">Huddle</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://basecamphq.com/" target="_blank">BaseCamp</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.creativeprooffice.com/" target="_blank">CreativePro Office</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_down.png" alt="Thumbs Down" title="Thumbs Down" /></td>
</tr>
<tr class="even">
<td><a href="http://www.proofhub.com/" target="_blank">Proof Hub</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://www.taskfreak.com/" target="_blank">TaskFreak</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="even">
<td><a href="http://www.thymer.com/" target="_blank">Thymer</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
<tr class="odd">
<td><a href="http://unfuddle.com/" target="_blank">Unfuddle</a></td>
<td class="center"><img width="16" height="16" border="0" src="http://www.skonet.com/virtual/images/silk/thumb_up.png" alt="Thumbs Up" title="Thumbs Up" /></td>
</tr>
</tbody>
</table>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_Purge_Content_and_Asset_History_Utility.aspx?blogid=91">
  <title>Ektron CMS400.Net Purge Content and Asset History Utility</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Purge_Content_and_Asset_History_Utility.aspx?blogid=91</link>
  <description><![CDATA[If you are stuck with a DMS heavy CMS instance, with very limited 
disk-space, you need to read this.<br />]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-03-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>We ran into a scenario on one of our asset-heavy CMS instances. The virtual machine ran out of disk-space due to the high number of large DMS assets in the CMS. We were quickly able to clear out the disk to solve the immediate need, but I was left wondering how we could clean out old or archived assets versions that were irrelevant and unnecessary moving forward.</p>
<p>After <a target="_blank" title="tweeting" href="http://twitter.com/skowronek/status/10180888024">tweeting</a> about it, searching the forums, and even pinging my internal Ektron contacts, I was still no closer to a finding a satisfactory solution.</p>
<p>So, I decided to ask Ektron support. Kudos to knowledgeable Ektron support engineering for having the answer to my question.</p>
<p>Though it it does not do <em>exactly</em> what I had hoped, it is close enough.</p>
<p>If you are stuck with a DMS heavy CMS instance, with very limited disk-space, be sure to bookmark the following link, <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=ManagingContentFolders.61.14.html#1034768" title="Ektron CMS Purge History Option" target="_blank">Ektron CMS Purge History Option</a>.</p>
<p>The utility will allow you clear out versioned content and assets based on:</p>
<ol>
<li>A specific date before which historical versions are purged</li>
<li>A folder and subfolders</li>
<li>Published as well as checked-in versions of content</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Run_IIS_and_Apache_on_the_Same_Machine.aspx?blogid=91">
  <title>How to Run IIS and Apache on the Same Machine</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Run_IIS_and_Apache_on_the_Same_Machine.aspx?blogid=91</link>
  <description><![CDATA[<p>I have decided to consolidate various how-to's on configuring<a target="_blank" title="Apache" href="http://httpd.apache.org" style="">Apache</a><a target="_blank" title="IIS" href="http://www.iis.net" style="">IIS</a></p>
<p>andto run on the same machine 
but on different IP addresses.</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-03-02T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have decided to consolidate various how-to's on configuring <a target="_blank" title="Apache" href="http://httpd.apache.org">Apache</a> and <a target="_blank" title="IIS" href="http://www.iis.net">IIS</a> to run on the same machine but on different IP addresses.</p>
<p>This how-to assumes you have IIS and Apache installed and configured to do everything, but cannot get them to run simultaneously.</p>
<h2>Bind IIS to Specific IP Addresses</h2>
<ol>
<li>Make sure your machine has two IP addresses</li>
<li>For IIS 7<ol>
<li>Stop IIS services</li>
<li>Open a command prompt</li>
<li>Type <strong>netsh</strong></li>
<li>Type <strong>http</strong></li>
<li>Type <strong>sho iplisten</strong>. <em>(It should be blank)</em></li>
<li>Type <strong>add iplisten ipaddress=XXX.XXX.XXX.XXX</strong> (IP address to bind IIS to)<br />You should get IP address successfully added message</li>
<li>Type <strong>add iplisten ipaddress=127.0.0.0</strong> (this allows for localhost browsing)<br />You should get IP address successfully added message</li>
<li>Type <strong>sho iplisten</strong><br />It should show XXX.XXX.XXX.XXX and 127.0.0.0 in the list</li>
<li>Type <strong>exit</strong> to get out of netsh</li>
<li>Start IIS services<br /></li>
<li>Type <strong>netstat -an</strong>. Only XXX.XXX.XXX.XXX:80 and 127.0.0.0:80 should be bound to port :80.</li>
</ol>
</li>
<li>For IIS 6 <ol>
<li><a title="Follow the Microsoft KB Article" href="http://support.microsoft.com/kb/813368/EN-US/" target="_blank">Follow the Microsoft KB Article</a></li>
</ol>
</li>
</ol>
<h2>Bind Apache to Specific IP Address</h2>
<ol>
<li>Open httpd.conf</li>
<li>Set IP bindings to listen to the alternate IP and port
<ol>
<li>Listen XXX.XXX.XXX.YYY:80</li>
</ol>
</li>
<li>Restart the Apache service (httpd -k stop, httpd -k start)</li>
</ol>
<h2>Verify Bindings</h2>
<ol>
<li>Open command prompt</li>
<li>Type <strong>netstat -an</strong></li>
<li>You should see XXX.XXX.XXX.XXX:80, 127.0.0.0:80, and XXX.XXX.XXX.YYY:80</li>
<li>Open a browser and test both IP's to see if IIS and Apache come up</li>
</ol>
<p>Thanks to: </p>
<ul>
<li><a href="http://weblogs.asp.net/steveschofield/archive/2007/07/06/iis7-post-44-iis7-and-apache-on-the-same-machine.aspx" target="_blank">Steve Shofield</a></li>
<li><a title="Vijay Ganesh" href="http://geekswithblogs.net/vganesh/archive/2005/07/19/47619.aspx" target="_blank">Vijay Ganesh</a></li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_NET_Helper_Utilities.aspx?blogid=91">
  <title>Ektron CMS400.NET Helper Utilities</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_NET_Helper_Utilities.aspx?blogid=91</link>
  <description><![CDATA[In hopes to get these utilities in the public (and search engine) lime-light, I am posting the content of the Utilities.doc file of the CMS 400.Net program folder. If you are not familiar with these (as I myself haven't even taken advantage of all of them yet), I would urge that you at least read over this so you are familiar with them and what they do.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-03-01T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>In hopes to get these utilities in the public (and search engine) limelight, I am posting the content of the Utilities.doc file of the <a title="CMS400.Net" href="http://www.ektron.com">CMS400.Net</a> program folder. If you are not familiar with these (as I myself haven't even taken advantage of all of them yet), I would urge that you at least read over this so you are familiar with them and what they do.</p>
<p>Enjoy!</p>
<h2>Utilities Root Programs</h2>
<ul>
<li><strong>AssetWorkerSetup.msi</strong> - Installs a service to allow a user to place DMS assets in a directory to be uploaded to the CMS Database.</li>
<li><strong>CMS400SDK_Setup.exe</strong> - Installs Ektron Plugins so users can add there own Extensions to be used in the workarea.</li>
<li><strong>CreateFolderInfo.exe</strong> - This updates the folder structure for searching and is only run for users upgrading to 6.0 or greater.</li>
<li><strong>DBUpgrade.exe</strong> - This is used only for users upgrading from versions prior to CMS400 5.0 as well as any CMS300 product versions. This will be run automatically as needed during the CMS400 database upgrade setup.</li>
<li><strong>EktronNotificationService.exe</strong> - This executable will install the Ektron Notification Service. Installing the base installs this service for you.</li>
<li><strong>EncryptEmailPassword.exe</strong> - Tool that encrypts a user's email password for the smtpPass key in the web.config file.</li>
<li><strong>SharePoint_To_CMS.exe</strong> - Integrates CMS400 with SharePoint Portal.</li>
<li><strong>UpdateGAC.msi</strong> - This updates the EktronBasePlugin.dll in the Windows\assembly directory for use with the Ektron Extensibility Server service.</li>
<li><strong>vcredist.msi</strong> - This is run on 64 bit machines only and is used for Esync.</li>
<li><strong>WebAlerts.exe</strong> - Installs Web Alerts so users can send emails to users signed up for alerts on a specific topic.</li>
</ul>
<h2>BigIntUtility Directory</h2>
<p>The BigInt utility updates the Code-Behind files for a website from Ektron 32 bit API's to Ektron's 64 bit API's and has to be done in this version of CMS.</p>
<h2>BuiltinAccountReset</h2>
<p><strong>BuiltinAccountReset.exe</strong> - This will reset your CMS400 user \ password to Builtin \ Builtin incase you forget the Username and Password used login to the workarea.</p>
<h2>CMS Uninstaller</h2>
<p><strong>CompleteUninstall.exe</strong> - This executable will wipe your machine clean of all ektron products. Users can choose to remove a specific website or all websites as well as the application directory. (Use with caution. Once run files will not be able to be restored)</p>
<h2>DMS Directory</h2>
<p><strong>Dms400encryptpassword.exe</strong> - Allows a user to encrypt a password to be used to encrypt password in Workarea &gt; Settings &gt; Configuration &gt; Asset Server Setup &gt; Password. This password must match the one used for the EKT_ASSET_USER on the webserver.</p>
<h2>EWSUpdates Directory</h2>
<p>This directory contains a backup of the Ektron Windows Service 3.0 as well as the older Ektron Window Service file updates for users who upgrade.</p>
<h2>Icons Directory</h2>
<p>This directory holds all the icons used for the start menu shortcuts.</p>
<h2>iFilterPack Directory</h2>
<p>This directory contains the PDF Filter msi's that are installed for dms dragging and dropping.</p>
<h2>MergeCatalog Directory</h2>
<p><strong>MergeCatalog.exe</strong> - This executable is used during the sitesetup.exe to merge indexing catalogs. If a user has more than 3 sets of catalogs than it will begin to merge any new sets of catalogs that are added during future site installations.</p>
<h2>MultiSiteInstall Directory</h2>
<p><strong>Multisite.exe</strong> - This executable is used when a user wishes to setup a multisite environment. It will copy the necessary files from an existing site to directory for your multisite website. It will also configure IIS for the multisite.</p>
<h2>PasswordUpgrade Directory</h2>
<p><strong>PasswordUpgrade.exe</strong> - This executable is used during the sitesetup. If a user is upgrading there website and it's from before version 7.65 this exe will run and update all of your user password encryptions to the new password encryption values.</p>
<h2>QLXFilter Directory</h2>
<p>The QLXFilter.dll is copied to the System32 directory during the base installation. This is used for the searching feature in the CMS.</p>
<h2>ResourceFiles Directory</h2>
<p>This directory holds all the resource files for easy access to the non-binary versions of the resource files.</p>
<h2>SiteSetup Directory</h2>
<p><strong>cms400sitesetup.exe</strong> - Runs the CMS400 Site Setup install.</p>
<h2>Database directory</h2>
<p>Holds all the SQL and Oracle database scripts needed to create the CMS400 database.</p>
<h2>CMS400SiteSetup directory</h2>
<p>Holds all the files that run the CMS400 Site Setup.</p>
<h2>Logs directory</h2>
<p>Holds all the installation logs. Everytime an installation is run a new log is created and everything that occurs during the install is printed in the log.</p>
<h2>Software Directory</h2>
<ul>
<li><strong>Microsoft WSE 3.0msi</strong> - This will install WSE 3.0 which is needed for CMS400.</li>
<li><strong>SearchConfig Folder</strong> - This folder contains the SearchConfigUI.exe that indexes all of your content.</li>
<li><strong>SecurityConfigurator Folder</strong> - This folder contains the SecurityConfigurator.exe. This creates the certificates used for esync to allow users to have Esync talk from the stage machine to the production machine and vice versa.</li>
<li><strong>UrlAliasing Folder</strong> - This folder contains the UrlAliasingUpgradeCmd.exe. This run during a website upgrade and if the site is older than version 7.60. This runs updates for UrlAlias functionality.</li>
</ul>
<h2>SQLGenerator Directory</h2>
<ul>
<li><strong>SQLGenerator.exe</strong> - This executable is used to produce a sql script of your database.</li>
</ul>
<h2>Support Directory</h2>
<ul>
<li><strong>WSPathChecker.exe</strong> - This exe will check all of your websites to make sure the WSPath in each web.config don't match one another.</li>
</ul>
<h2>XMLConfigWriter Directory</h2>
<p>This folder contains dll's used in indexing content and the search feature.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_Search.aspx?blogid=91">
  <title>Ektron CMS400.Net Search</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_Search.aspx?blogid=91</link>
  <description><![CDATA[I've decided to start maintain a repository for things I encounter with Ektron CMS400.Net Search. This includes system issues, programming issues, and cross platform issues. I plan on maintaining this over time. Indesing Services Friendly Names File Includes all custom]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-02-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Over the years, and through many hours of swearing and gnashing of teeth, I have ammassed a substantial treasure-trove of wisdom dealing with the <a title="Ektron CMS400.net" href="http://www.ektron.com" target="_blank">Ektron CMS400.net</a> search. Therefore, I have decided to maintain this repository as a sort of "brain dump", primarily for my benefit in dealing with future issues that may arise, including but not limited to: system issues, programming issues, and cross platform issues.</p>
<h2>Ektron Resoures</h2>
<p>Before starting here, please read the <a title="search troubleshooting" href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.44.html" target="_blank">search troubleshooting</a> and online help for <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.3.html" target="_blank">the catalogs and index files</a>. You'll probably find something there to help you. Otherwise, feel free to continue.</p>
<h2>Nuts and Bolts of Search</h2>
<p>Ektron utilizes <a title="Windows Indexing Services" href="http://msdn.microsoft.com/en-us/library/ee805985%28VS.85%29.aspx" target="_blank">Windows Indexing Services</a> for the bulk of its search. Key things to note: HTML and other text-based content are copied as TXT files with relevant searchable content to the [Assets] and [PrivateAssets] folders. Other asset types (PPT, DOC, XLS, PDF, etc) are parsed using <a title="ifilter technology" href="http://msdn.microsoft.com/en-us/library/aa965717%28VS.85%29.aspx" target="_blank">ifilter technology</a> and corresponding content and meta data are written to the actual file on upload and saved into the <a title="properties, comments" href="http://www.skonet.com/uploadedImages/office_document_properties.gif" target="_blank">properties, comments</a> and <a title="advanced properties" href="http://www.skonet.com/uploadedImages/office_document_advanced_properties.gif" target="_blank">advanced properties</a> of the document. Indexing Services then indexes all TXT and custom attributes of everything under the [Assets] and [PrivateAssets] folders.</p>
<h2>Indexing Services</h2>
<p>Verify Private/Public catalogs have been created for your site. Easiest way to regenerate everything from scratch, is to use the <a title="SearchConfigUI tool" href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.6.html" target="_blank">SearchConfigUI tool</a>.</p>
<p>Also, make sure there are no orphaned catalogs lingering around in the registry:</p>
<pre>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndex\Catalogs
</pre><h2>Friendly Names</h2>
<p>Ektron uses a friendly names mapping file (<a title="DefaultColumnFile" href="http://msdn.microsoft.com/en-us/library/ms692121%28VS.85%29.aspx" target="_blank">DefaultColumnFile</a>) to map meta data keys, smart forms fields, and other search properties to index property names. The file is specified by the following registry key:</p>
<pre>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ContentIndexCommon
</pre><p>Ektron [usually] registers their friendly names txt file under the following path.</p>
<p><strong>Update</strong> - There is a template for the FriendlyNamesDefinitionFile.txt located in the "<a title="Utilities" href="http://www.skonet.com/Articles_Archive/Ektron_CMS_400_NET_Helper_Utilities.aspx">Utilities</a>" folder for the specific version you are running.</p>
<pre>C:\Windows\System32\FriendlyNamesDefinitionFile.txt
</pre><p>This file may not contain all meta data values for your CMS meta data. Verify all your meta data definitions have a record in this files (as well as the custom meta data search you are using.)</p>
<p>Learn more about the <a title="catalog and index files Ektron uses" href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=newsearch.75.3.html" target="_blank">catalog and index files Ektron uses</a>.</p>
<h2>Metaconfig.doc</h2>
<p>Ektron caches Microsoft Office document meta data definitions in the metaconfig.doc file. Confirm the necessary custom properties are defined in the metaconfig.doc. Also confirm that your assets actually have values for these properties saved internally.</p>
<p>Incidentally, I've noticed this file is the same for all sites being hosted on a single server. I imagine that has to due with the single friendly names file that aggregates all custom properties.</p>
<h2>Conclusion</h2>
<p>Like eSync, search, when functioning on all cylinders, is great (and speedy). However, if any one of these systems fail, you may be looking at hours of troubleshooting. Nine times out of ten, the SearchConfigUI tool will fix it. However, for those times where it does not, you can use this reference to dig into each system and verify everything is running smoothly.</p>
<p>Happy searching!</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_CMS400_Net_eSync.aspx?blogid=91">
  <title>Ektron CMS400.Net eSync</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_CMS400_Net_eSync.aspx?blogid=91</link>
  <description><![CDATA[Regardless of your personal opinion of Ektron's eSync technology, you can't help but admit it is a pretty amazing technology. After having used it for the past year or so, I have gained a love hate relationship for it's ability]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-02-12T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Regardless of your personal opinion of Ektron's eSync technology, you can't help but admit it is a pretty amazing technology. After having used it for the past year or so, I have gained a love-hate relationship for it's ability to seamlessly synchronize every aspect of web CMS implementations, and at the same time, cause hours of angst when it fails.</p>
<p>My hope with this article is to ease the burden of troubleshooting other esync implementations out there by documenting various undocumented aspects of Ektron CMS400.Net's esync platform. I imagine someone at Ektron will eventually write a better explanation than this, but for now, I have not been able to locate anything better, and I am willing to write about it!</p>
<p>First, to clarify something. This is not a "how to" setup and configure esync. There are plenty of article and manuals written to assist with your eSync setup. This article is meant to be a deep dive into the inner workings of esync, as I have observed them, in hopes of assisting other developers, system administrators, etc, that may run into similar esync failure scenarios.</p>
<p><em>Disclaimer: I do not claim to be an Ektron engineer, all my findings are based on methodical troubleshooting and countless hours of repairing Ektron related issues. Please contact Ektron support for clarification on anything you find questionable in this article.</em></p>
<h2>CMS License</h2>
<p>Esync requires a valid, current, non-expired, esync enabled license (with (S) or (EN) in the key.) If any of the servers configured in your esync system have an invalid license, <a href="http://www.skonet.com/Articles_Archive/eSync_Failing_With_Faulted_State_Error_Message.aspx">esync will fail</a>.</p>
<h2>Web.config</h2>
<p>The following config sections, attributes, keys, etc. are necessary:</p>
<ol>
<li><strong>eSyncEnabled</strong> Should be set to "true" (individual <a href="http://www.ektron.com/manuals/cms400/v76/UserAdmin/wwhelp/wwhimpl/common/html/wwhelp.htm?context=CMS400_7.6&amp;file=Sync.109.30.html" target="_blank">folder/file sync</a> is disabled w/o this option set to true).</li>
<li><strong>WSPath</strong> Must be set to the web service callback URL in the workarea (Workarea/ServerControlWS.asmx)</li>
</ol>
<h2>Windows Service</h2>
<p>The esync core process is driven by the Ektron Windows Services. If you have it disabled or it is not running for some reason, do not continue. Esync will not function without the service running.</p>
<p>The following files lie under the <em>EktronWindowsService30</em> folder underneath the base installation directory.</p>
<ol>
<li><strong>Ektron.ASM.EktronServices30.exe.config</strong> - Contains valid esync certificate information for the servers that are part of the sync pair. Restoring the <a href="###" onclick="void(0);" title="C:\Program Files\Ektron\CMS400vXX\Utilities\EWSUpdates\EktronWindowsService30">original .config file</a> and restarting the Ektron Windows Service has actually fixed a corrupt configuration for me.</li>
<li><strong>sitedb.config</strong> - Stores each CMS 400.Net site configuration that the Windows service will manage. Each site must have a unique WSPath or it will not show up as a unique site to be managed (this applies to SearchConfigUI instances as well incidentally.) You can safely clear this file as it is regenerated each time the Windows service is restarted. This can help determine why a site is not functioning properly.</li>
<li><strong>log (folder)</strong> - If you haven't dug into the log folder, start. It contains error events that are not written to the event log that can help assist in troubleshooting failed esync processing.</li>
</ol>
<h2>Database Tables</h2>
<p>The following tables are used in one way or another by the esync framework:</p>
<ol>
<li><strong>[AssetServerTable]</strong> - Stores a record for each site (domain) that connects to a specific CMS instance. For example, if you have multiple IIS web sites (local or not) using the same CMS database, a separate record will exist for each server that connects to and makes request against the specific CMS instance. The main thing to confirm with this table, is that a record with a valid callback URL (sometimes blank if the Windows service fails to catalog each server) for each esynced web site. If you have problems with any CMS processes that rely on the Windows service, you can safely truncate/delete the records from this table, restart the Ektron Windows Service, and regenerate the valid records.
<ul>
<li><strong>[callbackUrl]</strong> - Callback URL the service uses to perform actions.</li>
</ul>
</li>
<li><strong>[scheduler]</strong> - Stores configuration options for each esync configuration instance. <ul>
<li><strong>[scheduledesc]</strong> - The current sync status of that particular instance (usually completed or running)</li>
<li><strong>[triggeraction]</strong> - The configuration options for the specific esync instance (get to know this). Also stored in the Sync folder XML configuration files. I'm assuming this field is tied directly to the XML config settings somehow.</li>
</ul>
</li>
<li><strong>[perform_action]</strong> - This table is the engine of the Windows service. Any action the service is to perform, originates in this table (such as esync actions.)</li>
<li><strong>[sync_resolve_tbl]</strong> - Undocumented at this time (anyone?)</li>
<li><strong>[syncfolder]</strong> - Undocumented</li>
</ol>
<h2>Sync Folder</h2>
<p>Esync bindings are also stored in local XML files stored under the c:\Sync folder. Though not recommended, you can manually modify these settings in the event of a failed esync setup.</p>
<h2>EkStatus Xml Files</h2>
<p>Under your web root, lies the <em>EkStatus</em> folder. I haven't been able to find any documentation to clarify my findings, but based on observation, a separate ###.xml file is created for each esync binding configured under synchronization in the workarea.</p>
<p>Each time an esync is kicked off, the correlating ###.xml file is truncated and all logging is done within the file. This is one of the first places to check in the event of a failed esync. You can usually determined what action esync was trying to perform at the time of failure. I've also found myself clearing the out the logs manually to get esync to start back up again after having failed.</p>
<h3>Conclusion</h3>
<p>Ektron CMS 400.Net Esync Technology is by far one of the most robust Web CMS synchronization platforms on the market. A successfully configured, running, synchronizing implementation results in satisfied developers, content administrators, and ultimately, content stakeholders. I have found that most issues correlate directly to one of the items listed here. Any additional information from those of you that have experienced similar situations is also welcomed.</p>
<p>Happy syncing!</p>
<h2>Other Resources</h2>
<p><a target="_blank" href="http://martinondotnet.blogspot.com/2010/03/ektron-esync-error-servicechannel.html">Martin on .NET eSync Reference</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_eSync_Error_Generating_Security_Certificates.aspx?blogid=91">
  <title>Ektron eSync Error Generating Security Certificates</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_eSync_Error_Generating_Security_Certificates.aspx?blogid=91</link>
  <description><![CDATA[<p>While setting up another client esync configuration tonight we ran into the following error. It appears right after you click to add an esync relationship, before getting references to any local security cerficates in the drop down The communication object,</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-02-04T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>While setting up another client esync configuration tonight we ran into the following error. It appears right after you click to add an esync relationship, before getting references to any local security cerficates in the drop down:</p>
<pre style="COLOR: #cc3300">
The communication object, System.ServiceModel.Channels.ServiceChannel,
cannot be used for communication because it is in the Faulted state.
Error generating security certificates.

Please make sure security configurator is run and security certificates
are properly configured.
</pre><p>After running through all the normal esync checklist items, I decided to check other setup areas, mainly the AssetServer table.</p>
<p>Keep in mind, the internal systems use this table to determine how to connect to the various servers that my be using a single database. So after clearing out ALL records (it's ok, they come back), the perform_action table (just to be sure), and restarting the Ektron Windows Services 3.0 (regenerates the records in these tables), we were aable to successfully run the esync web configuration wizard and start the esync process.</p>
<p>Chalk one up to hours and hours of troubleshooting and resolution for this one.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_eSync_Failing_With_Faulted_State_Error_Message.aspx?blogid=91">
  <title>Ektron eSync Failing With Faulted State Error Message</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_eSync_Failing_With_Faulted_State_Error_Message.aspx?blogid=91</link>
  <description><![CDATA[Today, I had the unforunate event of dealing with a failed Ektron eSync job. Also unfortunate was the fact that the error message doesn't stay up long enough to even figure out something went wrong. If you're not paying attention]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2010-01-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Today, I had the unfortunate event of dealing with a failed Ektron eSync job. Also unfortunate was the fact that there did not appear to be any sort of error message to even figure out something had gone wrong. The blank "Synchronization Status" just sat there, trying to figure out what it should do next, indefinitely.</p>
<p>After waiting around a few minutes, I killed the Ektron Windows Service on the source CMS instance (my developer box), restarted IIS, and re-ran the esync process. This time I made certain to pay attention. The error did not say much, nor did it stay on screen longer than a few seconds before returning to the "Synchronization Status" waiting screen. Here is what it looks like.</p>
<p><img title="Ektron eSync Fault Error Message" alt="Ektron eSync Fault Error Message" src="http://www.skonet.com/uploadedImages/ektron-esync-fault.png" border="0" /></p>
<p>Something apparently failed in the .NET System.ServiceModel.Channels.ServiceChannel class and had left eSync (Ektron?) in a faulted state.</p>
<p>What the hell does that mean?</p>
<p>After troubleshooting every Ektron log, database table, and esync system I could think of, I resorted to the nefarious Ektron forums and found an <a href="http://dev.ektron.com/forum.aspx?g=posts&amp;t=27990" target="_blank">article in the Ektron forums</a> regarding a similar situation in which I found myself.</p>
<p>The answer came from Andrew, "check your license."</p>
<p>Now forgive me, but having a communication channel in a faulted state does NOT sound like a license issue. But what the heck, I decided to give it a shot.</p>
<p>It worked. Apparently our recently updated server license keys had omitted the (S) flag, thus discontinuing the production server's support of esync.</p>
<p>Boy, I am glad that error message helped me figure that out after two hours of spinning my wheels on completely unrelated tangents.</p>
<p>&lt;/rant&gt;</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_Upgrade_on_Replicated_SQL_Server_Instance.aspx?blogid=91">
  <title>Ektron Upgrade on Replicated SQL Server Instance</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_Upgrade_on_Replicated_SQL_Server_Instance.aspx?blogid=91</link>
  <description><![CDATA[<p>I ran into an interesting situation this evening while prototyping an Ektron upgrade for a client. After running the site upgrade utility on my local instance, the DB upgrade portion of the upgrade process failed miserably. A slew of pop</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-11-17T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I ran into an interesting situation this evening while prototyping an <a href="http://www.ektron.com/" target="_blank">Ektron</a> upgrade for a client. After running the site upgrade utility on my local instance, the database upgrade portion of the upgrade process failed miserably. A slew of pop-up error messages and then a final summary pop-up explaining that a handful of scripts did not succeed in running, <strong><em>"ERROR! Failed to execute script! Insert Error: Column name or number of supplied values does not match table definition."</em></strong></p>
<p>After digging into the error logs and reviewing the SQL scripts that failed, I ran across an issue relating to SQL Server and database replication. Apparently, to track changes, merge replication and transactional replication with queued updating subscriptions must be able to uniquely identify every row in every published table. So, if a transactional publication supports queued updating subscriptions, replication adds the column <strong><em>msrepl_tran_version</em></strong> to every table. <strong>AND</strong>, if the table is dropped from the publication, the <em>msrepl_tran_version</em> column is <strong>NOT</strong> removed!!! <a href="http://msdn.microsoft.com/en-us/library/ms151740.aspx" target="_blank"><sup>*</sup></a></p>
<p>I was dealt with having an entire Ektron CMS database that had an extra field/column in <strong>EVERY SINGLE</strong> table. Thankfully, dropping this field (and it's constraints) does nothing to Ektron. I'm not entirely sure what it does to the replication environment however.</p>
<p>I have included the SQL script I wrote to generate and run the alter statements to drop the offending field for anyone dealing with this issue. Feel free to comment if this is helpful.</p>
<p><em>And this did allow me to finally perform a successfully upgrade to 7.6.6 SP2.</em></p>
<pre class="code">
if exists (
 select o.name from syscolumns c inner join sysobjects o on c.id=o.id where c.name='msrepl_tran_version'
) 
/*
 select 'alter table ' + object_name(parent_obj) + ' drop constraint ' + name + char(13) From sysobjects where name like '%msrep%' and type ='D' and object_name(parent_obj) &lt;&gt; 'MSreplication_subscriptions'
 select 'alter table ' + object_name(ID) + ' drop column msrepl_tran_version ' + char(13) from syscolumns where name like 'msrepl_tran_version%' and object_name(ID) not like 'conflict%'
*/
 
 declare @sql varchar(1000)
 declare mycurs cursor
 for select 'alter table ' + object_name(parent_obj) + ' drop constraint ' + name + char(13) From sysobjects where name like '%msrep%' and type ='D' and object_name(parent_obj) &lt;&gt; 'MSreplication_subscriptions'
 
 open mycurs
 fetch next from mycurs into @sql
 
 while @@FETCH_STATUS = 0
 begin
  exec (@sql)
  fetch next from mycurs into @sql
 end
 
 close mycurs
 deallocate mycurs
 declare mycurs cursor
 for select 'alter table ' + object_name(ID) + ' drop column msrepl_tran_version ' + char(13) from syscolumns where name like 'msrepl_tran_version%' and object_name(ID) not like 'conflict%'
 
 open mycurs
 fetch next from mycurs into @sql
 
 while @@FETCH_STATUS = 0
 begin
  exec (@sql)
  fetch next from mycurs into @sql
 end
 
 close mycurs
 deallocate mycurs
go
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Progressive_Solution_for_Handling_Browsers_That_Have_Disabled_JavaScript_for_Your_Web_Site.aspx?blogid=91">
  <title>Progressive Solution for Handling Browsers That Have Disabled JavaScript for Your Web Site</title>
  <link>http://www.skonet.com/Articles_Archive/Progressive_Solution_for_Handling_Browsers_That_Have_Disabled_JavaScript_for_Your_Web_Site.aspx?blogid=91</link>
  <description><![CDATA[<p>Anyone that uses Firefox as their default web browser and has the NoScript add on enabled (if you don't I would highly recommend that you install it post haste) can attest to the terrible implementations of web sites that do</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-11-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Anyone that uses Firefox as their default web browser and has the NoScript add-on enabled (if you don't I would highly recommend that you install it post-haste) can attest to the terrible implementations of web sites that do not gracefully (or progressively, whichever methodology your prescribe) handle our blocking of their web site. Usually you get a mess of a user interface, intertwined with garbled presentation and missing page elements. As I am a somewhat experienced netizen, it's an easy enough thing for me to enable the scriptability of the site with a simple "allow JavaScript" from the NoScript context menu.</p>
<p>Now consider average Joe web user that, more than likely, isn't quite as browser savvy. What is the experience when they hit your site with all your highly stylized, graphical, AJAX driven, DHTML (DOH!) based components? I'll tell you, crap.</p>
<p>So what can you do? Well, my solution is simple, create a global "no script" DIV layer that contains instructions for everyone visiting your site that instructs them on the requirements for your web site. My example uses the facebook-esque notification block. The important thing to realize is that this block with always appear, regardless of their browsers ability to parse your complex JavaScript. The beauty of the method, is that you allow those visitors that DO allow your site to run it's JavaScript to <em>hide</em> your global JavaScript notice, gracefully, without interruption to their browsing experience.</p>
<p>Here is the code I have as an example. Keep in mind, this hasn't been cross-browser tested nor printer optimized (hmmm, that's a good question.)</p>
<pre class="code">
&lt;!-- NeedScript Global Notice --&gt;
&lt;style type="text/css"&gt;
.ns-shown
{
 position:absolute;
 top:0;
 left:0;
 width:100%;
 border:solid 1px #FFFF00;
 background: #FFFFEC;
 text-align:center;
}
.ns-hidden
{
 display:none;
}
&lt;/style&gt;
&lt;div id="noscript" class="ns-shown"&gt;
 &lt;p&gt;This site requires JavaScript. Please try again.&lt;/p&gt;
&lt;/div&gt;
&lt;script&gt;
var $_ns = document.getElementById('noscript');
if($_ns != undefined)
{
 $_ns.className = 'ns-hidden';
}
&lt;/script&gt;
&lt;!-- NeedScript Global Notice --&gt;
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Take_an_IIS_Web_Site_Offline.aspx?blogid=91">
  <title>How to Take an IIS Web Site Offline</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Take_an_IIS_Web_Site_Offline.aspx?blogid=91</link>
  <description><![CDATA[<p>Use the following methods to put an IIS web site into off line or maintenance mode. App_Offline.htm Static Override Page (prefered) Adding a file in the application root named App_Offline.htm automatically causes the AppDomain to recycle and modifies its behavior</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-10-27T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<h2>App_Offline.htm Static Override Page (prefered)</h2>
<p>Adding a file in the application root named <em>App_Offline.htm</em> automatically causes the AppDomain to recycle and modifies its behavior such that any request for an ASP.NET resource returns the contents of the App_Offline.htm file instead (along with an HTTP 404 status). Deleting App_Offline.htm automatically recycles the AppDomain again and the web application is back to serving its usual content.<a href="http://aspnet.4guysfromrolla.com/articles/110707-1.aspx" target="_blank">*</a></p>
<ol>
<li>Create a static HTML page called <em><strong>App_Offline.htm</strong></em></li>
<li>Filesize must be at LEAST 512MB and cannot exceed 1MB in order to work properly as an offline mode trigger</li>
</ol>
<h2>Redirect the entire IIS Application (alternative)</h2>
<ol>
<li>Create an offline or maintenance mode web page (per design specifications or use default version) and save the page to the application root directory</li>
<li>Open IIS manager on the web server that is hosting the site/application</li>
<li>Right-click the site/application name | Properties</li>
<li>Click the "Home Directory" tab (or "Virtual Directory" tab if an application)</li>
<li>Select "A redirect to a URL"</li>
<li>Enter the fully qualified URL to the offline page</li>
<li>Check "The exact URL entered above" checkbox</li>
<li>Click Apply | OK</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_To_Disable_Ektron_Modules_and_Handlers_in_IIS_7_Virtual_Applications.aspx?blogid=91">
  <title>How To Disable Ektron Modules and Handlers in IIS 7 Virtual Applications</title>
  <link>http://www.skonet.com/Articles_Archive/How_To_Disable_Ektron_Modules_and_Handlers_in_IIS_7_Virtual_Applications.aspx?blogid=91</link>
  <description><![CDATA[I recently came across a scenario where we had to configure a separate virtual application under our <a href="http://www.ektron.com/" target="_blank">Ektron</a> site. As you are aware, <a href="http://www.ektron.com/" target="_blank">Ektron</a> is heavy with it's own HttpHandlers and modules. This is the contents of a bare-bones web.config file you can drop into your virtual application directory to disable the offending <a href="http://www.ektron.com/" target="_blank">Ektron</a> DLLs from running and failing.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-10-21T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I recently came across a scenario where we had to configure a separate virtual application under our <a href="http://www.ektron.com/" target="_blank">Ektron</a> site. As you are aware, <a href="http://www.ektron.com/" target="_blank">Ektron</a> is heavy with it's own HttpHandlers and modules. This is the contents of a bare-bones web.config file you can drop into your virtual application directory to disable the offending <a href="http://www.ektron.com/" target="_blank">Ektron</a> DLLs from running and failing.</p>
<p>Update 1:</p>
<p>I ran across a KB article posted by Ektron on this topic as well. They offer a more <a href="http://dev.ektron.com/kb_article.aspx?id=9394" target="_blank">in-depth list of modules/handlers to disable in the web.config</a>.</p>
<pre class="code">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;configuration&gt;
 &lt;system.web&gt;
  &lt;customErrors mode="Off"&gt;
  &lt;/customErrors&gt;
 &lt;/system.web&gt;
    &lt;system.webServer&gt;
  &lt;handlers&gt;
   &lt;remove name="ek*" /&gt;
   &lt;remove name="ekdav" /&gt;
   &lt;remove name="EktronWorkflowImage" /&gt;
  &lt;/handlers&gt;
  &lt;modules&gt;
   &lt;remove name="MyDigestAuthenticationModule" /&gt;
   &lt;remove name="EkUrlAliasModule" /&gt;
  &lt;/modules&gt;
    &lt;/system.webServer&gt;
&lt;/configuration&gt;
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Enable_SMTP_Authentication_for_Outlook_2007.aspx?blogid=91">
  <title>How to Enable SMTP Authentication for Outlook 2007</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Enable_SMTP_Authentication_for_Outlook_2007.aspx?blogid=91</link>
  <description><![CDATA[<p>This article explains how to enable SMTP authentication for outbound e mail in Microsoft Outlook. Open Microsoft Outlook 2007 From the ribbon menu click Tools | Account Settings… Click the E mail tab Select the account to be modified and</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-10-06T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>This article explains how to enable SMTP authentication for outbound e-mail in Microsoft Outlook.</p>
<ol>
<li>Open Microsoft Outlook 2007</li>
<li>From the ribbon menu click <em>Tools</em> | <em>Account Settings…</em><br /><img title="SMTP Outlook Authentication 01" border="0" alt="SMTP Outlook Authentication 01" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_01.png" /></li>
</ol>
<p><span id="more-951"></span></p>
<ol>
<li start="3">Click the <em>E-mail</em> tab</li>
<li>Select the account to be modified and click the <em>Change…</em> (not the Change Folder) button<br /><img title="SMTP Outlook Authentication 02" border="0" alt="SMTP Outlook Authentication 02" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_02.png" width="450" /></li>
<li>In the Change E-mail Account dialog, click the <em>More Settings…</em> button<br /><img title="SMTP Outlook Authentication 03" border="0" alt="SMTP Outlook Authentication 03" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_03.png" width="450" /></li>
<li>In the Internet E-mail Settings dialog, click the <em>Outgoing Server</em> tab</li>
<li>Check the <em>My outgoing server (SMTP) requires authentication</em> checkbox</li>
<li>Select the <em>Use same settings as my incoming mail server</em> radio button<br /><img title="SMTP Outlook Authentication 04" border="0" alt="SMTP Outlook Authentication 04" src="http://www.skonet.com/uploadedImages/smtp_outlook_authentication_04.png" /></li>
<li>Click the <em>OK</em> button</li>
<li>Click the <em>Next</em> button</li>
<li>Click the <em>Finish</em> button</li>
</ol>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Redirect_Reference_for_Microsoft_IIS_6_0.aspx?blogid=91">
  <title>Redirect Reference for Microsoft IIS 6.0</title>
  <link>http://www.skonet.com/Articles_Archive/Redirect_Reference_for_Microsoft_IIS_6_0.aspx?blogid=91</link>
  <description><![CDATA[While assisting with a client deployment, I ran across a redirect web site that had the redirect URL that included wildcards. Yes, wildcards I tell you.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-10-01T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have been working with web servers (IIS and Apache) for over 10 years, and it amazes me how much I still do not know.</p>
<p>I have to give credit to the <a href="http://www.ektron.com/">Ektron</a> hosting team. While assisting with a client deployment, I ran across a redirect web site that had the redirect URL that included wildcards. Yes, wildcards I tell you.</p>
<p>I am not sure if this means I need to pick up my books again or what, but this little nugget could be helpful for those of us still managing IIS 6.0 servers (IIS 7.0 redirect/rewrite engine is completely different.)</p>
<p><a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/41c238b2-1188-488f-bf2d-464383b1bb08.mspx?mfr=true" target="_blank">Microsoft IIS 6.0 Redirect Reference</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Leverage_machine_config_comments_to_Learn_How_to_Configure_Your_ASP_NET_Web_Sites.aspx?blogid=91">
  <title>Leverage machine.config.comments to Learn How to Configure Your ASP.NET Web Sites</title>
  <link>http://www.skonet.com/Articles_Archive/Leverage_machine_config_comments_to_Learn_How_to_Configure_Your_ASP_NET_Web_Sites.aspx?blogid=91</link>
  <description><![CDATA[<p>As one who is constantly having to deal with the web.config and on occasion the machine.config, I have found referencing the machine.config.comments indispensible. As such, I have decided to upload and host an accessible version the 2.0 configuration folder (C</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-10-01T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>As one who is constantly having to deal with the web.config and on occasion the machine.config, I have found referencing the machine.config.comments indispensible. As such, I have decided to upload and host an accessible version the 2.0 configuration folder (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG).</p>
<p>I'd like to eventually list all the default configuration options available, for now, this will have to suffice.</p>
<p><a title="machine.config.comments.xml" href="http://www.skonet.com/uploadedFiles/Snippets/ASPNET/machine.config.comments.xml" target="_blank">machine.config.comments</a> (xml format)</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Script_to_Start-Stop_All_Running_Ektron_Services_on_Local_Workstation.aspx?blogid=91">
  <title>Script to Start-Stop All Running Ektron Services on Local Workstation</title>
  <link>http://www.skonet.com/Articles_Archive/Script_to_Start-Stop_All_Running_Ektron_Services_on_Local_Workstation.aspx?blogid=91</link>
  <description><![CDATA[<p>Script to Start Stop All Running Ektron Services on Local Workstation Anyone that develops on Ektron knows just how resource intensive the locally run Windows services can be. After manually stopping and starting all three of them every time I</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-09-25T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Anyone that develops on <a href="http://www.ektron.com/" target="_blank">Ektron</a> knows just how resource intensive the locally run Windows services can be. After manually stopping and starting all three of them every time I get on or pulled off a project, I decided to write a handy VBScript to start or stop ALL Ektron Windows Services with a single command.</p>
<p>Enjoy.</p>
<pre class="code">
' Force explicit declaration of all variables.
Option Explicit
On Error Resume Next
dim arg, ArgNum, oArgs
dim WshShell
Set oArgs = WScript.Arguments
Set WshShell = WScript.CreateObject("WScript.Shell")
ArgNum = 0
While ArgNum &lt; oArgs.Count
 arg = LCase(oArgs(ArgNum))
 Select Case arg
  Case "-stop":
   Call ServiceAction ("stop")
  Case "-start":
   Call ServiceAction ("start")
  Case "-help","-?":
   Call DisplayUsage
  Case Else:
   Call DisplayUsage
 End Select 
 
 ArgNum = ArgNum + 1
Wend
Sub DisplayUsage
 WScript.Echo "Usage: EktronServicesManager &lt;-start|-stop&gt;, [-help|-?]" &amp; vbCrLf &amp; _
       "Example 1: EktronServicesManager -start"
 WScript.Quit (1)
End Sub
Sub ServiceAction (action)
 WshShell.Run "net " &amp; action &amp; " ""Ektron Extensibility Server""", 1
 WshShell.Run "net " &amp; action &amp; " ""Ektron Async Processor""", 1
 WshShell.Run "net " &amp; action &amp; " ""Ektron Windows Services 3.0""", 1
End Sub
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Salesforce_com_Web-To-Lead_CSharp_Class.aspx?blogid=91">
  <title>Salesforce.com Web-To-Lead C# Class</title>
  <link>http://www.skonet.com/Articles_Archive/Salesforce_com_Web-To-Lead_CSharp_Class.aspx?blogid=91</link>
  <description><![CDATA[Over the years I have done numerous Salesforce.com web projects using their API's and APEX libraries. I wrote this class library to do quick and dirty web to lead submissions without having to do clunky form redirects to their out.]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-09-24T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Over the years I have done numerous <a href="http://www.salesforce.com/" target="_blank">Salesforce.com</a> web projects using their <a href="http://wiki.developerforce.com/index.php/Web_Services_API" target="_blank">Web Services API</a>'s and <a href="http://wiki.developerforce.com/index.php/Apex" target="_blank">APEX libraries</a>. I wrote this class library to do quick and dirty web-to-lead submission without having to do clunky form redirects to their out of box HTML form handler. Includes callback handler to which you can wire-up.</p>
<p>Enjoy.</p>
<pre class="code">using System;<br />using System.Collections;<br />using System.Collections.Generic;<br />using System.IO;<br />using System.Net;<br />using System.Text;<br />using System.Web;<br /><br />namespace SkoNet.Salesforce<br />{<br /> /// &lt;summary&gt;<br /> /// This class represents the base Web Lead object in Salesforce.com.<br /> /// &lt;/summary&gt;<br /> public class WebToLead<br /> {<br />  private bool isWebToLeadUrlBuilt;<br />  #region Events/Event Handlers<br />  /// &lt;summary&gt;<br />  /// Occurs immediately following the HttpRequest.GetResponse() method being called.<br />  /// &lt;/summary&gt;<br />  public event SubmitWebToLeadEventHandler SubmitWebToLeadEvent;<br />  #endregion<br />  #region Accessors/Properties<br />  private Dictionary&lt;string, string&gt; keyValueFields;<br />  /// &lt;summary&gt;<br />  /// Dictionary &lt;string,string&gt; containing key/value pairs of single field values<br />  /// &lt;/summary&gt;<br />  public Dictionary&lt;string,string&gt; KeyValueFields<br />  {<br />   set<br />   {<br />    keyValueFields = value;<br />   }<br />   get<br />   {<br />    return keyValueFields;<br />   }<br />  }<br />  private Dictionary&lt;string, List&lt;string&gt;&gt; keyPicklistFields;<br />  /// &lt;summary&gt;<br />  /// Dictionary &lt;string,List&lt;string,string&gt;&gt; containing key/value pairs of multi-select values<br />  /// &lt;/summary&gt;<br />  public Dictionary&lt;string, List&lt;string&gt;&gt; KeyPicklistFields<br />  {<br />   get<br />   {<br />    return keyPicklistFields;<br />   }<br />   set<br />   {<br />    keyPicklistFields = value;<br />   }<br />  }<br />  private string webRequestMethod;<br />  /// &lt;summary&gt;<br />  /// Method to submit HttpRequest to Salesforce.com. Default is POST<br />  /// &lt;/summary&gt;<br />  public string WebRequestMethod<br />  {<br />   set<br />   {<br />    webRequestMethod = value;<br />   }<br />   get<br />   {<br />    return webRequestMethod;<br />   }<br />  }<br />  private string webContentType;<br />  /// &lt;summary&gt;<br />  /// ContentType when submitting to Salesforce.com. Default is application/x-www-form-urlencoded<br />  /// &lt;/summary&gt;<br />  public string WebContentType<br />  {<br />   set<br />   {<br />    webContentType = value;<br />   }<br />   get<br />   {<br />    return webContentType;<br />   }<br />  }<br />  private string webToLeadUrl;<br />  /// &lt;summary&gt;<br />  /// The Web-to-lead form action URL as outputed in the Web-to-lead HTML generation wizard.<br />  /// &lt;/summary&gt;<br />  public string WebToLeadUrl<br />  {<br />   set<br />   {<br />    webToLeadUrl = value;<br />   }<br />   get<br />   {<br />    return this.webToLeadUrl;<br />   }<br />  }<br />  private string webToLeadData;<br />  /// &lt;summary&gt;<br />  /// Form data that will be submitted to Salesforce.com. Viewable only after the BuildWebToLeadUrl() method is called.<br />  /// &lt;/summary&gt;<br />  public string WebToLeadData<br />  {<br />   get<br />   {<br />    return this.webToLeadData;<br />   }<br />  }<br />  #region Default SFDC Lead Fields (strong typed)<br />  private bool enableDebug;<br />  /// &lt;summary&gt;<br />  /// Enable debug for this request (requires debug email)<br />  /// &lt;/summary&gt;<br />  public bool EnableDebug<br />  {<br />   set<br />   {<br />    enableDebug = value;<br />    this.keyValueFields["debug"] = value ? "1" : "0";<br />   }<br />   get<br />   {<br />    return enableDebug;<br />   }<br />  }<br />  private string debugEmail;<br />  /// &lt;summary&gt;<br />  /// If debug is enabled, the email address to send the submitted lead confirmation.<br />  /// &lt;/summary&gt;<br />  public string DebugEmail<br />  {<br />   set<br />   {<br />    debugEmail = value;<br />    this.keyValueFields["debugEmail"] = value;<br />   }<br />   get<br />   {<br />    return debugEmail;<br />   }<br />  }<br />  private string recordType;<br />  /// &lt;summary&gt;<br />  /// Lead Record Type<br />  /// &lt;/summary&gt;<br />  public virtual string RecordType<br />  {<br />   set<br />   {<br />    this.recordType = value;<br />    this.keyValueFields["recordType"] = value;<br />   }<br />   get { return this.recordType; }<br />  }<br />  private string organizationID;<br />  /// &lt;summary&gt;<br />  /// The Organization ID for the account to which leads should be posted<br />  /// &lt;/summary&gt;<br />  public string OrganizationID<br />  {<br />   set<br />   {<br />    this.organizationID = value;<br />    this.keyValueFields["oid"] = value;<br />   }<br />   get { return this.organizationID; }<br />  }<br />  private string firstName;<br />  public virtual string FirstName<br />  {<br />   set<br />   {<br />    this.firstName = value;<br />    this.keyValueFields["first_name"] = value;<br />   }<br />   get { return this.firstName; }<br />  }<br />  private string lastName;<br />  public virtual string LastName<br />  {<br />   set<br />   {<br />    this.lastName = value;<br />    this.keyValueFields["last_name"] = value;<br />   }<br />   get { return this.lastName; }<br />  }<br />  private string email;<br />  public virtual string Email<br />  {<br />   set<br />   {<br />    this.email = value;<br />    this.keyValueFields["email"] = value;<br />   }<br />   get { return this.email; }<br />  }<br />  private string title;<br />  public virtual string Title<br />  {<br />   set<br />   {<br />    this.title = value;<br />    this.keyValueFields["title"] = value;<br />   }<br />   get { return this.title; }<br />  }<br />  private string company;<br />  public virtual string Company<br />  {<br />   set<br />   {<br />    this.company = value;<br />    this.keyValueFields["company"] = value;<br />   }<br />   get { return this.company; }<br />  }<br />  private string industry;<br />  public virtual string Industry<br />  {<br />   set<br />   {<br />    this.industry = value;<br />    this.keyValueFields["industry"] = value;<br />   }<br />   get { return this.industry; }<br />  }<br />  private string street;<br />  public virtual string Street<br />  {<br />   set<br />   {<br />    this.street = value;<br />    this.keyValueFields["street"] = value;<br />   }<br />   get { return this.street; }<br />  }<br />  private string city;<br />  public virtual string City<br />  {<br />   set<br />   {<br />    this.city = value;<br />    this.keyValueFields["city"] = value;<br />   }<br />   get { return this.city; }<br />  }<br />  private string state;<br />  public virtual string State<br />  {<br />   set<br />   {<br />    this.state = value;<br />    this.keyValueFields["state"] = value;<br />   }<br />   get { return this.state; }<br />  }<br />  private string postalCode;<br />  public virtual string PostalCode<br />  {<br />   set<br />   {<br />    this.postalCode = value;<br />    this.keyValueFields["zip"] = value;<br />   }<br />   get { return this.postalCode; }<br />  }<br />  private string country;<br />  public virtual string Country<br />  {<br />   set<br />   {<br />    this.country = value;<br />    this.keyValueFields["country"] = value;<br />   }<br />   get { return this.country; }<br />  }<br />  private string phone;<br />  public virtual string Phone<br />  {<br />   set<br />   {<br />    this.phone = value;<br />    this.keyValueFields["phone"] = value;<br />   }<br />   get { return this.phone; }<br />  }<br />  private string fax;<br />  public virtual string Fax<br />  {<br />   set<br />   {<br />    this.fax = value;<br />    this.keyValueFields["fax"] = value;<br />   }<br />   get { return this.fax; }<br />  }<br />  private string webSite;<br />  /// &lt;summary&gt;<br />  /// Web site for the lead being submitted<br />  /// &lt;/summary&gt;<br />  public virtual string WebSite<br />  {<br />   set<br />   {<br />    this.webSite = value;<br />    this.keyValueFields["URL"] = value;<br />   }<br />   get { return this.webSite; }<br />  }<br />  private string campaignId;<br />  public virtual string CampaignId<br />  {<br />   set<br />   {<br />    this.campaignId = value;<br />    this.keyValueFields["Campaign_ID"] = value;<br />   }<br />   get { return this.campaignId; }<br />  }<br />  private string leadSource;<br />  public virtual string LeadSource<br />  {<br />   set<br />   {<br />    this.leadSource = value;<br />    this.keyValueFields["lead_source"] = value;<br />   }<br />   get { return this.leadSource; }<br />  }<br />  private string description;<br />  public virtual string Description<br />  {<br />   set<br />   {<br />    this.description = value;<br />    this.keyValueFields["description"] = value;<br />   }<br />   get { return this.description; }<br />  }<br />  #endregion<br />  #endregion<br />  #region Constructors<br />  /// &lt;summary&gt;<br />  /// Provides properties, methods, and events that pertain to submitting a Web-to-lead request in a Salesforce.com instance.<br />  /// &lt;/summary&gt;<br />  /// &lt;param name="oid"&gt;Organization ID of the Salesforce.com account to which the lead submission will be sent.&lt;/param&gt;<br />  public WebToLead(string oid)<br />  {<br />   // initialize default salesforce fields<br />   this.organizationID = oid;<br />   this.debugEmail = String.Empty;<br />   this.enableDebug = false;<br />   this.recordType = String.Empty;<br />   this.campaignId = String.Empty;<br />   this.leadSource = String.Empty;<br />   <br />   this.firstName = String.Empty;<br />   this.lastName = String.Empty;<br />   this.email = String.Empty;<br />   this.title = String.Empty;<br />   this.company = String.Empty;<br />   this.industry = String.Empty;<br />   this.street = String.Empty;<br />   this.city = String.Empty;<br />   this.state = String.Empty;<br />   this.postalCode = String.Empty;<br />   this.country = String.Empty;<br />   this.phone = String.Empty;<br />   this.fax = String.Empty;<br />   <br />   this.description = String.Empty;<br />   this.webSite = String.Empty;<br />   <br />   this.keyValueFields = new Dictionary&lt;string, string&gt;();<br />   this.keyPicklistFields = new Dictionary&lt;string, List&lt;string&gt;&gt;();<br />   // initialize other class members<br />   this.isWebToLeadUrlBuilt = false;<br />   this.webToLeadUrl = "https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8"; // default<br />   this.webRequestMethod = "POST"; // default request method<br />   this.webContentType = "application/x-www-form-urlencoded"; // default content type<br />  }<br />  public WebToLead() : this(String.Empty) { }<br />  #endregion<br />  /// &lt;summary&gt;<br />  /// Generate the URL and POST Data that will be used to submit the request to salesforce.com<br />  /// &lt;/summary&gt;<br />  public virtual void BuildWebToLeadUrl()<br />  {<br />   const string FORMAT = "&amp;{0}={1}";<br />   StringBuilder query = new StringBuilder();<br />   // pull single select values<br />   foreach (string key in keyValueFields.Keys)<br />   {<br />    string val = (string)keyValueFields[key];<br />    val = HttpUtility.UrlEncode(val);<br />    string keyName = String.Format(FORMAT, key, val);<br />    query.Append(keyName);<br />   }<br />   // pull multiselect values<br />   foreach (string key in keyPicklistFields.Keys)<br />   {<br />    List&lt;string&gt; vals = (List&lt;string&gt;)keyPicklistFields[key];<br />    foreach (string val1 in vals)<br />    {<br />     if (!String.IsNullOrEmpty(val1))<br />     {<br />      string val = val1;<br />      val = HttpUtility.UrlEncode(val1);<br />      string keyName = String.Format(FORMAT, key, val);<br />      query.Append(keyName);<br />     }<br />    }<br />   }<br />   webToLeadData = query.ToString();<br />   isWebToLeadUrlBuilt = true;<br />  }<br />  /// &lt;summary&gt;<br />  /// Submit the Web to Lead request to Salesforce.com<br />  /// &lt;/summary&gt;<br />  public virtual void Submit()<br />  {<br />   // make sure submit data has been generated<br />   if (!isWebToLeadUrlBuilt) this.BuildWebToLeadUrl();<br />   // verify required properties are set<br />   if (String.IsNullOrEmpty(organizationID) || String.IsNullOrEmpty(webToLeadUrl))<br />   {<br />    throw new SalesforceException("You must specify an organization ID and a web to lead URL before you can submit a lead to Salesforce.");<br />   }<br />   // encode data and convert to byte array to send<br />   UTF8Encoding encoding = new UTF8Encoding();<br />   byte[] byteArray = encoding.GetBytes(webToLeadData);<br />   // Create HttpWebRequest<br />   HttpWebRequest reqSF = (HttpWebRequest)WebRequest.Create(this.webToLeadUrl);<br />   reqSF.Method = this.webRequestMethod;<br />   reqSF.ContentType = this.webContentType;<br />   reqSF.ContentLength = webToLeadData.Length;<br />   // Post the data stream to Salesforce<br />   Stream requestStream = reqSF.GetRequestStream();<br />   requestStream.Write(byteArray, 0, byteArray.Length);<br />   requestStream.Close();<br />   //Get the response data stream from Salesforce<br />   HttpWebResponse respSF = (HttpWebResponse)reqSF.GetResponse();<br />   // raise the event<br />   if (SubmitWebToLeadEvent != null)<br />   {<br />    SubmitWebToLeadEvent(this, new SubmitWebToLeadEventArgs(respSF));<br />   }<br />   respSF.Close();<br />   respSF = null;<br />   reqSF = null;<br />  }<br /> }<br /> /// &lt;summary&gt;<br /> /// Represents the method that will handle a WebToLeadSubmit event that has WebToLeadSubmitEventArgs data.<br /> /// &lt;/summary&gt;<br /> /// &lt;param name="sender"&gt;Object&lt;/param&gt;<br /> /// &lt;param name="e"&gt;WebToLeadSubmitEventArgs&lt;/param&gt;<br /> public delegate void SubmitWebToLeadEventHandler(object sender, SubmitWebToLeadEventArgs e);<br /> /// &lt;summary&gt;<br /> /// Provides data for the web to lead submission of the WebToLead class.<br /> /// &lt;/summary&gt;<br /> public class SubmitWebToLeadEventArgs<br /> {<br />  private HttpWebResponse response;<br />  public HttpWebResponse Response<br />  {<br />   set<br />   {<br />    response = value;<br />   }<br />   get<br />   {<br />    return response;<br />   }<br />  }<br />  public SubmitWebToLeadEventArgs(HttpWebResponse input)<br />  {<br />   this.response = input;<br />  }<br /> }<br />}<br /><br /></pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/PHP_Flickr_Photo_Rotator_Class.aspx?blogid=91">
  <title>PHP Flickr Photo Rotator Class</title>
  <link>http://www.skonet.com/Articles_Archive/PHP_Flickr_Photo_Rotator_Class.aspx?blogid=91</link>
  <description><![CDATA[<p>Last year I was approached by an old work associate buddy who needed someone to program a basic photo display web component that he could use with a WordPress blog site he was designing. Since I am pretty decent at WordPress,</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-09-09T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Last year I was approached by an old work associate/buddy who needed someone to program a basic photo display web component that he could use with a WordPress blog site he was designing. Since I am pretty decent at WordPress, and quite versed at <a title="PHP" href="http://www.php.net/" target="_blank">PHP</a>, I accepted. Here is what I ended up with. Quick and dirty.</p>
<p>It utilized the <a title="Flickr developer API's" href="http://www.flickr.com/services/api/" target="_blank">Flickr developer API's</a>, <a title="PHP" href="http://www.php.net/" target="_blank">PHP</a> and a little HTML/CSS/JavaScript knowhow and turned out to work quite well.</p>
<p>I'm sure there are much more robust exampes of a similar component, this one just worked for what they needed at <a title="Solitude Ski Resort" href="http://www.skisolitude.com/community/" target="_blank">Solitude Ski Resort</a>.</p>
<pre class="code">
&lt;?php
function _pre($out,$kill=false)
{
    echo '&lt;pre&gt;';
    if (is_array($out))
    {
        print_r($out);
    }
    else
    {
        echo $out;
    }

    if ($kill)
    {
        die('&lt;/pre&gt;');
    }
    else
    {
        echo '&lt;/pre&gt;';
    }
}

class daily_candy
{
    var $candy = array();
    var $candy_count = 0;
    var $api_key = '';
    var $service_url = 'http://api.flickr.com/services/rest/?';

    function daily_candy($api_key)
    {
        // set props
        $this-&gt;api_key = $api_key;
        
        // we need posts
        if ($this-&gt;get_photo_ids())
        {
            $this-&gt;get_photo_sizes();
            $this-&gt;get_photo_info();
            $this-&gt;candy_count = count($this-&gt;candy);
        }
    }

    function get_photo_ids($photoset_id,$per_page = '4',$format='php_serial')
    {
        // build the main url
        $params = array(
            'api_key'   =&gt; $this-&gt;api_key,
            'photoset_id'   =&gt; $photoset_id,
            'per_page'  =&gt; $per_page,
            'method'    =&gt; 'flickr.photosets.getPhotos',
            'format'    =&gt; $format
        );
        $encoded_params = array();
        foreach ($params as $k =&gt; $v)
        {
            $encoded_params[] = $k.'='.urlencode($v);
        }
        $url = $this-&gt;service_url.implode('&amp;', $encoded_params);
        $rsp = file_get_contents($url);
        $rsp_obj = unserialize($rsp);

        if ($rsp_obj['stat'] == 'ok' &amp;&amp; count($rsp_obj['photoset']['photo']) &gt; 0)
        {
            foreach($rsp_obj['photoset']['photo'] as $photo)
            {
                array_push($this-&gt;candy,new daily_candy_photo($photo['id']));
            }
        }
        else
        {
            // do nothing
        }
        return count($this-&gt;candy);
    }

    function get_photo_sizes($format='php_serial')
    {
        // build the main url
        $params = array(
            'api_key'   =&gt; $this-&gt;api_key,
            'method'    =&gt; 'flickr.photos.getSizes',
            'format'    =&gt; $format
        );
        $encoded_params = array();
        foreach ($params as $k =&gt; $v)
        {
            $encoded_params[] = urlencode($k).'='.urlencode($v);
        }
        for($i = 0; $i &lt; count($this-&gt;candy); $i++)
        {
            $url_format = $this-&gt;service_url.implode('&amp;', $encoded_params).'&amp;photo_id=%s';
            $url = sprintf($url_format,$this-&gt;candy[$i]-&gt;photo_id);
            $rsp = file_get_contents($url);
            $rsp_obj = unserialize($rsp);

            if ($rsp_obj['stat'] == 'ok')
            {
                $this-&gt;candy[$i]-&gt;thumb_url = $rsp_obj['sizes']['size'][0]['source'];
                $this-&gt;candy[$i]-&gt;photo_url = $rsp_obj['sizes']['size'][3]['source'];
            }
            else
            {
                // do nothing
            }
        }
    }

    function get_photo_info($format='php_serial')
    {
        // build the main url
        $params = array(
            'api_key'   =&gt; $this-&gt;api_key,
            'method'    =&gt; 'flickr.photos.getInfo',
            'format'    =&gt; $format
        );
        $encoded_params = array();
        foreach ($params as $k =&gt; $v)
        {
            $encoded_params[] = urlencode($k).'='.urlencode($v);
        }
        $url_format = $this-&gt;service_url.implode('&amp;', $encoded_params).'&amp;photo_id=%s';
        for($i = 0; $i &lt; count($this-&gt;candy); $i++)
        {
            $url = sprintf($url_format,$this-&gt;candy[$i]-&gt;photo_id);
            $rsp = file_get_contents($url);
            $rsp_obj = unserialize($rsp);

            if ($rsp_obj['stat'] == 'ok')
            {
                $this-&gt;candy[$i]-&gt;description = $rsp_obj['photo']['description']['_content'];
            }
            else
            {
                // do nothing
            }
        }
    }

    function render_candy()
    {
        // hold script output
        $script = "\n";
        $script_imgs = "\n";

//      _pre($this-&gt;candy);

        // write out the HTML for the visual display of the page
        for($i = 0; $i &lt; $this-&gt;candy_count; $i++)
        {
            $item = $this-&gt;candy[$i];

            // fill script
            $script .= "dc_photos.push(['".$item-&gt;photo_url."','".htmlspecialchars(addslashes($item-&gt;description))."']);\n";
            $script_imgs .= "dc_imgs[$i] = new Image();\ndc_imgs[$i].src = '".$item-&gt;photo_url."';\n";

            // first loop?
            if ($i == 0)
            {
                echo &lt;&lt;&lt;HTML
&lt;!-- Daily Candy --&gt;
&lt;style type="text/css"&gt;
#dc-shell
{
    height:520px;
    width:600px;
    clear:both;
    margin-left:20px;
}
#dc-shell h2
{
    width:600px;
    padding:0px;
    margin:0px 0px 5px 0px;
}
#dc-bottom
{
    float:left;
    height:80px;
    width:500px;
}
.dc-lft
{
    width:510px;
    height:375px;
    float:left;
    position:relative;
}
.dc-rgt
{
    width:85px;
    float:left;
}
.dc-sml
{
    height:96px;
}
&lt;/style&gt;
&lt;script type="text/javascript" language="javascript"&gt;
var dc_photos = []; // hold generated photos and links
var dc_imgs = new Array();

// show the daily candy player
function dc_show_candy(id)
{
    var img = document.getElementById("dc-img");
    var txt = document.getElementById("dc-bottom");
    if (img != undefined &amp;&amp; txt != undefined)
    {
        try
        {
            img.src = dc_imgs[id].src;
            txt.innerHTML = dc_photos[id][1];
        }
        catch(ex)
        {
        }
    }
}
&lt;/script&gt;
&lt;div id="dc-shell" class="post-info"&gt;
    &lt;div class="dc-lft"&gt;
        &lt;div class="dc-top"&gt;&lt;a href="$item-&gt;photo_url" target="_blank"&gt;&lt;img src="$item-&gt;photo_url" border="0" alt="" title="" width="500" height="375" id="dc-img" /&gt;&lt;/a&gt;&lt;/div&gt;
        &lt;div id="dc-bottom"&gt;$item-&gt;description&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="dc-rgt"&gt;
HTML;
            }


            // smaller thumbnail item
            echo &lt;&lt;&lt;HTML
        &lt;div class="dc-sml"&gt;&lt;a href="javascript:dc_show_candy($i);"&gt;&lt;img src="$item-&gt;thumb_url" border="0" alt="" title="" width="85" height="85" /&gt;&lt;/a&gt;&lt;/div&gt;
HTML;

            // last loop
            if ($i == $this-&gt;candy_count - 1)
            {
                echo &lt;&lt;&lt;HTML
    &lt;/div&gt;
&lt;/div&gt;
&lt;!-- /Daily Candy --&gt;
HTML;
            }
        }

        // write out the javascript array needed
        echo &lt;&lt;&lt;JS
&lt;script type="text/javascript" language="javascript"&gt;
$script
$script_imgs
&lt;/script&gt;
JS;
    }
};

class daily_candy_photo
{
    var $photo_id = '';
    var $thumb_url = '';
    var $photo_url = '';
    var $description = '';

    function daily_candy_photo($photo_id)
    {
        $this-&gt;photo_id = $photo_id;
    }
};

$dc = new daily_candy('FLICKR_API_KEY');
$dc-&gt;render_candy();
?&gt;
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Web_Page_Layout.aspx?blogid=91">
  <title>Web Page Layout</title>
  <link>http://www.skonet.com/Articles_Archive/Web_Page_Layout.aspx?blogid=91</link>
  <description><![CDATA[<p>Web Page Layout A web page layout refers to the structural design of a web page being served up on the World Wide Web. There are various key sections or components that make up the core layout of a web</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-09-08T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>A web page layout refers to the <a href="http://en.wikipedia.org/wiki/Structural_design" target="_blank">structural design</a> of a <a href="http://en.wikipedia.org/wiki/Web_page" target="_blank">web page</a> being served up on the <a href="http://en.wikipedia.org/wiki/World_Wide_Web" target="_blank">World Wide Web</a>. There are various key sections or components that make up the core layout of a web page: the header, body, and footer. Other sections that contribute to the web page layout are the channels (or rails) and ankle.</p>
<h2>Header</h2>
<p>The web page header represents the heading of the web page. The header usually contains some sort of graphical element such as a masthead, corporate logo, or web site title. Other elements such as utility navigation, a search form, or even site navigation can also be included in the header.</p>
<h2>Body</h2>
<p>The web page body contains the primary content of the page. The body is usually positioned between the page header and page footer.</p>
<h2>Footer</h2>
<p>The web page footer contains ancillary content usually comprised of official notices (such as legal policies and copyright declarations) and auxiliary <a href="http://en.wikipedia.org/wiki/Hyperlinks" target="_blank">hyperlinks</a> to internal page content.</p>
<p>The footer is normally the last rendered bit of content on a page by the <a href="http://en.wikipedia.org/wiki/Web_browser" target="_blank">web browser</a>.</p>
<h2>Channel/Rail/Side Bar</h2>
<p>The web page channel or web page rail contains <a href="http://en.wikipedia.org/w/index.php?title=Meta_links&amp;action=edit&amp;redlink=1" target="_blank">meta links</a> or other auxiliary content that supports the web page body content. Subnavigation or submenus may also be displayed in the channel.</p>
<h2>Ankle</h2>
<p>The web page ankle contains additional internal hyperlinks and other relevant content to the web site. With the increase in popularity of the AJAX driven content and menuing systems, the ankle servers as a redundant method to guarantee critical hyperlinked web content is indexed by <a href="http://en.wikipedia.org/wiki/Search_engines" target="_blank">search engines</a> and <a href="http://en.wikipedia.org/w/index.php?title=Internet_spiders&amp;action=edit&amp;redlink=1" target="_blank">Internet spiders</a>.</p>
<p>The ankle is usually positioned between the web page body content and the web page footer.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Breaking_HttpModule_Inheritance_-_InheritInChildApplications.aspx?blogid=91">
  <title>Breaking HttpModule Inheritance - InheritInChildApplications</title>
  <link>http://www.skonet.com/Articles_Archive/Breaking_HttpModule_Inheritance_-_InheritInChildApplications.aspx?blogid=91</link>
  <description><![CDATA[<p>Ran into a situation with root IIS applications sites squatting sub applications' configuration (HttpModule's specifically). Here is how to disable the inheritance. &lt;location inheritInChildApplications="false"&gt; &lt;system.web&gt; ... &lt; system.web&gt; &lt; location&gt; SectionInformation.InheritInChildApplications Property</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-08-20T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>Ran into a situation with root IIS applications/sites squatting sub-applications' configuration (HttpModule's specifically). Here is how to disable the inheritance.</p>
<pre class="code">
&lt;location inheritInChildApplications="false"&gt;
  &lt;system.web&gt;
   ...
  &lt;/system.web&gt;
&lt;/location&gt;
</pre><p><a title="InheritInChildApplications" href="http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.inheritinchildapplications.aspx" target="_blank">SectionInformation.InheritInChildApplications Property</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Generic_JavaScript_Page_onLoad_Event_Handler.aspx?blogid=91">
  <title>Generic JavaScript Page onLoad Event Handler</title>
  <link>http://www.skonet.com/Articles_Archive/Generic_JavaScript_Page_onLoad_Event_Handler.aspx?blogid=91</link>
  <description><![CDATA[<p>setup onload function if(typeof window.addEventListener = 'undefined') .. gecko, safari, konqueror and standard window.addEventListener('load', generic, false) else if(typeof document.addEventListener = 'undefined')</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-08-18T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<pre class="code">
//setup onload function
if(typeof window.addEventListener != 'undefined')
{
    <em>//.. gecko, safari, konqueror and standard</em>
    window.addEventListener('load', generic, false);
}
else if(typeof document.addEventListener != 'undefined')
{
    <em>//.. opera</em> 
    document.addEventListener('load', generic, false);
}
else if(typeof window.attachEvent != 'undefined')
{
    <em>//.. win/ie</em>
    window.attachEvent('onload', generic);
}

//** remove this condition to degrade older browsers
else
{
    //.. mac/ie5 and anything else that gets this far
    
    //if there's an existing onload function
    if(typeof window.onload == 'function')
    {
        <em>//store it</em>
        var existing = onload;
        
        <em>//add new onload handler</em>
        window.onload = function()
        {
            <em>//call existing onload function</em>
            existing();
            
            <em>//call generic onload function</em>
            generic();
        };
    }
    else
    {
        <em>//setup onload function</em>
        window.onload = generic;
    }
}
</pre><p>As referenced from <a title="Brothercake.com" href="http://www.brothercake.com/" target="_blank">Brothercake.com</a></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Take_a_Screenshot_of_a_Windows_Media_Video_Movie.aspx?blogid=91">
  <title>How to Take a Screenshot of a Windows Media Video Movie</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Take_a_Screenshot_of_a_Windows_Media_Video_Movie.aspx?blogid=91</link>
  <description><![CDATA[<p>I can count on one hand how many times I have had to do this over the past few years, but each time it takes considerable effort to "reacall" how to replicate. Apparently, by default, Windows Media Player enables what's</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-08-13T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I can count on one hand how many times I have had to do this over the past few years, but each time it takes considerable effort to "reacall" how to replicate. Apparently, by default, Windows Media Player enables what's called, Video Overlay, to improve the output of the video it renders. Unfortunately, this streams the bits directly to the video card, which makes it difficult to obtain any sort of screen shot using the usual ALT + PRTSCN sequence.</p>
<p>Thankfully, you can disable this setting (temporarily I recommend) to buffer the stream through the OS. Simply modify the setting in Windows Media Player as shown here.</p>
<p><img title="Disable Overlay in Windows Media Player" alt="Disable Overlay in Windows Media Player" src="http://www.skonet.com/uploadedImages/Home/Blog/screen-disable-video-overlay.png" /></p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Tips_to_Protect_Yourself_From_Phishing_Schemes.aspx?blogid=91">
  <title>Tips to Protect Yourself From Phishing Schemes</title>
  <link>http://www.skonet.com/Articles_Archive/Tips_to_Protect_Yourself_From_Phishing_Schemes.aspx?blogid=91</link>
  <description><![CDATA[<p>Never provide your personal information when responding to an unsolicited email request, no matter how legitimate the communication may look. Whether by phone, email or internet site, data created by phishers may look like the real thing. If you</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<ol>
<li>Never provide your personal information when responding to an unsolicited email request, no matter how legitimate the communication may look. Whether by phone, email or internet site, data created by phishers may look like the real thing. If you didn’t initiate the communication, you shouldn’t provide any information. </li>
<li>Never provide a password over the telephone in response to an unsolicited request. Financial institutions should never ask you to verify your account information online. </li>
<li>Contact the financial institution yourself, if you believe the contact may be legitimate. Phone number and websites can be found on your monthly statements from your financial institutions. You can also look up companies on the internet or in phone books. </li>
<li>Regularly review your account statements to confirm there are no fraudulent charges. If your account statement is ever late, immediately contact the financial institution to determine why. </li>
<li>Visit the anti-phishing working group website to obtain a list of the most recent incidents of phishing and find the latest news in the fight against phishing, www.antiphishing.orgBecoming Proactive </li>
</ol>
<p>When you encounter a potential fraud, especially if you believe you’ve lost money, act immediately:</p>
<ul>
<li>If you receive phishing emails, you can report the fraud to the FBI’s Internet Fraud Complaint Center at www.ic3.gov, and forward the email to <a href="mailto:enforcement@sec.gov">enforcement@sec.gov</a>, to pass the tip to the SEC’s Enforcement Division. </li>
<li>If you think your personal information has been compromised, visit the <a href="http://www.consumer.gov/idtheft" target="_blank">Identity Theft Resource Center of the Federal Trade Commission</a> for more information on how to proceed with protecting yourself and minimizing the damage.</li>
</ul>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Configure_Custom_QuickLinks_in_Ektron.aspx?blogid=91">
  <title>How to Configure Custom QuickLinks in Ektron</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Configure_Custom_QuickLinks_in_Ektron.aspx?blogid=91</link>
  <description><![CDATA[<p>While prototyping a custom DMS asset handler today I managed to locate actual instructions on configuring your own QuickLink handlers for specific assets. However confusing it may be that these instructions were found in the “Users Manual”, I am just</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>While prototyping a custom DMS asset handler today I managed to locate actual instructions on configuring your own QuickLink handlers for specific assets. However confusing it may be that these instructions were found in the “Users Manual”, I am just glad I was able to locate it fairly quickly.</p>
<h3>Updating Default Template for Multiple Quicklinks</h3>
<p>WARNING! This procedure is only necessary if Link Management is set to false in your web.config file. If if Link Management is set to true, Ektron CMS400.NET automatically updates the template within the quicklink when content is moved. See your system administrator for help with the web.config file.</p>
<p>NOTE This action can only be performed on quicklinks. When content is moved in Ektron CMS400.NET, its quicklink does not get changed. After it is moved, you need to update the default template called in the content’s quicklink. To update the default template for one or more quicklinks, follow these steps.</p>
<ol>
<li>In the library, access the quicklinks folder containing quicklinks you want to update.</li>
<li>Click the Update Quicklinks button.</li>
<li>The Update URL Link Template Quicklinks screen is displayed.</li>
<li>Check the quicklinks you want to update. NOTE Check the box in the table header to select or deselect all.</li>
<li>In the To: text field, enter the name of the template you want to apply to the selected quicklinks. Last User to Edit Last user that made changes to the quicklink or form. Last Edit Date The date the quicklink or form was last edited. Date Created The date and time the quicklink or form was originally added to the Ektron CMS400.NET library. Field Description Library Folder Ektron CMS400.NET User Manual, Version 7.5 155</li>
<li>Click the Update Quicklinks button to update the changes. A confirmation message is displayed.</li>
<li>Click OK to continue. The selected quicklinks are updated to use the specified template.</li>
</ol>
<p>These instructions can also be found in the <a href="http://www.ektron.com/manuals/cms400/usermanual.pdf#quicklinks" target="_blank">Ektron User’s Manual</a>.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Convert__NET_DateTime_to_UNIX_Timestamp.aspx?blogid=91">
  <title>How to Convert .NET DateTime to UNIX Timestamp</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Convert__NET_DateTime_to_UNIX_Timestamp.aspx?blogid=91</link>
  <description><![CDATA[<p>How to convert .NET DateTime to UNIX timestamp (as in PHP, etc.)int timestamp = (DateTime.UtcNow new DateTime(1970,1,1,0,0,0)).TotalSecondsand convert a Unix timestamp to an ASP.NET DateTime value DateTime date = (new DateTime(1970,1,1,0,0,0)).AddSeconds(datestamp)</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<div>How to convert .NET DateTime to UNIX timestamp (as in PHP, etc.)</div><div class="code">int timestamp = (DateTime.UtcNow - new DateTime(1970,1,1,0,0,0)).TotalSeconds</div><div>and convert a Unix timestamp to an ASP.NET DateTime value:</div><div class="code">DateTime date = (new DateTime(1970,1,1,0,0,0)).AddSeconds(datestamp)</div>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Encoding_and_Downloading_FLV_Media.aspx?blogid=91">
  <title>Encoding and Downloading FLV Media</title>
  <link>http://www.skonet.com/Articles_Archive/Encoding_and_Downloading_FLV_Media.aspx?blogid=91</link>
  <description><![CDATA[<p>One of the greatest features of Flash is the ability to encode video for online playback. For those that have not done this, the quick notes version Create a blank Flash movie (somewhere near the dimensions of the source video)</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>One of the greatest features of Flash is the ability to encode video for online playback. For those that have not done this, the quick notes version:</p>
<ol>
<li>Create a blank Flash movie (somewhere near the dimensions of the source video)</li>
<li>File | Import | Import to library…</li>
<li>Select Windows | Library OR CTRL + L for those key-jockeys out there</li>
<li>Select the imported movie from the library</li>
<li>Right-click | Properties</li>
<li>In the Embedded Video Properties dialog box, click Export.</li>
<li>Save the movie for later use</li>
</ol>
<p>Now, what if we want to be able to download an FLV movie from somewhere on the web. Lately I have been researching ways to leverage various online social media provider’s technologies (and uhm, assets.) In doing so, I rely heavily on <a href="http://www.fiddlertool.com/fiddler/" target="_blank">Fiddler</a>, an HTTP debugging proxy which logs all HTTP traffic between your computer and the Internet (that is all IE traffic.) By listening to the HTTP requests being sent from any embedded Flash application from your local computer, FLV assets from YouTube, Brightcove and others are easily retrievable. Although there are freely available plug-ins for Firefox and Internet Explorer that <em>occasionally</em> work, oftentimes it becomes necessary to dig in and get your hands dirty. Let’s dirty up…</p>
<p><span id="more-666"></span></p>
<ol>
<li>Download, install and run Fiddler 2 (you’ll need the latest version of .NET 2.0)</li>
<li>Disable capture (F12)</li>
<li>Launch IE (any recent flavor will due)</li>
<li>Open up <a href="http://www.youtube.com/" target="_blank">YouTube.com</a>, <a href="http://www.brightcove.tv/" target="_blank">Brightcove.tv</a> or any media outlet that offers streaming video via Flash</li>
<li>Return to Fiddler and click F12 to begin capture (this is important or you will miss the capture part of this mini-tutorial)</li>
<li>Now, browse to a page that has the video you wish to <em>“archive”</em> and allow it to load and begin playing <em>(I have found that sometimes Fiddler or the site will hang, you may need to start capture a few times to get the page to load up.)</em> </li>
<li>Return to Fiddler and click F12 again (we have captured all we need)</li>
</ol>
<p>You should have a list of links that Fiddler has so graciously tracked for us. Now time to locate the actual session that contains the source movie.</p>
<ol>
<li>Click CTRL + F (find) and type <em><strong>video/flv</strong></em> in the text box</li>
<li>Search | Requests and Headers</li>
<li>Examine | Headers and Body</li>
<li>Click Find Sessions</li>
</ol>
<p>Now the final step, download the FLV source. This is the easy part. Fiddler gives us an easy copy context menu to handle this:</p>
<ol>
<li>Right-click the link session that the find from above highlighted.</li>
<li>Copy | Just Url (CTRL + U)</li>
<li>Paste the copied URL into your favorite download accelerator or just paste it directly into IE or Windows Explorer.</li>
</ol>
<p>As long as you do not have the FLV extension associated to any other Windows application, you should be prompted with a Save/Open dialog box. Save the file down to your computer and you are done.</p>
<p>Granted, not a lot you can do directly with an FLV file. Perhaps I’ll put something together on how to actually use the FLV source at a later day.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_API_to_Access_Localization_Tag.aspx?blogid=91">
  <title>Ektron API to Access Localization Tag</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_API_to_Access_Localization_Tag.aspx?blogid=91</link>
  <description><![CDATA[<p>I ran across an interesting API library deep in the Ektron API framework that allows you to pull the actual localization tag (e.g. en US, en GB, etc.) for the current language type id of the site (e.g. 1033, 2058,</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I ran across an interesting API library deep in the Ektron API framework that allows you to pull the actual <a href="http://www.iana.org/assignments/language-tags" target="_blank">localization tag</a> (e.g. en-US, en-GB, etc.) for the current language type id of the site (e.g. 1033, 2058, etc.). Previous to this, we had to create our own associative, key/value pair XML file that stored the relationships. Since I could only find a single reference to this library on the Ektron site, I hoping this information proves useful to others. Enjoy.</p>
<pre class="code">
// retrieve the language date for the current site API instance
Ektron.Cms.SiteAPI sAPI = new Ektron.Cms.SiteAPI();

// assign the localization tagstring langTag = Ld.XmlLang;
Ektron.Cms.LanguageData ld = sAPI.GetLanguageById(ContentBlock.LanguageID);
</pre>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/How_to_Delete_a_Windows_Service.aspx?blogid=91">
  <title>How to Delete a Windows Service</title>
  <link>http://www.skonet.com/Articles_Archive/How_to_Delete_a_Windows_Service.aspx?blogid=91</link>
  <description><![CDATA[<p>I have used the service controller command line tool for years. I have finally decided to write something up on it briefly since I have been working with various frameworks systems that are not completely removing their services after uninstalling</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-26T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I have used the service controller command line tool for years. I have finally decided to write something up on it briefly since I have been working with various frameworks/systems that are not completely removing their services after uninstalling them.</p>
<ol>
<li>Open services applet/application: Start | Programs | Administrative Tools | Services</li>
<li>Locate offending Service</li>
<li>Double-click OR Right-click | Properties</li>
<li>Copy the ‘Display Name’ property</li>
<li>Stop the service</li>
<li>Exit service information screen and services applet</li>
<li>Start | Run | cmd | OK</li>
<li>Type: cs delete “%PASTE OR TYPE THE SERVICE NAME HERE%”</li>
<li>Hit enter key</li>
<li>Service has been deleted</li>
</ol>
<p>You may or may not be able to delete the service depending on it’s dependencies. You will need to follow the chain down to any child services if that is the case and delete them first. You may also be required to reboot.</p>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/Ektron_Issues_with_Redirecting_Submitted_Form_Data.aspx?blogid=91">
  <title>Ektron Issues with Redirecting Submitted Form Data</title>
  <link>http://www.skonet.com/Articles_Archive/Ektron_Issues_with_Redirecting_Submitted_Form_Data.aspx?blogid=91</link>
  <description><![CDATA[<p>I have been architecting, designing, and programming Ektron CMS400.NET web applications for over a year now. Though not an expert, I feel I am to the point I can actually add value to other programmers architects who may be running</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-25T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<div class="entry"><p>I have been architecting, designing, and programming Ektron CMS400.NET web applications for over a year now. Though not an expert, I feel I am to the point I can actually add value to other programmers/architects who may be running into similar issues as I have. This is my first snippet of advice.</p>
<p>When developing custom action pages for the built in Ektron forms, remember to set the Page directives as specified in the Administrator Manual.</p>
<p><em>page 312</em></p>
<p><code>If your site is using URL Aliasing, the action page’s header must include the following:<br />
EnableEventValidation=”false” EnableViewStateMac=”false”<br /></code></p>
<p>Apparently when you set the EnableViewStateMac attribute to true, the encoded and encrypted view state is not checked to verify that it has not been tampered with on the client. Otherwise .NET will not persist the Viewstate from the original .NET form to the action page specified in the Ektron form.</p>
<p>Though disabling the EnableEventValidation attribute may be necessary, I don’t see any real reason since the page that is handling the postback shouldn’t have any controls on it in the first place. However, in the event it does, the page’s validation must be turned off else the postback handler will not validate the form post.</p>
</div>]]></content:encoded>
 </item>
 <item rdf:about="/Articles_Archive/SharePoint_Wiki_Homepage_Not_Working.aspx?blogid=91">
  <title>SharePoint Wiki Homepage Not Working</title>
  <link>http://www.skonet.com/Articles_Archive/SharePoint_Wiki_Homepage_Not_Working.aspx?blogid=91</link>
  <description><![CDATA[<p>I ran into an issue when migrating a SharePoint Wiki list from one site to another. In creating a Wiki list based on a saved template (with content) the default home document was broken or not being set. So the</p>]]></description>
  <dc:creator>Jason</dc:creator>
  <dc:date>2009-07-25T14:54:00Z</dc:date>
  <content:encoded><![CDATA[<p>I ran into an issue when migrating a SharePoint Wiki list from one site to another. In creating a Wiki list based on a saved template (with content) the default home document was broken or not being set. So the QuickLink link takes you to the Wiki list default view, AllItems.aspx, rather than the Home.aspx document as it normally should. Apparently, WSS does not allow administrators to <a href="http://office.microsoft.com/en-us/sharepointserver/HA101577851033.aspx" target="_blank">change the welcome page</a> property, only MOSS.</p>
<p>In searching for a fix to this, I ran across a blog post of someone that had similar <a href="http://mphacker.spaces.live.com/blog/cns%218040CC624DDC5404%21279.entry" target="_blank">SharePoint Wiki Library issues</a>, and recommended a great utility called the <a href="http://www.codeplex.com/spm" target="_blank">SharePoint Manager 2007</a>. It allows you to view/edit the SharePoint object model directly.</p>
<p>So, to fix the broken Home.aspx Wiki list, you set the /Site/RootFolders/Wiki/WelcomePage property to "Home.aspx".</p>
<p>Hope this helps someone else out there.</p>]]></content:encoded>
 </item>
</rdf:RDF>

