Blog Home  Home Feed your aggregator (RSS 2.0)  
Venexus DotNetNuke Blog
DotNetNuke Articles, Code Snippets, Errors, and News
 
 Tuesday, December 18, 2007

As you can tell there has not been much activity on this blog, but not because there has not been anything going on. There has been so much going on that I simply have not had the time to make a post....here. However, we have a new blog that allows all Venexus employees to post that can be found here: http://www.venexus.com/Resources/Blog.aspx

You can update your feeds here:

Feed Title RSS
25 Latest Articles
DotNetNuke
Error Messages
Modules
Search Engine Optimization
Skins
SQL Server

I will make one more post here to sum up the year, but this is definitely the next to last post for this blog. We will move some of the most popular articles from this blog to the new one, but eventually this blog will be shutdown. More later...

Tuesday, December 18, 2007 6:28:38 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Thursday, October 11, 2007

We all know that the keyboard is faster than the mouse right? Well here is a quick way to open any application with about 3 keystrokes:

  1. Create a new folder anywhere you like. I put mine in c:\utils\shortcuts.
  2. Place the folder in your path. You can do this by
    1. Opposite click My Computer and choose Properties
    2. Select the Advanced tab.
    3. Choose Environment Variables
    4. Select Path in the System Variables and choose Edit
    5. At the end of the Variable Value path add “;c:\utils\shortcuts” or the path to your shortcut folder. The “;” may already be there.
  3. Create or copy shortcuts to frequently used applications to your new folder. You can also use shortcuts to folder locations.
  4. Rename the shortcuts with 2 or 3 letter identifiers for quick typing. Here are a few I use:
    1. mo = Microsoft Outlook
    2. ie = Internet Explorer
    3. ff = Firefox
    4. rdc = Remote Desktop Client
    5. ps = Windows PowerShell
    6. data = My data directory

Now when I want to run a program, I open the Run box by pressing Windows Key + R, type my shortcut name (ex. mo), and press Enter. It’s faster and easier than finding an icon with the mouse

- By Michael Sullivan

Thursday, October 11, 2007 8:24:28 AM (US Eastern Standard Time, UTC-05:00)  #       | 
 Tuesday, September 11, 2007

Venexus has a job opening for a DotNetNuke Module Developer.

Title: DotNetNuke Module Developer

 

Skills Required:

1.      VB.Net OR C#

2.      SQL Server

3.      Code Generation Techniques

4.     DotNetNuke (must know architecture of DotNetNuke web application framework)

Skills Desired:

1.      EntitySpaces

2.      Gemini

3.      Subversion

4.      CruiseControl.Net

5.      VB.Net AND C# (Ability to read and code in both)

Location:

We would prefer to find a local candidate (Raleigh, NC), but if you have the skills, it does not matter where you live.

 

Description:

This position will be responsible for assisting in the analysis, design, development and ongoing support of DotNetNuke and the modules we create and modify for our clients. This position will assist with verification testing, troubleshooting and failure analysis of new versions of DotNetNuke, core modules, 3rd party modules, and custom modules. The developer must be able to commit and meet deadlines.

 

The person filling this position will be working in a team environment and may be expected to have on-call responsibilities. The candidate should have excellent verbal and written communications skills with a positive customer support attitude. A person who is flexible and self-motivated will be the selected candidate.

 

Additional Requirements:

1.      You must love code.

         If you didn’t love it, you wouldn’t be doing it, right? 

 

Compensation:

Dependant upon experience

 

Please send salary expectations and resumes to careers (at) venexus (dot) com. No recruiters please!

 

Tuesday, September 11, 2007 3:28:57 PM (US Eastern Standard Time, UTC-05:00)  #       |  |   | 

Venexus has 2 positions open for DotNetNuke Support Specialist.

Title: DotNetNuke Support Specialist

Skills Required:

1.     DotNetNuke (must have previous experience running and managing DotNetNuke sites)

2.     Excellent communication skills

 

Skills Desired:

1.      Gemini

2.      RDC/RDP

3.      IIS

4.      SQL Server

 

Location:

Any.

 

Description:

This position will be responsible for assisting in the support of DotNetNuke for client websites. This position will assist with verification testing, troubleshooting and failure analysis of new versions of DotNetNuke, core modules, 3rd party modules, and custom modules.

 

The person filling this position will be working in a team environment and may be expected to have on-call responsibilities. The candidate should have excellent verbal and written communications skills with a positive customer support attitude. A person who is flexible and self-motivated will be the selected candidate.

 

Compensation:

Dependant upon experience

Please send salary expectations and resumes to careers (at) venexus (dot) com. No recruiters please!

 

Tuesday, September 11, 2007 3:23:06 PM (US Eastern Standard Time, UTC-05:00)  #       |  |   | 
 Thursday, July 19, 2007

Ready to configure DotNetNuke to use Active Directory for authentication? Here are some basic instructions for configuring AD in DNN that works with DNN 4.5.3:

ADMIN SETTINGS

1.    Log into DNN as Host

2.    Go to Admin > Authentication

3.    Check "Windows Authentication".

4.    Check "Synchronize Role?"

5.    Provider is "ADSIAuthenticationProvider"

6.    AuthType is "Delegation"

7.    Domain: dc=yourdomainminusthedotcom, dc=com

8.    Email domain: @yourdomain.com

9.    Click "Update".

10.  You should see a message like this...unless it does not work ;-):
 Accessing Global Catalog:
OK
Checking Root Domain:
OK
Accessing LDAP:
OK
Find all domains in network:
1 Domain(s):
yourdomain.com (SN)
  

 

IIS SETTINGS: 

1.  Open IIS Manager and find the following file within the DNN site: /Admin/Security/WindowsSignin.aspx,

2.  Right click on WindowsSigin.aspx and select “Properties”

3.  Click “File Security” tab

4.  Click “Edit” in the ‘Authentication and access control’ section

5.  UNCheck box for "Enable anonymous access" and check "Integrated Windows authentication".

6.  Choose “OK” until out of the Properties box

 

ENABLE AUTHENTICATION HTTPMODULE IN WEB.CONFIG:

1.                  Open web.config file with editor

2.                  UNComment the authentication in httpmodule section (<httpmodules>) in Web.config and save file:

<add name="Authentication" type="DotNetNuke.HttpModules.AuthenticationModule, DotNetNuke.HttpModules.Authentication" />

You should be able to login and authenticate to the site.

We performed an upgrade and Active Directory configuration this morning for a client, using DNN 4.5.3 and the above instructions worked flawlessly. This is a slightly modified version of instructions found on the DNN Forums by kimberlyrox.

Thursday, July 19, 2007 12:51:29 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Tuesday, June 05, 2007

We have installed and upgraded quite a few sites to the latest DNN version, 4.5.3, that came out last week and most went seamlessly. However, we have found one issue that has raised it's ugly head quite a few times. After upgrading, if you clicked on "Register" you would be redirected to an admin skinned page with no account fields/content. Looking at the url you can see "/ctl/returnurl". Since the site(s) uses a custom page using a 3rd party module for registration for the account info, it is specified in Admin > Site Settings > Advanced Settings > Page Management > User Page.

Here is the error message:

System.Web.HttpException: Could not load type ''. ---> System.ArgumentException: String cannot have zero length. at System.Reflection.Assembly.GetType(String name, Boolean throwOnError, Boolean ignoreCase) at System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) --- End of inner exception stack trace --- at System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) at DotNetNuke.Framework.Reflection.CreateType(String TypeName, String CacheKey, Boolean UseCache, Boolean IgnoreErrors)

Luckily we found a post on the DNN Forums concerning the quick fix...

4.5.3 New user registration not working if specific page defined

In the above post someone else was having a similar issue. It looks like there was a bug reported as well:

http://support.dotnetnuke.com/issue/ViewIssue.aspx?id=5746

While there could definitely been a longer or better description of the problem, it was quickly closed with "unable to reproduce in 4.5.3" the next day without any followup. Luckily the thread on the forums gained the interest of other having the issue and vitkoz was kind enough to run it through debugging to find the issue and hence the issue has been reopened in the DNN issue tracker.

Here is his fix:

"In the file admin/skins/user.ascx.vb, line 142 needs to be changed:

 

 FROM THIS:

Response.Redirect(NavigateURL(PortalSettings.UserTabId,"returnurl=" & ReturnUrl), True)

TO THIS:

Response.Redirect(NavigateURL(PortalSettings.UserTabId, "Register", "returnurl=" & ReturnUrl), True)

You can simply go to that file, make that change, and IIS will recompile it on the next run." - vitkoz

Tuesday, June 05, 2007 11:02:33 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
 Thursday, May 31, 2007

After a brief debut of DNN 4.5.2 on Tuesday, DNN 4.5.3 was released today. Here is a list of changes in 4.5.2:

Component Issue Type Issue ID Summary Resource Status
(4.5.2) Stabilization Release Admin / Host Functions Bug DNN-5516 Exclude .dnn.config file from Module Packaging   Checked-In
Admin / Host Functions Bug DNN-5452 AddRoleGroup does not return new RoleGroupID   Checked-In
Admin / Host Functions Bug DNN-5529 Adding a Page in 4.5.1 Puts the Page Name in the other fields on edit   Checked-In
Admin / Host Functions Bug DNN-5703 URL Control and postback? when? Checked-In
Admin / Host Functions Bug DNN-5546 Import Portal Template fails due to unknown attributes >Shaun Walker Checked-In
Admin / Host Functions Enhancement DNN-5724 Date/Time Edit Controls   Checked-In
Admin / Host Functions Enhancement DNN-5649 Block website access based on defined criteria >Joe Brinkman Checked-In
Admin / Host Functions Enhancement DNN-1901 Please expose CDO configuration field "smtpserverport" in Host Settings tab.   Checked-In
Admin / Host Functions New Feature DNN-5536 Log application shutdown reason   Checked-In
Admin / Host Functions Task DNN-4371 Generated html code needs tidying   Checked-In
General Bug DNN-5691 GeoIP Detection   Checked-In
General Enhancement DNN-5725 Add TokenReplace support for Custom Profile Properties   Checked-In
Installation / Upgrade Bug DNN-5720 Versioning in Module Definitions doesn't work Checked-In
Installation / Upgrade Bug DNN-5690 Exception during installation of 4.x WSP modules >Shaun Walker Checked-In
Installation / Upgrade Bug DNN-5483 Edit Module Definition / Update erases the state of DNN Interfaces   Checked-In
Localization / ML Bug DNN-5526 Resource Verifier does not catch all resource files   Checked-In
Localization / ML Bug DNN-2612 XML Error in Resource Verifier   Reopened
Security Bug DNN-5510 Permission Grid - Username Edit - Enables All Users Edit   Checked-In

I am not sure what was changed in DNN 4.5.3 except for the following task in Gemini:

Component Issue Type Issue ID Summary Resource Status
(4.5.3) Stabalization Release Admin / Host Functions Bug DNN-5736 Admin notification of User/Vendor (un)registration contains empty fields   Checked-In

Scott Schecter made a post on his blog about how to disable new search features in DNN 4.5.2. I have not checked to see if these changes still apply to DNN 4.5.3.

Anyone know what else prompted the new release today?

UPDATE 6-1-2007:

Joe Brinkman of the core team commented that it was security related and provided a URL to Sebastian Leupold's post concerning the upgrade. Here is the list:

  • banner advertising disabled for all users by default
  • tab permission grid issue, where individual user permissions affected "all users" role's permission
  • incorrect display of "Upgrade available" icon for Layout Objects in Module Definitions eliminated
  • issue with login page redirect after signin corrected
  • updated ModuleControl definition for Adsense module and FeedbackExplorer, removing SolutionsExplorer
  • problem with [custom] tokens in system messages fixed
  • Thursday, May 31, 2007 10:33:57 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Saturday, May 26, 2007

    We had a DNN 4.4.1 to 4.5.1 upgrade that threw a few SQLDataProvider errors during the installer that were caused by duplicate files in DNN Files table. Not sure how they got there, but here is a SQL statement to check if they exist:

    SELECT PortalID, Filename, Folder, COUNT(Filename) AS NumOccurrences

    FROM files

    GROUP BY Filename, PortalID, Folder

    HAVING ( COUNT(Filename) > 1 AND Count(PortalID) > 1 AND Count(Folder) > 1)

    Here is the SQL that was provided in the log file from the installer:

    /* add unique constraint to Files table */
    IF NOT EXISTS (select * from dbo.sysobjects where id = object_id(N'dbo.[IX_FileName]') and OBJECTPROPERTY(id, N'IsConstraint') = 1)
    BEGIN
      declare @FolderID int
      declare @FileName nvarchar(100)
      declare @FileID int
      declare @MinFileID int

      select @FolderID = min(FolderID)
      from Folders
      while @FolderID is not null
      begin 
        /* check for duplicate Filenames */
        select @FileName = null
        select @FileName = FileName
        from Files
        where FolderID = @FolderID
        group by FileName
        having COUNT(*) > 1
     
        /* if duplicates exist */
        if @FileName is not null
        begin
          /* iterate through the duplicates */
          select @FileID = min(FileID)
          from Files
          where FolderID = @FolderID
          and FileName = @FileName

          /* save min FileID */
          select @MinFileID = @FileID

          while @FileID is not null
          begin
            if @FileID <> @MinFileID
            begin
              /* remove duplicate file */
              delete
              from Files
              where FileID = @FileID
            end

            select @FileID = min(FileID)
            from Files
            where FolderID = @FolderID
            and FileName = @FileName
            and FileID > @FileID
          end
        end

        select @FolderID = min(FolderID)
        from Folders
        where FolderID > @FolderID
      end
      
      ALTER TABLE dbo.Files ADD CONSTRAINT
        IX_FileName UNIQUE NONCLUSTERED
        (
          FolderID,
          FileName
        ) ON [PRIMARY]
    END

     

    Saturday, May 26, 2007 12:48:57 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Wednesday, May 16, 2007

    We have immediate openings for DotNetNuke Module Developers.

    Title: DotNetNuke Module Developer
     
    Skills Required:
    1. VB.Net or C#
    2. SQL Server
    3. Visual Studio 2005
    4. Code Generation Techniques
    5. DotNetNuke
     
    Skills Desired
    1. EntitySpaces
    2. Gemini
    3. Subversion
    4. CruiseControl.Net
    5. VB.Net AND C# (Ability to read and code in both)
     
    Location:
    We would prefer to find a local candidate (Raleigh, NC), but if you have the skills, it does not matter where you live.
     
    Description:
    This position will be responsible for assisting in the analysis, design, development and ongoing support of DotNetNuke and the modules we create and modify for our clients. This position will assist with verification testing, troubleshooting and failure analysis of new versions of DotNetNuke, core modules, 3rd party modules, and custom modules. The developer must be able to commit and meet deadlines.
     
    The person filling this position will be working in a team environment and may be expected to have on-call responsibilities. The candidate should have excellent verbal and written communications skills with a positive customer support attitude. A person who is flexible and self-motivated will be the selected candidate.
     
    Additional Requirements:
    1. You must love code.

             If you didn’t love it, you wouldn’t be doing it, right?

    1. The weak shall not apply.
             Please do not waste our time if you do not know how to code or have never used DotNetNuke.
     

    Request for more information and resumes can be submitted to careers (at) venexus (dot) com. No recruiters please!

    Wednesday, May 16, 2007 3:25:00 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Sunday, April 29, 2007

    If you didn't catch it, DotNetNuke announced the first officially sponsored DotNetNuke conference in Las Vegas November 5-8, 2007. Last year was the first time I had been to Vegas, when we went to a modular software development conference last September. It was fun meeting some of the guys in the DNN community and I look forward to meeting them and others again this year. According to Joe Brinkman's blog, DotNetNuke is actively seeking speakers to submit session proposals and selected speakers will receive "3 nights of lodging at the Mandalay Bay Casino and Hotel". While I probably will not be giving a speech, Michael, Scott and I have already marked our calendars, and we may have to twist the arm of a couple more staff to go with us, depending on development schedules. Sounds like fun, see ya there!

    Sunday, April 29, 2007 2:40:03 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Friday, April 20, 2007

    Continuous integration is a software development term describing the process that completely rebuilds and tests applications frequently. We recently implemented a continuous integration environment to “publish” our DotNetNuke modules to our development/staging DotNetNuke sites.

    The main advantages of a continuous integration environment are:

    • Issues are detected and fixed continuously!
    • Enhancements and new features are published continuously!
    • You are warned about problematic code before it is published.
    • Immediate unit testing of all changes.
    • Constant availability of a "current" build for testing, demos, or releases.
    • Bragging rights for developers who have the least number of broken builds.
    • Huge conservation of time when considering the normal administrative process of Build > Package > install in DNN > Test.
    • Did I mention this is continuous?

    How Our CI and DNN Environment Works

    Below is a picture to show you the basics of how our continuous integration environment works.

    Disclaimer:

    1. If you are running Visual Studio 2005 Web Developer Express, our setup will not work for you. You can stop reading here, or upgrade, unless you are just curious, then read on…
    2. There have been long discussion on Web Site Projects (WSP) versus Web Application Projects (WAP) and this post is not one to argue about which is better, rather than to say this is what we do, and the basics of how it works.
    3. You are free to comment and collaborate with others on this post. Feel free to even argue about WAP versus WEP, or that you may know of a way to integrate CI with DNN and WSP, we really do not care. However, we do not have time to walk you through setting any of this up, so please do not ask…unless you are interested in one of our DNN support packages, then by all means we can help ;-)
       

    Basics of the process:

    1. A developer “commits” the DNN module code to Subversion.
    2. The commit triggers CruiseControl.Net to “build” the DNN module using a “Trigger” for the project.
    3. CruiseControl.Net can be configured to unit test the module before publishing.
    4. An “ExecutableTask” is used with our custom assembly publisher application to send the .DLL file to the DNN website.
    5. A “BuildPublisher” sends the code from the source directory to the DNN site (D:\DNNSites\ClientDevSite\DesktopModules\CustomDNNModule as example).
    6. Results of “build” are visible in the CruiseControl.Net Web Dashboard.
       

    Implementing CI for DNN Development

    Development:

    We started DotNetnuke 4 development using the WSP methodology for all of our DNN projects. This has been successful for us for quite a while, especially when using EntitySpaces for the Persistence Layer and Business Objects (it's so easy using ES to generate the DAL. You must check this out if you are not using it). However, we found that to make this work we have to use WAP projects. I have a very fast laptop, but using WSP and doing a build of all of DNN to compile a module can be quite time consuming, taking several minutes sometimes. But, building a WAP project is FAST, saving some development time when debugging and testing builds, especially when doing those final little tweaks. One could argue that WSP is better, but for our setup with one to many developers working on a single module, WAP is the best decision. So, it did not take much to twist our arm to changing our methodology. It is unfortunate that in order to use this for our existing clients and projects, we will need to convert our WSP modules to WAP. But, we have started developing all new modules as WAPs and converting WSP modules to WAP is not a difficult task.

    To read about the great WSP versus WAP debate, see the following links:

    Shaun Walker’s post on WAP

    http://www.dotnetnuke.com/Community/Blogs/tabid/825/EntryID/434/Default.aspx

    An interesting debate between Michael Washington and Vladan Strigo

    http://www.dotnetnuke.com/Projects/ModuleNews/Forums/tabid/953/forumid/111/threadid/91268/threadpage/6/scope/posts/Default.aspx

    WAP Methodology

    “Web Application Projects provide a companion web project model that can be used as an alternative to the built-in Web Site Project in Visual Studio 2005. This new model is ideal for web site developers who are converting a Visual Studio .Net 2003 web project to Visual Studio 2005. (Released May 8, 2006)” - http://msdn2.microsoft.com/en-us/asp.net/aa336618.aspx

    Michael Washington has a great post on creating a DNN WAP Module:

    http://www.adefwebserver.com/DotNetNukeHELP/DNN4_WAP/

    Once the module is ready for testing on our client development site, we use TortoiseSVN to “commit” code to Subversion (http://tortoisesvn.tigris.org/).

    Source Code Version Control:

    We use Subversion for our source code repository and version control system (http://subversion.tigris.org/). We have tried Visual SourceSafe and CVS, but have been using Subversion with success for quite some time now. CruiseControl.Net integrates with Subversion easily. It is also nice that there is a plugin for Subversion that allows us to send our comments directly to Gemini (project management/tracking application) when we commit new code.

    Continuous Integration Software:

    We use CruiseControl.Net, a .Net port of the Java based CruiseControl 

    Continuous Integration Server using CruiseControl.Net

    The CruiseControl.Net Server automates the integration process by monitoring the team's source control repository directly. Every time a developer commits a new set of modifications for the DNN module, the server will automatically launch an integration build to validate the changes. When the build is complete, the server notifies the developer whether the changes that they committed integrated successfully or not.

    CruiseControl.Net allows for several different types of “Tasks”, such as:

    • EmailPublisher (for emailing of build details)
    • ExecutableTask (for kicking off executables, such as our custom assembly publisher)
    • NAntTask (for unit testing)
    • NUnitTask (for unit testing)
    • RSSBuildsPublisher (for generating a RSS feed with details)
    • VisualStudioTask (for running something in VS)
    • Etc.

    Here is an example ccnet.config:
    <!--<ccnetconfig><configurationVersion>1.2.1</configurationVersion></ccnetconfig>-->
    <cruisecontrol>
      <project name="BPLWantList">
        <workingDirectory>D:\cibuilds\ProjectName\ModuleName</workingDirectory>
        <webURL>http://ourCIdomain.com/server/local/project/ModuleName/ViewProjectReport.aspx</webURL>
        <sourcecontrol type="svn">
          <trunkUrl>svn://localhost/ProjectName/ModuleName</trunkUrl>
        </sourcecontrol>
        <triggers>
          <intervalTrigger name="Quarter Hour Build" seconds="900" />
        </triggers>
        <tasks>
      <exec>
          <executable>VenexusAssemblyPublisher.exe</executable>
          <baseDirectory>D:\</baseDirectory>
          <buildArgs>"d:\Source\ProjectName\DesktopModules\ModuleName\obj\Debug" "d:\DevSites\ProjectName\bin"</buildArgs>
      </exec>
        </tasks>
        <publishers>
          <buildpublisher>
            <sourceDir>D:\cibuilds\ProjectName\ModuleName</sourceDir>
            <publishDir>D:\DevSites\ProjectName\DesktopModules\ModuleName</publishDir>
      <useLabelSubDirectory>false</useLabelSubDirectory>
          </buildpublisher>
          <xmllogger />
          <statistics />
        </publishers>
      </project>
    </cruisecontrol>


    CruiseControl.Net Web Dashboard

    The CruiseControl.Net Web Dashboard Application is used for reporting a wide range of information about the builds. At one end of the scale it reports summary details of all projects in your organisation and at the other it can give specific metric output for any specific build.

    Here is an example of a simple DNN Module being used in our CI environment:

    Notice the failed build notification. While we have not setup unit testing, you can see in the left menu in the image, there are quite a few different options.

    Conclusion

    For long term DotNetNuke module projects, setting up a continuous integration environment will save a tremendous amount of time in the long run. All of the tools to implement CI are free, lowering the total cost of DNN module development. With a little bit of time setting up your environment, you can provide continuous updates to your clients, all while forcing good coding practices among your developers. 
     

    Friday, April 20, 2007 1:47:50 AM (US Eastern Standard Time, UTC-05:00)  #       |  |   | 
     Sunday, April 08, 2007

     I have been asked to compare the differences between our search engine and Open-SearchEngine. I agree this is an important question that needs to be answered, so I decided to put together a comparison between the core DNN Search, Open-SearchEngine, and Venexus Search Engine. While my opinion of which is the best, is defintely biased toward our own product, I have tried to provide an in-depth look at the basics of how each search engine works, a feature matrix, and simple search results analysis. Without further ado, read on...

    DotNetNuke Search (core project)
    DNN Search is part of the DNN core that is installed and configured out of the box.
     
    DotNetNuke Search consists of 4 main pieces:
    • Scheduled Task

    The scheduled task initiates the process of indexing the modules, at the scheduled time interval. An iteration of all modules that support iSearchable is performed. During this process, text that is extracted from the module is cleaned, parsed, and added to search word and search items tables.

    • Search Admin

                        The search admin is for setting the maximum word length, minimum word length, option to include common words, and the option to include numbers. 

    • Search Input Module

    A module or skin object can be used to provide the form for the search query. In module settings, you can use the default button, or an image. You do not have the option to change this image within the module, nor change the text. Styles can be used to make some look and feel changes, but it is limited. When a search is performed, the user is redirected to the Search Results page.

    • Search Results Module
    This module provides the search results. In the settings, you can set the maximum search results, results per page, maximum title length, maximum description length, and the option to show description. Results are limited to the exact word queried.
     
    Oddly enough, there no longer appears to be a DNN forum for search, or a blog dedicated to it on the DotNetNuke website. However, a good place to find out more about the core module is ecktwo’s site. There is a lot of information about how all the pieces work together, as well as the bugs/issues of DotNetNuke Search. There is also a tutorial and report on DNN Search for DNN 4.
     
    Open-SearchEngine
    Open-SearchEngine is developed by Xepient Solutions. The package is capable of indexing HTML content as well as PDF’s and several Office documents. Open-SearchEngine uses Lucene.Net, a port of the Java Lucene Search Engine, for indexing and querying.
     
    Open-Search Engine consists of 4 main pieces:
    • Scheduled Task

    Test The scheduled task initiates the process of spidering, at the scheduled time interval. Lucene.Net handles indexing of the data.

    • Search Engine Admin Module

    This module provides an interface for configuring the search engine to your preferences. You can add a starting URL and by default, spidering is enabled. This allows you to offer multiple sites in your search engine. However, unless disabled, each time you run the process to update the index, all URLs are re-crawled. With many URLs on the site(s) you index, it can lead to a very long time between the completion of crawling and indexing runs.

    • Search Input Module 

    A module or skin object can be used to provide the form for the search query. In module settings, you can use the default button, or an image. You also have the option to add “Search” as text or image before the textbox.

    • Search Results Module
    This module provides the search results. In the settings, you can set which sites are part of the results scope, maximum results per page, maximum title length, title link target, and the option to hide description.
     
     
     
    Venexus Search Engine
    The Venexus Search Engine is quite different than the other 2 solutions. The package includes 2 modules and requires MS SQL Server Full-Text Indexing. Like traditional crawlers, VSE can crawl and index a variety of data, but where the real difference is seen is in it's ability to also “crawl” and index RSS feeds. This is the key to keeping the search results up-to-date, while conserving server and bandwidth resources. Rather than recrawling and reindexing all content, "smart caching" is used to determine when RSS feeds need to be aggregated, and when non-syndicated content needs to be recrawled on the site.
      
    The Venexus Search Engine consists of 2 main pieces:
    • Seamus Module

    The Seamus module is the “search engine aggregation module utilizing syndication”. On the first load of the module, Seamus iterates through the core DNN modules on all portals that support the iPortable interface. Seamus uses this “initial dump” to gather other URLs for the site. You also have the ability to add feeds to Seamus, not only for your site, but any external site. With “global crawler” enabled, any external site URLs that are discovered during crawling, are added to the queue as well.  Using AJAX, Seamus performs crawling of 3 feeds and 3 URLs with each load. If the user remains on the page, using AJAX, Seamus will continue to crawl and save the data to the table for indexing.  This decreases the load on the server by spreading the crawling and indexing across several user sessions, rather than a single scheduled task.

    • Search Module

    The Search module provides the search box, as well as the results. Using Microsoft SQL Server’s feature of Full-Text Indexing, data is indexed from the crawling and storing provided by Seamus. Within the settings you can specify the search button text or use you own custom image for the button, set maximum search length, set search bx size, maximum results, results per page, set maximum length of display URL, specify remote connection string (database other than DNN), specify portal specific search, or allow user to select between site or all of the web search.

    Feature Comparison Matrix:

    Below you will find a list of features for DNN Search, Open-SearchEngine, Venexus Search Engine Standard, and Venexus Search Engine PRO.

    Feature
    DNN Search
    Open-SearchEngine
    Venexus Search Engine Standard
    Venexus Search Engine PRO
    Crawling Method
    Module Indexer (Must implement iSearchable)
    Custom URL crawler/spider (Must have starting URL for each site, with crawling enabled)
    Custom Crawler
    (Uses iPortable interface, traditional URL crawler/spider, and RSS aggregation)
    Custom Crawler
    (Uses iPortable interface, traditional URL crawler/spider, and RSS aggregation)
    Crawl and Index Start
    Requires DNN Scheduled Task
    Requires DNN Scheduled Task
    User Interactive (AJAX in aggregation module)
    User Interactive (AJAX in aggregation module)
    Global Crawler
    No
    No (Requires input of each domain)
    No
    Yes
    DNN User Impersonation
    No
    Yes
    No
    No (Version 2.0)
    Windows Authentication
    No
    Yes
    No
    No (Version 2.0)
    Exclude List
    No
    Yes
    Yes
    Yes
    Excel Documents
    No
    Yes
    No
    Yes
    PDF Files
    No
    Yes
    No
    Yes
    PowerPoints
    No
    Yes
    No
    Yes
    RTF Files
    No
    No
    No
    Yes
    Word Docs
    No
    Yes
    No
    Yes
    Index File System
    No
    Yes
    No
    No (Version 2.0)
    Index
    Table Driven Index
    Lucene.Net (flat file)
    Full-Text Indexing in SQL Server (flat file)
    Full-Text Indexing in SQL Server (flat file)
    RSS
    No
    No
    No
    Yes
    Enclosure Support (podcast/vodcast)
    No
    No
    No
    Yes
    Feed Discovery
    No
    No
    Yes
    Yes
    Smart Caching
    No
    No
    Yes
    Yes
    Allow users to add feeds
    No
    No
    No
    Yes
    Generates RSS Feed of latest items indexed
    No
    No
    Yes
    Yes
    Blog and Feed Aggregator Pinging
    No
    No
    No
    Yes
    Search Skin Object
    Yes
    Yes
    Yes
    Yes
    Utilize DNN Search Skin
    Yes
    No
    Yes
    Yes
    Modify search box and image
    No
    Yes
    Yes
    Yes
    Use Image or Text for Search button
    No
    Yes
    Yes
    Yes
    Portal(site) or Web search
    No
    No
    Yes
    Yes
    Keyword Highlighting
    No
    Yes
    Yes
    Yes
    Cached Version
    No
    No
    No
    No (Version 2.0)
    User Saved Searches
    No
    No
    No
    No (Version 2.0)
    Social Bookmarking
    No
    No
    No
    Yes
    Price
    Free
    $49
    Free
    $199

    Performance and Relevancy:

    What about performance and the relevancy of the results? I setup a test site with 5 total pages of content and installed/configured DNN Search, Open-SearchEngine, and Venexus Search Engine on separate pages. I also installed PageGenerated module from Ventrian Systems to show page execution time. I am not sure of any accuracy for a benchmark here, but the following results are the best of 5 consecutive query executions against each search engine using "truman" without quotes as the search query. In reality, there are only 2 relevant pages associated with "truman". There is a link from the home page of the site with the text "Truman Doctrine" as a contextual link that directs the user to the full document about the "Truman Doctrine". Ideally, we should expect the document that is all about "truman" and his doctrine to be listed first:

    DNN Search:

    Best Execution Time: 0.218531 seconds

    Results Returned: 1

    Notes:

    The only result returned is not the most relevant page on the site. In fact, the "Truman Doctrine" page is not even listed as a result. This must be because the word "truman" does not actually appear in the content of the text/html module on the Truman Doctrine page. There is "HARRY S. TRUMAN'S ADDRESS" in the content, but DNN Search can only return results where the query is spelled EXACTLY like something in the content.

    Open-SearchEngine:
     

    Best page Execution: 0.1093155 seconds

    Returned Results: 10

    Notes:

    Notice the poor description and the fact that the true most relevant document (the "Truman Doctrine" page) is the 5th result. Also, there are several results of pages that have no information about "Truman" except for the link in the SolPartMenu. While it is good that the search engine is able to crawl the solpartmenu, it is unfortunate that the search engine weights pages that just have links in a menu higher than the most relevant result. The best page execution time was half that of DNN Search, which is excellent.

    Venexus Search Engine:

    Best Page Execution: 0.046866 seconds

    Results Returned: 3

    Notes:

    Notice the first result is the actual document (the "Truman Doctrine" page)  we are looking for. Also, page execution time is less than half the time than Open-SearchEngine and a quarter of the time compared to DNN Search.

    Conclusion:

    The implementation provided by the DNN core team for the built-in DotNetNuke Search suits the needs for many smaller sites. However, larger sites will quickly run into issues with memory consumption due to the way the module indexing is performed. The search architecture is limited and greatly impacts the performance of the site and the search results due to the indexing process and the direct SQL table queries that holds the words and index. Most likely this is due to the requirement for database independence, rather than poor design. If your site is small, needs database independence, and search results are helpful, but not really an important piece of your site, then this may be the best tool for you.

    If you are looking for a traditional search engine crawler, with good scalability, and you require database server independence, and decent search results, Open-SearchEngine may be the solution for you. It is by far better than the core DNN Search, but relies on tradional crawling and indexing methods. Conservation of bandwidth and server resources are debatable since there is no method of smart caching available. The ability for this engine to index direcories of files is an important feature than neither DNN Search, nor VSE offer. However, the lack of RSS aggregation as the new medium for crawling and gathering new and updated data is a huge issue that will lead to stagnant search results without frequently reindexing all URLs.  As evident from the simple search results analysis performed, most results are not really relevant, but it is better than not returning any true relevant results like DNN Search due to spelling differences. It just means your users will have plenty to click on before finding the correct document they are looking for. While execution time is certainly better than DNN Search, it is still significantly slower than the Venexus Search Engine execution time.

    The Venexus Search Engine offers 2 versions, the standard (free version), and the Pro (not free version).  The standard version still offers many of the features smaller sites require, including quick and relevant results, but does not include some of the nicer features of the Pro version like PDF and MS Office document indexing and blog and feed aggregation pinging service. Where VSE really shines is in its ability to provide and aggregate RSS feeds for inclusion in its index. The smart caching and user interactive crawling using AJAX distributes the load on the server and bandwidth. The major advantage and disadvantage of VSE is MS SQL Server Full-Text indexing. The disadvantage is that VSE is NOT database independant and requires Full-Text indexing enabled versions of MS SQL Server in order to operate. The advantage is that it uses Full-Text Indexing from MS SQL Server for more relevant and faster search results. We know VSE is scalable because it has been tested against a database of over 2 million indexed pages. The simple search results analysis shows that it is 4 times faster than DNN Search and 2 times faster than Open-SearchEngine. The actual search results speak for themselves, delivering the most relevant result as #1 and contextual links from the home page as supplemental results.

    Picking the right search engine application is important for your website and now you should be armed with the knowledge of how each one operates, the differences in features between them, and the overall performance and relevancy of the search results.

    I hope this answers everyone's questions concerning the differences between the 3 DotNetNuke Search Engines. Feel free to comment with questions or suggestion on how this post can be improved. If you know of a feature or difference that I missed, please let me know. While this post is quite lengthy, I plan on keeping it updated as a resource for those who would like to keep track of the differences between each DNN search engine.

    Sunday, April 08, 2007 6:37:38 PM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Saturday, April 07, 2007

    DNN 4.5 was released today after a small delay last month. 

    "A highly focused three month release cycle results in DotNetNuke® 4.5, a new release with integrated Microsoft ASP.NET AJAX support, a web-based installer, and a variety of other high value enhancements designed to improve the user experience." - DotNetNuke Enriches User Experience

    I decided to try out a new install, before we perform any upgrades. So, after creating a new database, creating a new directory on the webserver for the site and changing permissions, setting up new site in IIS, and changing the web.config for the connection string, I tried loading the site. I had heard about the new installation wizard and was presented with the following:

    I decided to do a custom installation so I could see all of the options.

    One of the most common issues people have trying to install DotNetNuke is setting the file/folder permissions. It is nice to see the wizard test these.

    Another big issue people have installing DotNetNuke is making sure the connection string is valid. The wizard also supports a database connection test.

    Easy install so far....

    Nice! You can now configure the host account instead of relying on the defaults.

     

    You can also filter which modules get installed during installation.

    And set admin user account and portal porperties instead of using the defaults.

    You can also have optional skins and containers to be installed, if available.

    And language packs if needed.

    And done!

    I am very impressed with the new installation wizard. It is good to see checks being performed that will undoubtedly decrease support issues for people who have not setup everything correctly.

    After logging into the new site, the first thing I noticed was the different icons.I like the new and clean look of these icons. I also LOVE the new "Show Control Panel" dropdown option.

    Something new too is the "Solution Explorer":

     

    This is a convenient interface to the DNN Marketplace. The "DotNetNuke" and "About" tabs still appear to be in beta mode however. It should be interesting to see how this piece develops.

    It is very exciting to see this new release, and I will post later how the upgrades go.

    Saturday, April 07, 2007 10:49:15 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Tuesday, April 03, 2007

    We did a search engine optimization (SEO) campaign for a client a while back that required us to setup a few new domains with blogging software. We used a variety of different blogging software  and noticed something very interesting...sites that performed pinging were crawled within 1-3 days and indexed within 2 weeks. All of the domains we used were brand new. In some cases, keywords that we were focusing on were in top 10 search results in 2 weeks as well. Needless to say, the client was happy.

    So, we added a pinging feature as part of our DotNetNuke search engine module. Seamus, our search engine aggregation module, generates a RSS feed for the entire DNN portal. Anytime a tab/page is added or updated and Seamus finds this change, if the "Pinging Service" is enabled, it will ping 14 different blog and feed aggregation services.

    So you are probably asking how does this work. Well, we send a "ping" to these aggregation services using XML-RPC. It simply tells these services that there is new content available on your site and to check the RSS feed. These services then will consume the feed and add it to their index. This provides a contextual link (assuming you actually use good titles for your pages) from these service sites directly to the content on your site. Pretty cool, huh?

    Currently the following services are pinged with our module:

    1. BlogDigger.com
    2. BlogFlux.com
    3. Blogsearch.Google.com
    4. BlogRolling.com
    5. Bulkfeeds.net
    6. Feedburner.com
    7. Feedster.com
    8. IceRocket.com
    9. Pingomatic.com
    10. Syndic8.com
    11. Technorati.com
    12. My.Yahoo.com
    13. Weblogs.com
    14. Weblogalot.com

    As a test, we dropped our search engine module on a new domain on 3/16/2007. With no links from external sites pointing to this domain, most if not all of the traffic was from our development at this point, averaging about 3-5 unique visitors a day (probably me, the client, and one or more of our developers). As of yesterday, the site had almost 150 unique visitors. Not bad for 2 weeks, considering we have done nothing else to this site other than add 10 total pages of content. This site is off to a great start and we have not even started a linking or submission campaign. See the graph below:

    Also, checkout the following post on Marketing Pilgrim about faster indexing through pinging Google blog search that collaborates our results.

    Ready to see the power of pinging blog and feed aggregators? Add a pinging service to your DNN site and watch the traffic roll in.

    Tuesday, April 03, 2007 4:54:46 PM (US Eastern Standard Time, UTC-05:00)  #       |  |  |   | 
     Sunday, April 01, 2007

    We issues a patch release today for the Venexus Search Engine, a DotNetNuke search engine module. This release has a few minor bug fixes and tweaks:

    • Catalog creation in SQLDataProvider file moved to Search module (you still have to run the VenexusSearch module SQLDataProvider file through Host > SQL during new installation, but not for those who are upgrading).
    • Queue Importance added to allow some URLs to be crawled sooner than others. If you are running a global search engine, we now give preference to certain domain extentions (.gov and .edu).
    • Stores single Robots.txt file for domain instead of historical. Previously we stored a new robots.txt for each weekly check if it was updated. Now we only store one.
    • Feed Title is now the portal/site name.
    • Added XML-RPC ping for BlogFlux inclusion in our blog/feed aggregator pinging service. We had to remove one aggregator and added BlogFlux to the list (14 total)

    Get the free version of our DNN search module.

    Sunday, April 01, 2007 9:32:08 PM (US Eastern Standard Time, UTC-05:00)  #       |  |  |   | 
     Thursday, March 22, 2007

    There is nothing better to start off the day than having a client running into a 100% CPU utilization issue on their production SQL Server. Every few minutes, the server would spike up and hang there for a variable amount of time (15 seconds to several minutes). You can only imagine the flakiness of a website with SQL Server choking to death. There was nothing of value to point any fingers as to the culprit of this issue in the event logs for DNN (Admin > LogViewer)...none that we saw through a brief spot checking and filtering of event types (this was incredibly slow and seeing timeouts so we abandoned all hope of using DNN Admin/Host tools to find the problem).  And, there was not an alarming number of events actually logged in EventLog table. However, we have seen issues with performance that are usually resolved by clearing the Log Viewer. We have seen cases where clients who have high traffic/usage sites, or a broken/problematic module on all pages, have 5 and 6 figure rows of data for EventLog table, especially if all the default settings are used for the DNN Log Viewer settings. We have seen timeout issues just trying to clear the event log when they get that large ("Delete EventLog" as the sql statement does the trick quickly from SSMS). So, we went ahead and cleared it, but the issue persisted.

    For those who have not explored much in SQL Server Management Studio (not in SSMS Express), there is now a Database Engine Tuning  Advisor and SQL Server Profiler (under Tools > SQL Server Profiler). Running the SSP, we performed a trace and caught the offending SQL causing all of the havoc. Just a note...we have run DETA to find recommendations from trace files for several large DNN databases and apply the recommendations (it usually creates new indexes for tables that have 6 and 7 figure rows, helping greatly with performance on databases). But in this case, we just started and stopped the trace in SSP before and after a huge and hanging spike. Going through the rows looking for CPU hits, we found the following 2 villians of resources:

    GetSchedule @Server='SERVERNAME'

    GetScheduleNextTask @Server='SERVERNAME'

    Running these statements showed the huge spike on command, pegging the server hard. Looking in the stored proc it hits Schedule and ScheduleHistory.

    ALTER PROCEDURE [dbo].[GetSchedule]

    @Server varchar(150)

    AS

    SELECT S.ScheduleID, S.TypeFullName, S.TimeLapse, S.TimeLapseMeasurement, S.RetryTimeLapse, S.RetryTimeLapseMeasurement, S.ObjectDependencies, S.AttachToEvent, S.RetainHistoryNum, S.CatchUpEnabled, S.Enabled, SH.NextStart, S.Servers

    FROM Schedule S

    LEFT JOIN ScheduleHistory SH

    ON S.ScheduleID = SH.ScheduleID

    WHERE (SH.ScheduleHistoryID = (SELECT TOP 1 S1.ScheduleHistoryID FROM ScheduleHistory S1 WHERE S1.ScheduleID = S.ScheduleID ORDER BY S1.NextStart DESC)

    OR SH.ScheduleHistoryID IS NULL)

    AND (@Server IS NULL or S.Servers LIKE ',%' + @Server + '%,' or S.Servers IS NULL)

    GROUP BY S.ScheduleID, S.TypeFullName, S.TimeLapse, S.TimeLapseMeasurement, S.RetryTimeLapse, S.RetryTimeLapseMeasurement, S.ObjectDependencies, S.AttachToEvent, S.RetainHistoryNum, S.CatchUpEnabled, S.Enabled, SH.NextStart, S.Servers

    In ScheduleHistory we found a little over 6 thousand rows. You can use the following to check your db:

    select count(*) from schedulehistory

    6000+ does not seem like that many rows to be causing that much of a peak, but regardless we deleted them all getting desperate at this point:

    delete schedulehistory

    Executing the 2 sprocs again for the schedule, and cpu barely gets over 3% utilization. The site is again fast and responsive and I was able to get in and check settings without getting timeouts. So, as an interim fix I lowered the defaults in  DotNetNuke.Services.Scheduling.PurgeScheduleHistory under Host > Schedule.

    I am concerned about why 6000 rows of data would be taking such a hit on cpu resources. However, that it more records than I believe should be there, so lowering the defaults will help. Nothing in the DNN stored procedure for GetSchedule really stands out at me as being problematic, nor at first glance do I see anything that could be changed that may help, but I will ponder on this some more in my copious spare time.

    So, if you are having trouble with SQL Server performance and DNN, check and make sure you keep your EventLog and ScheduleHistory purged.

    If you need help, be sure to checkout our DNN Support Packages.

    Thursday, March 22, 2007 1:12:18 PM (US Eastern Standard Time, UTC-05:00)  #       |  |   | 
     Wednesday, March 14, 2007

    We ran into an issue parsing some HTML for a DNN content migration project we are working on. We needed to find the actual content of the page, without all of the look and feel. Luckily we found a pretty solid case of an opening and closing div tag that wrapped the entire content of the page. At first we had a basic regular expression for finding the div tags like so:

    Dim sRegEx As String = "<div align=" & Chr(34) & "center" & Chr(34) & "[\d\D]*?\</div>"

    This worked fine until we ran into some code that had div tags withing the div tags. The following shows you what the reg ex returns.

    Example:

    <div align="center">

    Some text here

    <div> this is between another div</div>

    Here is more text that should be in the content we are ripping.

    </div>

    After some digging, the following regex does the trick:

    Dim regexp As Regex = New Regex( _

    "(<[^>]*?div[^>]*?(?:center)[^>]*>)((?:.*?(?:<[ \r\t]*div[^>]*>?.*?(?:<.*?/.*?div.*?>)?)*)*)(<[^>]*?/[^>]*?div[^>]*?>.*</div>)", _

    RegexOptions.IgnoreCase _

    Or RegexOptions.Singleline _

    )

    Wednesday, March 14, 2007 1:59:48 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Tuesday, March 06, 2007

    We released the latest version of our search engine module last week. It has all of the features I mentioned in my previous post, plus the ability to add excluded URLs and partial URLs.

    Here are the new specs:

    Items marked with * are new

    Features
    Standard Version
    Pro Version
    Seamus Features    
    Maximum # of Pages
    500
    Unlimited
    Install on commercial site
    No
    Yes
    Scheduled Index Updates
    Yes
    Yes
    Announcements Module Support
    Yes
    Yes
    Contacts Module Support
    Yes
    Yes
    Events Module Support
    Yes
    Yes
    FAQ Module Support
    Yes
    Yes
    Links Module Support
    Yes
    Yes
    Text/HTML Module Support
    Yes
    Yes
    Index MS Excel Documents *
    No
    Yes
    Index MS PowerPoint Documents *
    No
    Yes
    Index MS Word Documents *
    No
    Yes
    Index PDF Documents *
    No
    Yes
    Index Rich Text Files *
    No
    Yes
    Global Crawler *
    No
    Yes
    Allows users to add feeds
    No
    Yes
    Custom User Agent
    No
    Yes
    Obeys Robots.txt
    Yes
    Yes
    TTL Support
    Yes
    Yes
    Feed and Queue Aggregation Using AJAX
    Yes
    Yes
    Display Top X Latest Items
    Yes
    Yes
    XSLT Support
    Yes
    Yes
    Latest Items RSS Feed Generation
    Yes
    Yes
    Portal Specific Feed
    Yes
    Yes
    Enclosure/Podcast Support
    No
    Yes
    Pinging Service
    No
    Yes
    Exclude URLs *
    Yes
    Yes
         
    Search Features    
    Search Skin Object
    Yes
    Yes
    Use Image or Text for Search button
    Yes
    Yes
    and - (AND and OR) Support
    Yes
    Yes
    Quoted Search Support
    Yes
    Yes
    Keyword Highlighting
    Yes
    Yes
    Obeys DNN Security
    Yes
    Yes
    Social Bookmarking Support *
    No
    Yes
         
    Support    
    Issue Tracker
    Yes
    Yes
    Email
    No
    Yes
    Phone
    No
    1 Call
      Price  
    Free
     
    $199 Per Year
    BuyNowButton.gif
     

    You can download the free version here.

    Tuesday, March 06, 2007 11:25:17 AM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Monday, February 26, 2007

    The Venexus Search Engine is a DotNetNuke search module, plus a whole lot more. Not only does our DNN search module index your portal, but also external sites. VSE crawls pages on your site, aggregates RSS feeds from other sites, and crawls any links for external websites, making it a full search engine module.  Unlike the core DNN Search module that uses a scheduled task to perform index updates, VSE crawls and indexes content based on user request. Seamus can be configured for several different setups and displays, including the ability to hide the module on every page. When a page is loaded that has the Seamus module on it, Seamus will go out and grab 3 RSS feeds and 3 queued URLs and add any new or updated content to the index. In order to not delay the page loading for the end user, Seamus utilizes AJAX to make aggregation request, providing a seamless integration into your site.

     

    Here are the pro features of VSE:

     

    1.1 Pro Features

    • Allow users to add their feeds

    You can enable users to add feeds to the system.

     

    • Podcast Support

    Indexed items that have files associated with them are used as enclosures (aka podcast) in the feeds that Seamus generates.

     

    • Pinging service

    When the pinging service is enabled, every time something new is added/updated on your site Seamus will “ping” several XML-RPC  web services for blog and feed aggregation sites to notify them your portal has new content. The aggregators will then come to your site and aggregate your feed and provide links to their users to your site.

     

    Here are a few services we ping:

     

    • Custom User-Agent

    You can set your own user-agent to specify your own crawler name. The default user-agent is “Seamus/1.1 PRO ( http://search.venexus.com)”.

     

    • Global Crawler

    The pro version allows you to be a global crawler. Any links found on your site, from aggregated news feeds, or from external links are crawled and indexed.

     

    So, not only are you able to aggregate even more content with the Pro version when compared to the Standard version, but you also get the search engine optimization benefits of pinging all of the major blog and feed aggregation services. This provides you with links directly to your site, generating more web traffic. You can watch your page rank grow very quickly with this feature.

     

    Since the release of the 1.1 version, we have steadily been working on the 1.2 version. We are now testing the latest version on our demo site: search.venexus.com.

     

    1.2 Pro Features (March 1, 2007 Release)

    • New file formats indexed

    You asked for it, so we added support for all of the most common Office document file types as well as PDF documents. We have added a new document-to-text converter to our crawler that is able to parse the actual text from these documents. So not only does Seamus crawl and index HTML, Text, and XML files, but also the following new formats:

    1.     Excel files

    2.     PDF files

    3.     PowerPoint files

    4.     Rich text files

    5.     Word documents

     

    • Social Bookmarking Support

    In the search results you can enable social bookmarking to allow users to easily add bookmarks to their favorite social bookmarking application/service. This allows user to easily find their favorite links to your site. Also, the sites that provide this service will generate a link to your site, giving you more traffic once again.

     

    Here is an example of what it looks like:

    Here are the supported sites:

     

    1.     Digg

    2.     del.icio.us

    3.     FURL

    4.     Reddit

    5.     Yahoo

    6.     Blinklist

    7.     Google

    8.     ma.gnolia

    9.     Shadows

    10.  Technorati

     

    Ready for a real search engine for your site? Buy the Pro version here.

     

    Stay tuned for more…

    Monday, February 26, 2007 5:04:36 AM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Wednesday, February 21, 2007

    We released the Pro version of our DNN search engine module today.

    Here is the breakdown of the feature comparison:

    Venexus Search Engine Version Matrix

    Features
    Standard Version
    Pro Version
    Seamus Features
     
     
    Maximum # of Pages
    500
    Unlimited
    Install on commercial site
    No
    Yes
    Scheduled Index Updates
    Yes
    Yes
    Announcements Module Support
    Yes
    Yes
    Contacts Module Support
    Yes
    Yes
    Events Module Support
    Yes
    Yes
    FAQ Module Support
    Yes
    Yes
    Links Module Support
    Yes
    Yes
    Text/HTML Module Support
    Yes
    Yes
    Allows users to add feeds
    No
    Yes
    Custom User Agent
    No
    Yes
    Obeys Robots.txt
    Yes
    Yes
    TTL Support
    Yes
    Yes
    Feed Aggregation Using AJAX
    Yes
    Yes
    Display Top X Latest Items
    Yes
    Yes
    XSLT Support
    Yes
    Yes
    Latest Items RSS Feed Generation
    Yes
    Yes
    Portal Specific Feed
    Yes
    Yes
    Enclosure/Podcast Support
    No
    Yes
    Pinging Service
    No
    Yes
     
     
     
    Search Features
     
     
    Search Skin Object
    Yes
    Yes
    Use Image or Text for Search button
    Yes
    Yes
    + and - (AND and OR) Support
    Yes
    Yes
    Quoted Search Support
    Yes
    Yes
    Keyword Highlighting
    Yes
    Yes
    Obeys DNN Security
    Yes
    Yes
     
     
     
    Support
     
     
    Issue Tracker
    Yes
    Yes
    Email
    No
    Yes
    Phone
    No
    1 Call
     
     
     
    Price
    Free
    $199 Per Year
    BuyNowButton.gif

    I will be discussing the features of the Pro version in a later post. Stay tuned...

    Wednesday, February 21, 2007 2:52:51 PM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Monday, February 19, 2007

    We have released the new version of the Venexus Search EngineVSE Standard Version 1.1.0 has several bug fixes and shows some of the new features of the Pro version.

    New standard features and bug fixes:

    • VenexusSeamus - Changed TransformXSL to not create a temporary XML file
    • VenexusSeamus - Modified Response.Charset
    • VenexusSeamus - New Delete Tabs routine for removing deleted and expired tabs
    • VenexusSeamus - Ability to reload default XSLT file
    • VenexusSeamus - Shows total number of aggregated items
    • VenexusSeamus - Gridview pagination
    • VenexusSeamus - Link from Grid to show aggregation errors
    • VenexusSeamus - Guid attribute added
    • VenexusSeamus - application/rss+xml support
    • VenexusSeamus - Automatic creation of fulltext index during installation (works for SQL Server Express too!)
    • VenexusSearch - Support for DNN 4.4.1 and "search" URL parameter
    • VenexusSearch - Non-authenticated postback issue resolved
    • VenexusSearch - Limits URL length for display
    • VenexusSearch - Quoted query support

    If you have any issues with installation, configuration, or bugs, pleas post them in our issue tracker.

    Monday, February 19, 2007 5:17:05 PM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Wednesday, February 14, 2007

    Here is a video tutorial on setting up SQL Server 2005 Express and Full-Text Indexing. It breaks down the steps for installation of SQL Server Express with Advanced Services. This is a great video that shows alot more than just setting up full-text indexing. It also shows some basic queries.

    Key points of interest during installation is when you get to the Registration Information screen, uncheck "Hide advanced configuration options" before clicking Next. Then in the next screen, expand Database Services and select the option to add "entire feature will be installed on local hard drive" for Full-Text Search. After a few more steps, you must uncheck User Instances Enabled. For those who already have Full-Text Search installed, but did not uncheck that option, you can use the following SQL:

    sp_configure 'user instances enabled', '0'

    If you are using SQL Server Express Management Studio Express, you can go into the database properties and under files, make sure enable full-text indexing is checked. Or, run the following SQL:

    sp_fulltext_database 'enable'

    Now for creating the catalog and index. The example below is for our search engine module:

    Create fulltext catalog VenexusSearchCatalog

    Create Unique Index PKVenexusSearchEngine On Venexus_BrainDump(IndexID)

    Create fulltext index On Venexus_BrainDump (IndexURL, IndexTitle, IndexWashedContent)
    Key Index PKVenexusSearchEngine On VenexusSearchCatalog
    With Change_Tracking Auto


     

    Wednesday, February 14, 2007 2:25:21 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Wednesday, January 24, 2007

    The first beta testers of the Venexus Search Engine were the guys from True Lawyers. They created a new portal in their DNN installation for Search.TrueLawyers.com. Search.TrueLawyers.com is a legal search engine. Their instance of VSE has aggregated over 216,000 legal articles, news, and related site pages as of this morning. You can test this site and see that the speed of VSE is still great when considering the amount of data it has already indexed. When using the site, each time a page is loaded that has Seamus on it (and Seamus CAN be hidden on the page), 5 feeds are aggregated. Any new items in the feeds are added to the index immediately. While the user sits on the page, AJAX is used to pull more feeds. Plus, since the site is new and does not have much traffic...yet, they use a RSS reader to call the Seamus RSS feed, which grabs more data every 10 to 15 minutes. As you can imagine, their index is growing FAST! You can see the latest items Seamus has aggregated by visiting the True Lawyers Legal News Room.

    So, not only does VSE work as a site search engine and multiple portal search engine, it also works as a full blown search engine, aggregating items from your DNN installation, as well as other sites that provides RSS feeds. One of the features we are working on for the 1.1 Pro version is the ability to index any website, regardless of having a RSS feed. You can now have the ability to build powerful niche websites that provide your users with lots of relevant information.  Plus, with the RSS feed Seamus generates, you can set it to display items for only your website, allowing you to submit the link to many feed directories, providing search engine optimization. The 1.1 Pro version will ping many blog directories, greatly increasing traffic to your website, treating your entire website like a blog. And we all know that the other search engines are just eating up blog content, increasing the page rank of those sites over many traditional websites without feeds. Ready to try it out? You can download the release candidate here.

    Stay tuned for more...

    UPDATE 2/7/2007:

    I just checked the total items indexed for this site again and it is now showing over 246,0000 items. So in 2 weeks, an extra 30k + items were indexed.

    Wednesday, January 24, 2007 9:44:34 AM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Sunday, January 21, 2007

    I know many of you have been patiently waiting for the release of the Venexus Search Engine. We have had several beta testers try out previous release candidates, and have several new tweaks in this release.

    Seamus Additions:

    • Web.configless (No changes to web.config needed. Beta Testers should remove EntitySpaces web.config entries when installing this version)
    • Object Qualifier support (Thank you Barry White for testing this)
    • Index current tab (Seamus will index the tab it is on. You can add make Seamus invisible on the page by showing 0 items in the feed and unchecking Show Feed. Add to all pages on the site and Seamus will index and update the index when the page is updated)
    • Edit Feed Display (Only show feeds selected in Edit Feeds section. By default, all are show. Selecting feeds will filter news display of only items indexed from the feeds list)

    Search Additions:

    • Web.configless
    • Object Qualifier support
    • "query" URL parameter (You can now use your existing default DNN search results page. Simply drop the module on the search results page and remove the default search results module. Utilize the DNN Search textbox in your skin with the power of Full-Text Indexing).
    • Search form skin object support (see instructions)
    • Form post fix (A fix was added that allows you to simply hit the enter key after adding your query, rather than forcing you to click on the button)
    • Allow user selected web or site search (allow your users to select whether their search is against the current portal or for all search results in the database)
    • URL Trim (Used to trim the URL display in the search results. Long URLs would stretch out the skin)
    • Search Query (Saves user queries and the number of "hits" for that query. This will be used in the pro version for "Top Searches" and "Latest Searches".)

    Here is some information about our DotNetNuke search engine module. You can test it on our site here. We also have the latest version loaded on our DNN search site for finding DotNetNuke related pages and sites.

    As for the official release, we are waiting on FlatBurger to fix an issue with their code protection that causes the module to generate an error after activation. We have been told that this may be fixed by Friday...we will see. In the meantime, please send us your thoughts on this release candidate. If you find any bugs, please post them to our issue tracker. If you have any suggestions for new features, please post them in the issue tracker or in the support forms.

    REQUIREMENTS FOR VENEXUS SEARCH ENGINE

    • DotNetNuke 4.3.5 or Higher (Yes it works with the DNN 4.4 release) 
    • SQL Server supporting Full-Text Indexing
    • .Net full trust for EntitySpaces and Reflection usage

    Now for the files....

    Before installing this, you MUST read the instructions. You CANNOT just install both modules and expect it to work. You MUST configure fulltext indexing manually to get this to work. You will find instructions on performing this action in the Search Instructions and Configuration.

    You can download both modules here. The file is also attached as an enclosure.

    Please post your links here in a comment to show everyone how you are using the Venexus Search Engine.

    UPDATED: Link to module downloads has been updated.

    Sunday, January 21, 2007 5:40:30 PM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   |  VenexusSearchEngine-v1.1.0-standard.zip (284.32 KB)
     Sunday, December 03, 2006

    In case you were wondering from my last post, here is how to get a list of all modules by Portal:

    SELECT DISTINCT ModuleDefinitions.ModuleDefID, ModuleDefinitions.FriendlyName, Modules.PortalID
    FROM         ModuleDefinitions CROSS JOIN
                          Modules LEFT OUTER JOIN
                          Modules AS Modules_1 ON ModuleDefinitions.ModuleDefID = Modules.ModuleDefID
    WHERE     (Modules.ModuleDefID IS NOT NULL) ORDER BY Modules.PortalID

    Here is how to specify a specific portal in the installation:

    SELECT DISTINCT ModuleDefinitions.ModuleDefID, ModuleDefinitions.FriendlyName, Modules.PortalID
    FROM         ModuleDefinitions CROSS JOIN
                          Modules LEFT OUTER JOIN
                          Modules AS Modules_1 ON ModuleDefinitions.ModuleDefID = Modules.ModuleDefID
    WHERE     (Modules.ModuleDefID IS NOT NULL) AND (Modules.PortalID = 0)

    Sunday, December 03, 2006 1:00:06 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Saturday, December 02, 2006

    We needed to check which modules were NOT being used on a DNN site. Why? It's a multi-portal DNN 3.1 website with quite a few 3rd party modules on it and we wanted to know which modules were not in use so we could remove them from the DNN installation before performing an upgrade. No need to add extra compilications or search for module updates for modules that were not being used. And if they are not being used, why leave them on there adding to the bloat? Anyway, here is the SQL:

    SELECT     ModuleDefinitions.ModuleDefID, ModuleDefinitions.FriendlyName, ModuleDefinitions.DesktopModuleID
    FROM         ModuleDefinitions LEFT OUTER JOIN
                          Modules ON ModuleDefinitions.ModuleDefID = Modules.ModuleDefID
    WHERE     (Modules.ModuleDefID IS NULL)

    Saturday, December 02, 2006 11:34:25 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Thursday, November 30, 2006

    I never got around to making an announcement that DNN 4.3.6 was release a couple of weeks ago....now DNN 4.3.7 is out.

    I checked the security announcements and only saw 2 issues that were already fixed with DNN 4.3.6:

    I am not sure if this is the 4.4 release Shaun Walker mentioned in his blog yesterday, or this is in fact the 4.3.7 release. The change log in the bug tracker does not appear to have any related info on 4.3.7. However, the roadmap for DNN 4.4 release shows many items checked in.

    Component Issue Type Issue ID Summary Resource Status
    (4.4.0) Performance Release Admin / Host Functions Bug DNN-4492 ModuleTitle in multi definition modules   Checked-In
    Admin / Host Functions Bug DNN-3868 Page Head tags are not properly processed   Checked-In
    Admin / Host Functions Bug DNN-4011 Action Menu with Module Specific Permissions is not displayed   Checked-In
    Admin / Host Functions Bug DNN-4476 Cannot use icon from module directory in action buttons   Checked-In
    Admin / Host Functions Enhancement DNN-4503 Improve Delete Portal Functionality   Checked-In
    Admin / Host Functions New Feature DNN-4496 Add User Quota   Checked-In
    Admin / Host Functions New Feature DNN-4502 Improve Portal Management   Checked-In
    Admin / Host Functions New Feature DNN-4504 Add a new Delete Expired Portals action   Checked-In
    Admin / Host Functions New Feature DNN-4495 Add Page Quotas   Checked-In
    Localization / ML Bug DNN-4273 Collation issue with Event Log   Checked-In
    Localization / ML Bug DNN-4506 Pop-up calendar localized date format bug   Checked-In
    Localization / ML Bug DNN-4483 Localized images break when using the "ShowMissingKeys" app setting.   Checked-In
    Localization / ML Bug DNN-4560 Popup calendar   Checked-In
    Localization / ML New Feature DNN-4520 Force a specific language for first visitors   Checked-In
    Performance Bug DNN-4086 Performance: Reduce Database Calls   Checked-In
    Performance Bug DNN-4088 Performance: CBO and Reflection   Checked-In
    Performance Bug DNN-4090 Performance: ClientAPICaps.config caching   Checked-In
    Performance Bug DNN-4092 Performance: XmlSerializer   Checked-In
    Performance Bug DNN-4087 Performance : TabCache   Checked-In
    Performance Bug DNN-4091 Performance ; Menu providers   Checked-In
    Performance Bug DNN-4093 Performance: XPathDocument vs XmlDocument   Checked-In
    Performance Enhancement DNN-537 Imporve Startup performance   Checked-In
    Performance Enhancement DNN-662 Implement HTTP compression   Checked-In

    Since 4.4 is called a "Performance" release, and on the website it says 4.3.7 is a stabilization release, I take it that they are indeed different. I just would like to know what was changed in the 4.3.7 if indeed it is a stabilization update.

     

     

    Thursday, November 30, 2006 2:02:50 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Saturday, November 25, 2006
    I know it has been over a week since the last post. Sorry to leave you hanging, but sometimes there are just not enough hours in a day. Anyway, without further ado, here is part two…SEAMUS.

    At some point earlier this year, DNN Find became a different mission. We decided to build a full blown search engine for DotNetNuke. Not one that would just index a single DNN site, but one that would allow you to index all portals in a DNN installation AND information from external sites. And how would external site indexing best be handled? …via RSS feed aggregation of course.  

    Seamus is the first of the two modules that make up the Venexus Search Engine. SEAMUS = Search Engine Aggregation Module Utilizing Syndication. On a side note, there is also an obscure Pink Floyd song that not many know from the Meddle album, about an old hound dog by the same name. Our hound dog “fetches” data and stores it to a table that has enabled MS SQL Server full-text indexing. But before I go into the specifics, I think it is important to know about the framework.

    We started with traditional DotNetNuke module development…until EntitySpaces was released. I’m an old ASP/VB developer and personally, it took me a bit to get my head wrapped around how ES worked, but once I figured it out, I was hooked. ES saves the day by automagically generating all the CRUD (create, read, update, delete). While very similar to the logic of a BusinessController and InfoObject, ES uses Collections and Entities. But, where I found ES the most useful is the Dynamic Queries you can write directly into the business logic.

    For example, in Seamus we need to check the domain to see if it matches one we are already indexing:

                Dim colDomains As New VenexusDomainCollection
                colDomains.Query.Select(colDomains.Query.DomainName, colDomains.Query.DomainID)
                colDomains.Query.Where(colDomains.Query.DomainName.Equal(GetDomainName(sURL)))
                colDomains.Query.Load()
                If colDomains.Count > 0 Then
                         ‘a bunch of removed logic goes here..
                End IF

    With the colDomains.Query.Select, we are only returning the data we need rather than all columns. With the colDomains.Query.Where, I eliminated the need to:

    1. Write a stored proc just to retrieve by DomainName
    2. Iterate through the entire table, every row of all domains, just to find the one I am looking for.

    I won’t even go into the performance gain of not having to loop through those rows of all columns, nor the time (even though it would be simple) to write a stored proc to pass in DomainName and have it return the DomainID.

    Here is an example of adding a record to Seamus for a new feed:

             Dim entFeed As New VenexusSeamus
             entFeed.AddNew()
             entFeed.Url = txtURL.Text
             entFeed.Title = txtTitle.Text
             entFeed.Account = txtAccount.Text
             entFeed.Password = txtPassword.Text
             entFeed.CacheTime = txtCacheTime.Text
             entFeed.FeedTimeOut = txtTimeOut.Text
             entFeed.DateAdded = Now()
             entFeed.DateUpdated = "1/1/1901"
               If chkActive.Checked = True Then
                  entFeed.IsActive = True
                Else
                    entFeed.IsActive = False
                End If
             entFeed.Save()

    Easy enough, eh?

    And here is an update of a feed for Seamus:

        Dim entFeed As New VenexusSeamus
        entFeed.LoadByPrimaryKey(hidRSSID.Value)
        entFeed.Url = txtURL.Text
        entFeed.Title = txtTitle.Text
        entFeed.Account = txtAccount.Text
        entFeed .Password = txtPassword.Text
        entFeed.CacheTime = txtCacheTime.Text
        entFeed.FeedTimeOut = txtTimeOut.Text
        entFeed.DateAdded = Now()
        entFeed.DateUpdated = "1/1/1901"
              If chkActive.Checked = True Then
                  entFeed.IsActive = True
              Else
                    entFeed.IsActive = False
              End If
        entFeed .Save()

    And a delete example:

        Dim entFeed As New VenexusSeamus
        entFeed.LoadByPrimaryKey(hidRSSID.Value)
        entFeed.MarkAsDeleted()
        entFeed.Save()

    Yeah, it’s that easy. Makes you want to fire up your IDE eh?

    Sure, I have used DAL Builder Pro, which was a huge time saver, but EntitySpaces made me to never want to develop any other way. Plus, last I checked, DAL Builder Pro was still only for DNN 3 development. The ease of generating the DAL and the ability to easily REgenerate the DAL if the database schema changes, makes ES the tool of choice for all of our module development. I cannot even begin to count the hours I have previously spent hand coding changes in a DAL due to spec changes. Oh how I wish I had all those hours back!

    With the new DNN admin grid templates, it is just ridiculous how much code is generated before having to write the first line. The new template will generate an editable grid of the table(s), with sorting, paging, and search. If you are interested in .Net development (this is not just a DNN tool, it works for all .Net 2.0 development and using C# or VB.Net), you must check it out.

    NOTE: Just so you know, we do not have any affiliation or partnership with EntitySpaces, we just think their tool rocks.

    So, even though we had much of the initial Seamus development completed, we scrapped it and started development with ES. This will make future modifications and additions so much easier, saving time in the long run.

    With that said, here is how Seamus works…

    After you install Seamus, you can go into the module settings:

    So in this example, the display for Seamus should show the top 10 items last indexed, each with a link to the actual item in the Title and using the “…More” link. A feed icon will also be displayed that provides a link to a RSS feed for the top 10 items.

    Here is an example of the display:

    Now while the above example does not show any local items (tabs or modules from this site), it does have items indexed from other sites. All of these items were from RSS feeds that were aggregated. As a module editor, you have the ability to manage external feeds (or local feeds if so desired, but we will go into more detail about how Seamus works shortly). But, if there were local items visible, they would only be visible if you have the proper permissions. Seamus checks permissions on any local site at the module and tab level for the display and the RSS feed. 

    Here is an example of the feeds we are are currently indexing on the Venexus Search Engine:

    Here is the interface for adding new feeds:

    Now we will get into how Seamus works…

    First off, on the first load of Seamus, a dump of data from all modules supporting the IPortable interface (currently limited to DNN Core modules) is performed to ensure that there is data in the index. And every X hours (determined in module settings), the index is checked for new, updated, and deleted pages/modules.

    Secondly, any feeds that have been added to Seamus are aggregated 5 at a time, order by last updated.  And, while the user is sitting on the page, every 30 seconds that pass, 5 more feeds are aggregated via AJAX. This user interactive aggregating decreases the load on the server, rather than running as a scheduled task like the core DNN Search.

    In order to save bandwidth, and to not tick off the owners of the websites you are aggregating data from, Seamus has what I call “smart caching”.  Each time a feed is requested, if the information in the feed as not been updated, Seamus will increase the cache time. If the feed has been updated, it will request the same feed sooner than it had previously, decreasing the cache time. Over time, and based on the “average” a feed it updated, Seamus learns when to check again for updates, all while obeying TTLs.

    Seamus will also index the current page/tab it is sitting on. Now you may be asking why you would index a page that displays items that have already been indexed. Well, Seamus can be setup to not display the top X items and/nor the RSS feed. Here is an example:

    With the above Seamus settings and the module settings to display on all pages and set to not display the container or using an “invisible” container, when a user lands on any page of the site, the page is indexed. You can index your entire site by letting the users "crawl" the website. Also, when the page is updated, the index will be updated. Here is the module settings example:

    So, not only does Seamus index all portals in the DNN installation by doing a dump of all modules that support the IPortable interface and individual page indexing based on user interaction, it will also aggregate and index data from other sites. This gives you the ability to create a full blown search engine for your niche. For example, let say you have a website about racing. You could have your entire DNN site indexed, along with aggregation of more racing data from the following sites:

    http://www.sportsline.com/partners/feeds/rss/auto_news

    http://rss.news.yahoo.com/imgrss/events/sp/042103autoformula

    http://rss.cnn.com/rss/si_motorsports.rss

    Not only are you able to display a list of the last items indexed in order to keep a page from becoming stagnant, you can also provide a RSS feed for your users, giving them a reason to return to your site. I will save a Seamus and SEO discussion for another time, but here is an example site for a legal search engine.

    Speaking of time, I am once again out of it. Part III will be a discussion of the second module, the search form module. Stay tuned...

     

    Saturday, November 25, 2006 5:04:44 AM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Wednesday, November 15, 2006

    I know a lot of people have been waiting on this and it is literally been over 5 years in the making, but it is now time to tell the story of how the Venexus Search Engine came to be…

     

    Bots, Crawlers, and Spiders, Oh My!

    Once upon a time, long, long ago, well over 5 years ago anyway, but that’s like ancient history in terms of the web, I wrote a little script to rip down free fonts off of a font directory website, who shall remain nameless since they are still around today. FontGrabber.vbs crawled their entire website saving zip files of free font packages. If I remember correctly, it pulled down almost 5000 font packages in a few hours.  What a time saver! And my crawler addiction began to set in…

     

    MediaGrabber

    The next crawler I wrote extracted data from an online database of live music recordings. I dumped about 10 to 12 thousand records into a custom media database. My crawling habit had now increased to an hour or 2 a week perfecting the use of HTTPGets using XMLHTTP and making modification to scrape other data from the site based on URL parameters.

     

    Many variations of MediaGrabber were developed over the years for aggregating data. Some of the variations include:

    • PhotoGrabber - For consuming one of the stock photography buffett sites. An interesting note, the one we crawled, which will also remain nameless, started limiting the number of photo request per day the following month. I wonder if that had anything to do with what we were doing...hehe.
    • FDAUpdater - For pulling down pharmaceutical data from the FDA to be used on a pharmacy website. Enough said about that one.
    • CategoryDump - For pulling category names from Yahoo and DMOZ.
    • And others...

     

    Madhatter

    Madhatter was my first bot. It was a VBScript that sat in a Direct Connect P2P Server application. Madhatter started as a trigger bot.  A user would type a message into the chat and if it contained keywords or phrases that matched a list of keywords and response(s), the bot would automatically reply with a random response from the list that was associated with that keyword. Over time, I added around 1000 different responses to about 400 keywords. Madhatter then received search capabilities. You could type +search <band> or +search <date> and it would return a top 100 list of media records from a database of about 20000 records that matched with a link pointing them to the website with the information. I then gave the ability for the Operators to allow Madhatter speak on their behalf. So in addition to Madhatter automatically responding, the operator would make new responses to the user messages via Madhatter. This worked so well, and I guess to some degree could be considered my first AI application, that many DC newbies really thought it was a live person responding to their messages, even when Madhatter was running solo. I even setup the bot so that if a user tried to send Madhatter a private message chat, it would display in the Operators chat. This led to untold hours of entertainment watching people talk to a rude, trash talking bot that would kick them off the hub if they responded in a derogatory manner. Just thinking about it again makes me want to write a DNN Bot, maybe not one as feisty as Madhatter. Or maybe “bot” interactive search anyone?

     

     

    Tiny IntRAnet Crawler

    I started working for Semiconductor Research Corporation in August 2001 as their Web Administrator/Developer. At that time they only had a website and a forums website. The forums website was using a product called SiteScope which was written in TCL, but we will not even go there in fear of recurring nightmares .The SRC main site was not built using a Content Management System, rather a Staging to Dev push of content. I think it was sometime in early 2002, I began writing my first true crawler that would consume all items in a domain. 

     

    The need was simple…with the amount of content we had on the site, there was bound to be broken links, missing images, orphaned files, and God forbid, 500 server errors. We needed something that would crawl the site and search for any issues, compare the file system, and generate a report for the Content Management Team. I was still using XMLHTTP component for grabbing the data until I found ASPTear. ASPTear proved to be faster and was the HTTP component of choice until I found NSoftware. NSoft’s HTTP component was far superior to any of the others for speed and with many more methods/objects that could be utilized.

     

    SRC had a pretty big main site and we began developing 2 other websites to fall under the SRC umbrella. This lead to TIC 2.0, which crawled all 3 domains, and would (and probably still does) generate a report of any issues. With TIC now crawling more than one website and doing it dynamically (could jump from one domain and then the other with the FIFO [First In First Out] URL queue/stack), the need came to check the first link offsite. Why? In case the link moved (301 or 302), or was generating a 404. We have no control what some site may do to their content, but we sure wanted to know if our users were going to get an error if it was broken. TIC would find those problem links and let the CM Team know they needed to remove the link, or change the URL to the new redirect. Now comes TIC 3.0...

     

    Tiny IntERnet Crawler

    One night I was goofing around with TIC and decided to turn off the function that performs the domain or first link offsite check and just let it run…and run. And it did, all night long. When I got up the next morning, it had crawled almost 30,000 pages and had built a queue of over 100,000. Now I was hooked. How could I get more data and faster? Since TIC was a script and utilized a central database for the URL queue, instead of an in memory stack, I was able run multiple instances of the crawler. 10 instances of TIC 3.0 crawling brought my little home router to its knees. In fact, it choked and rolled over tits up. In three hours, over 110,000 pages were crawled, over 500,000 URLs queued, and had sucked down over a gig of data. Whoa…this was getting fun.

     

    Over the next year or so I really was tweaking TIC quite a bit. I’d let it run for weeks at a time. I quickly realized I was going to run into a big problem…Disk space. The database was getting bloated and slowing down dramatically after it had indexed over 1 million pages and had over 5 more million queued. While those numbers are a drop in the bucket when compared to the 800 pound gorillas of search, it is still a lot of data for such a small operation. And, TIC would crawl anything, all file types.  So I started curbing back what TIC looked for…all the way down to just XML. TIC, as the last version in use, now looks just for XML files anywhere on the Internet. Of course I added tweaks to check domain importance or linking page importance based on keywords and altered the queueing process so that TIC would not get stuck on a crappy domain. But that is a discussion for another time.

     

    Tiny XML Spider

    So with TIC crawling the web looking for XML files, TXS was developed to crawl and index the XML files TIC found. TXS runs continuously, iterating through all “approved” RSS feeds (about 2,500 of over 100,000). For each feed it parses through the articles and stores anything new to the database. If the feed has been updated, TXS will return in less time. Feeds that have not been updated will be crawled the next time after a longer duration. I call this “smart caching”, which will be discussed in the features of Seamus later on. TXS has aggregated over 1.7 million articles from only 2500 news feeds. Not bad considering how much other data we have to collect from feeds that have not been approved. We have been stuffing the aggregated data into a combination of DNN websites for SEO reasons.

     

    DNNFind

    DNNFind = DotNetNuke Fulltext INDexing. At some point about 2 years ago, and with TXS bringing in the data, we decided to build a DNN module that would perform a SQL Server fulltext index query against the aggregated data and return the results. While this is not a bot, crawler, or spider, it is a fundamental step of searching the data, which we will get into when discussing the search module of VSE.

     

    DNN Spider

    I started developing a standalone VB.Net application for crawling DotNetNuke websites. This was my first multi-threaded application. While similar to TIC, this application would allow 1 to many threads to be used to handle the crawling. What we found is that we can use the application for stress testing DotNetNuke websites by throwing a few hundred or thousand request at it. And, we can use multiple applications running on different servers to really pound away at a box. However, this got me thinking about distributing the load of crawling against the users of the website, which is why we are using AJAX to request more data from Seamus. More on that later on as well.

     

    Okay, so you made it this far and you are probably asking why I have not even started to describe what the Venexus Search Engine does. Well, I think it is important to understand the background of the application and how it came to be. It’s not like we just came up with some flimsy half-brain ideas about how a search engine should be done, but rather years of trial and error. And, I want everyone to realize that our product is not going to disappear, but get stronger as we add more functionality from all of the code we have written over the years. With that said, here are the details...

     

    Sorry, I am out of time and you will have to wait for Part II of this post.

     

    In the meantime, if you want to see Venexus Search Engine in action, go to search.venexus.com. To read more about VSE, go here.

    REQUIREMENTS FOR VENEXUS SEARCH ENGINE

    • DotNetNuke 4.3.5
    • SQL Server supporting Full-Text Indexing
    • .Net full trust for EntitySpaces and Reflection usage

    If you would like to test our release candidate, please reply in a comment to this post and I will send you the PA's.

     

    Wednesday, November 15, 2006 11:12:18 AM (US Eastern Standard Time, UTC-05:00)  #       |  |  |  |   | 
     Monday, November 13, 2006

    I got a new Dell D-820 laptop last week. I spent much of the week installing new software, setting up my dev environment, and moving all of the data from my Dell D-810. I was pretty much ready to rock n' roll with this new setup on Friday and giddy about the performance of the 2 Ghz Core 2 Duo and 2 Gb RAM (especially when compiling DNN 4 in VS 2005)....that was until a virus unleashed havoc on my pristine setup. AAAARRRRRRRRR!!!!!!! 

    I have been a firm believer in Symantec and we have used it for years. I decided to try AVG at the recommendation of our network admin and other users and at this time I cannot say I recommend it. For whatever reason, AVG did not catch it until the virus had dropped a payload of bibical proprotions on my drive. I got the full treatment, including something I had not seen in a while...Blue Screen of Death. Not knowing at that time I actually had a virus, I went ahead and rebooted. Before Windows could finish loading, the virus set in to installing adware and trojans, more than I have ever seen for any payload. AVG finally decided to come to the rescue. I started a full scan and let AVG cleanup. Rebooted in safe mode and ran AVG again. I got everything removed...according to AVG, but had my network connections hosed up. I finally gave up and gave it our network admin to see if he could fix it. On Saturday I get the news that we were going to have to recover from the intial Ghost we made or from check points, that he could not fix the issue with the network connection. So, sometime in the wee hours of the morning on Sunday, I had my laptop back up and running with a check point that was a few days old. I decided to do another scan. AVG came out clean. Since I am biased to Symantec, I decided to use TrendMicro Housecall for another scan. It found 2 more trojans that AVG totally missed. That was the last straw. AVG removed, Symantec back on. May the writer of the virus burn in the firery depths of the blackest....

     

    Monday, November 13, 2006 10:40:36 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Monday, November 06, 2006
    We had a backup domain controller running on our dev machine. After moving it to a different server, we got the following error on our development DNN websites:

    Server Error in '/' Application.

    The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.

    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

    Exception Details: System.Web.HttpException: The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.

    Source Error:

    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

    Stack Trace:

    [HttpException (0x80004005): The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.]
    System.Web.HttpRuntime.SetUpCodegenDirectory(CompilationSection compilationSection) +3482363
    System.Web.HttpRuntime.HostingInit(HostingEnvironmentFlags hostingFlags) +226

    [HttpException (0x80004005): The current identity (NT AUTHORITY\NETWORK SERVICE) does not have write access to 'C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files'.]
    System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +3434991
    System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +88
    System.Web.HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr) +252

    I checked all the security permissions and ensured network service had full permission for the folder. I even reset permissions to make sure. No dice. I found the following trick to fix it quickly...despite my time looking for it.

    In a command prompt, navigate to the following:
    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727

    Then run the following command:
    aspnet_regiis -ga "NT AUTHORITY\NETWORK SERVICE"

    Everything worked fine after running that. Since I am bound to forget this, I am posting it here for me and others, hopefully saving me or someone time.
    Monday, November 06, 2006 1:18:19 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Sunday, November 05, 2006

    Did you know that SQL Server Express now has Full-Text Indexing? With the soon to be release of our DotNetNuke search module, which requires SQL Server Full-Text Indexing, I thought it would be helpful to make a post here for those who did not know the differences between SQL Server Express versions.

    SQL Server Express Edition Comparison

    You have several specific products to choose from when you install SQL Server Express Edition Use the following table to see how features for SQL Server compare across other Express Edition products.

    Express Edition Products for SQL Server Compared

    Feature SQL Server 2005 Express Edition SQL Server 2005 Express Edition with Advanced Services SQL Server 2005 Express Edition Toolkit
    Database Engine
    *
    *
     
    Client Components
    *
    *
    Full Text Search
     
    *
     
    Reporting Services
     
    *
     
    Management Studio Express
     
    *
    *
    Business Intelligence Developer Studio
     
     
    *

    Each SQL Server Express Edition product has a specific use. Read the following sections to learn how each Express Edition product for SQL Server compares to the others.

    SQL Server 2005 Express Edition

    How does the Express Edition of SQL Server compare to other SQL Server Express Edition products? SQL Server Express Edition is perfect for use as an embedded database for a desktop application that requires a fully functional SQL Server Database Engine. SQL Server Express offers the smallest package size for faster downloads or to conserve space on deployment media.

    SQL Server 2005 Express Edition with Advanced Services

    How does the Express Edition with Advanced Services for SQL Server compare to the other SQL Server Express Edition products? SQL Server 2005 Express Edition with Advanced Services is perfect for use as a backend to a small, multiuser application that requires more advanced features such as Web reporting or Full-text Search.

    SQL Server 2005 Express Edition Toolkit

    How does the Express Edition Toolkit for SQL Server compare to other SQL Server Express Edition products? Install this package if you need the management tools and client components, but do not need the Database Engine.

    Source: MSDN

    Ready to download SQL Server 2005 Express with Advanced Services (has Full-Text Index)? Its free and here.

    Sunday, November 05, 2006 7:31:30 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Saturday, November 04, 2006

    If you are not familiar with Google Alerts, you should check it out. I have been tracking things from Google Alerts for at least 2 years, maybe longer. While I have noticed more things coming in for "DotNetNuke", starting on October 27th I noticed ALOT more alerts for "DotNetNuke" coming in. What did they all have in common? BLOGS. Also a few days ago, while looking into the activity of this blog, I noticed a new user agent I had not seen:

    Feedfetcher-Google; (+http://www.google.com/feedfetcher.html)

    If you go to that link, you are redirected to a FAQ page and at the bottom is a section called Feedfetcher. Here is an interesting Q and A:

    How do I request that Google not retrieve some or all of my site's feeds?

    Since Feedfetcher requests are all user-initiated, it does not follow the typical robots.txt guidelines for robots. For detailed information about how to prevent Feedfetcher from requesting all or part of your site, please see our removal instructions.

    Very interesting. I was under the assumption that any "bot", and I will define Feedfetcher as a "bot" regardless of whether it is "user-initiated" or not, should obey robots.txt.

    With that said, our feed aggregation module for Venexus Search Engine,  called Seamus, does obey robots.txt. I am sure this discussion will come about with the release of VSE, so I decided to go ahead and post it now in preparation. And speaking of Venexus Search Engine...we have made the final compile and are finishing testing tonight...but more on that later.

    Saturday, November 04, 2006 7:55:52 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Thursday, October 19, 2006

    I was updating a DNN site today and at the same time was migrating the SQL Server 2000 database to SQL Server 2005. I decided to use the Copy Database Wizard since I had never tried it and it worked great. However, the logins did not get updated properly. I created the login in the SQL Server 2005 security, but could not access the database via the old login. I tried doing a generic detach > attach with the same issue. Trying to edit the SQL Server Account through SQL Server Studio Management Studio would generate an error of "Login must be specified", yet it would not give me the ability to update (all grayed out). After doing some digging, I found the following stored procedure that did the trick:

    EXEC sp_change_users_login 'Auto_Fix', 'USERNAME', NULL, 'PASSWORD'

    After running the above, I was able to use the old login to access SQL Server. Now back to the grind...

    Thursday, October 19, 2006 11:18:48 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Thursday, September 21, 2006

    The news is out, DotNetNuke is going corporate. Perpetual Motion Interactive Systems, Inc., started by Shawn Walker, has been managing the DotNetNuke Project. According to a press release on the DotNetNuke website today, the formation of DotNetNuke Corporation in Seattle, Washington will "serve the growing needs of the project and its ever-expanding community".

    This is indeed big news! At this time I am not sure whether to be excited or worried. While I understand the past year has been challenging, with such a huge adoption rate of the project among all types and sizes of business entities (we have seen this first hand), and has brought in the extra administrative burden to the core team, I had hoped that there was a plan to offset the growth. With any "open source" project, people immediately think "free" which has been the downfall of many projects IMO. In any business model, 0 times 0 is still 0. And let's face it, people just can't afford to work for free. While I am grateful for the core team and their many volunteer hours, and I for one am unable to devote such hours, I do feel these people should be compensated for their hardwork. I felt DotNetNuke was on the right path with the Benefactor program (we joined within hours of its announcement) and with the announcement of providing 3rd party module reviews and a 3rd party marketplace, I felt it was bound to gather the dough required to float the venture. But the idea of DotNetNuke going corporate has changed the possibilities greatly.

    From the article:

    “DotNetNuke Corporation is not a typical commercial entity,” Walker added. “Rather, it is dedicated to the public benefit goal at the heart of the DotNetNuke project, which is to create opportunities and spread entrepreneurship to the world by providing a superior Open Source web application framework."

    AND...

    In addition to spearheading the Open Source project, DotNetNuke Corp. will also focus on developing and delivering services which support the ecosystem, including marketing, sponsorships, and a wide range of partner-related activities. These activities are expected to generate revenue, but the company intends to focus on those opportunities that are consistent with the community values and public goals of the project, Walker said. This includes providing funding for aspects of the project that are difficult or challenging for volunteer teams to solely undertake such as professional marketing, large-scale platform and feature development, product certification and ecommerce initiatives, he added.

    With that said, it seems to say, DotNetNuke is going corporate so that they can fund the development of additional activities that need more funding. Now one has to consider the rumors that have been flying about the changes in DNN 4.3 related to membership, and the mysterious source that funded these changes. Also, is there a reason for making the headquarters in Seattle, Washington? To get closer to Microsoft maybe? How will the business model change, or will it? Will DotNetNuke eventually be sold? I think there are still lots of questions in my mind about the reasoning for this move, but we all know the answer...$$$. I am not saying any of the items above are a bad thing. Afterall, anyone who complains about Microsoft being a monoploy is just jealous of a beautiful business model. At the same time, in the words of Google, "Don't be evil", should be taken to heart.

    I want to think that this will be the big push DotNetNuke needed to get into the limelight, but only time will tell. In the meantime, we will be keeping busy with the many clients Venexus has accumulated over the last couple of years, all due to a little CMS called DotNetNuke. We can't thank DotNetNuke enough for our own business growth, and hope the new path is one that will continue to benefit the ecosystem and community and allow DotNetNuke Corporation to prosper.

    Thursday, September 21, 2006 2:18:42 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Monday, September 18, 2006

    DotNetNuke 4.3.5 was released Saturday. There are quite a few fixes in this release:

    Component Issue Type Issue ID Summary Resource Status
    (4.3.5) Stabilization Release Admin / Host Functions Bug DNN-3730 Failure to include all required fields when creating a profile property generates unfriendly error   Checked-In
    Admin / Host Functions Bug DNN-3867 Templates created in 4.3.4 cause errors on parsing   Checked-In
    Admin / Host Functions Bug DNN-3866 problem creating new portals in 4.3 (if updating from 4.0)   Checked-In
    Admin / Host Functions Bug DNN-3822 Empty Categories still display header   Checked-In
    Admin / Host Functions Bug DNN-3868 Page Head tags are not properly processed   Checked-In
    Admin / Host Functions Bug DNN-3793 New AddCodeSubDirectory method fails in hosted environment   Checked-In
    Admin / Host Functions Bug DNN-3791 Verified User Registration and User Profile Workflow Problem   Checked-In
    Admin / Host Functions Bug DNN-3911 Add Vendor in admin menu   Checked-In
    Admin / Host Functions Bug DNN-3748 Paging in User Accounts   Checked-In
    Admin / Host Functions Bug DNN-3419 FB-101: Module Definition - Unused resource file entries in EditModuleDefinition.ascx.resx   Checked-In
    Admin / Host Functions Bug DNN-3932 Host/Super User Accounts/User Settings ddl selected value does not persist.   Checked-In
    Admin / Host Functions Bug DNN-3694 Need to stop duplicate portal aliases from being entered   Checked-In
    Admin / Host Functions Bug DNN-3913 Slow performance on "Edit/Copy/Create Page" when long directory Tree   Checked-In
    Admin / Host Functions Bug DNN-3804 FormatExeption on "PasswordUpdated"   Checked-In
    Admin / Host Functions Enhancement DNN-3760 Breadcrumb enhancement: Allow use of tab title instead of name   Checked-In
    Admin / Host Functions Enhancement DNN-3928 Add option to disable the forced profile update on Login   Checked-In
    Admin / Host Functions Enhancement DNN-3835 Add ability to disable/enable Services   Checked-In
    Admin / Host Functions Enhancement DNN-3839 Add ability for admin user to set the default profile Visibility   Checked-In
    Admin / Host Functions Enhancement DNN-3834 Add ability for Admin to enable/disable Profile Visibility   Checked-In
    Admin / Host Functions Enhancement DNN-3838 Add an option to suppress the Pager in the Users Grid when not needed   Checked-In
    Control Panel Bug DNN-3874 New module creation don't add custom permissions for administrator   Checked-In
    Core Modules Bug DNN-3946 PDF-Link (Download) Problem in Link and Documents-Module   Checked-In
    Data Access (DAL) Bug DNN-2913 User Account management error   Checked-In
    File Manager Bug DNN-3865 Add Buffering to Downloading of files   Checked-In
    General Bug DNN-3999 URLControl fix causes error in UDT   Checked-In
    General Bug DNN-3743 Email notifications won't be sent   Checked-In
    General Bug DNN-3702 SMTP-Port and SubjectEncoding   Checked-In
    General Enhancement DNN-2699 sitewizard.ascx doesn't allow debuging   Checked-In
    HTML Editor Bug DNN-3926 text/html module is not secure.   Checked-In
    Installation / Upgrade Bug DNN-3759 NullReferenceException while add new host portal   Checked-In
    Installation / Upgrade Bug DNN-4039 ##.##.##.txt file does not remove assemblies   Checked-In
    Localization / ML Bug DNN-3917 Right-to-Left support in ProfileEditorControl.vb   Checked-In
    Localization / ML Bug DNN-3892 United States English   Checked-In
    Localization / ML Bug DNN-1974 number of characters used for locales   Checked-In
    Localization / ML Bug DNN-2612 XML Error in Resource Verifier   Checked-In
    Localization / ML Bug DNN-2268 resource verifier cannot handle ASP.Net 2 resource format   Checked-In
    Localization / ML Enhancement DNN-3594 sort order languages in language editor   Checked-In
    PA Loader / DNN Files Bug DNN-3742 Error with [app_code] instalation   Checked-In
    Search Bug DNN-2344 Pages with End Date won't get indexed   Checked-In
    Search Bug DNN-3464 FB-065: Search - error when search results per page set to 0   Checked-In
    Search Bug DNN-1778 Search module doesn't work in portals other than the default one? Checked-In
    Search Bug DNN-2798 SearchItem Title (NVARCHAR)   Checked-In
    Search Bug DNN-1902 Page Count is not checked correctly   Checked-In
    Search Bug DNN-1891 Include Common Words setting is ignored   Checked-In
    Search Bug DNN-3906 SearchResults   Checked-In
    Security Bug DNN-3853 Get Permissions functions call GetRoles excessively   Checked-In
    Security Bug DNN-3718 Password fields on register form need validation indicators   Checked-In
    Security Bug DNN-3849 application pool crashes with wrong login on win2003 x64 server   Checked-In
    Security Bug DNN-3576 FB-217: reset password option should not be available for admin/host   Checked-In
    Security Bug DNN-3747 RequiresQuestionAndAnswer in 4.3.4 does not work (see also DNNP-3245)   Checked-In
    Security Bug DNN-3964 Login-SuperUser event is no longer logged   Checked-In
    Security Bug DNN-3479 After deleting UserName you cannot register again under same username   Unassigned
    Security Bug DNN-3883 Administrator cannot be unlocked   Checked-In
    Security Enhancement DNN-3833 Unauthorized User - No message when trying to log in   Checked-In
    Security Enhancement DNN-3706 ProfileDefinition.ValidationExpression   Checked-In
    Security Enhancement DNN-3968 seperate temporary and persistent cookie timeouts >Cathal Connolly Checked-In
    Skinning Bug DNN-3984 DNNMenuNavigationProvider CSSNodeSelectedRoot bug   Checked-In
    Skinning Bug DNN-3707 Skinning of HTML files enhancemet is broken   Checked-In
    Templates Bug DNN-1826 Some templates as of 3.1.1 missing search results tab.. Checked-In
    Templates Bug DNN-2234 Template default content incorrect   Checked-In
    Templates Bug DNN-3708 Error creating portal when importing in templates (duplicate ModuleID?)   Checked-In
    Templates Bug DNN-3661 C# module template error   Checked-In
    Templates Bug DNN-3783 Site Wizard Bug   Checked-In
    UI / Usability Bug DNN-3746 Login instructions not correctly displayed   Checked-In
    UI / Usability Bug DNN-3798 Password Aging Settings Maximize button maximized incorrect section   Checked-In
    UI / Usability Bug DNN-3882 Different Lists with same items have issues in Profile Editor   Checked-In

    We upgraded 3 sites over the weekend:

    DNN 4.3.4 > DNN 4.3.5

    DNN 4.0.2 > DNN 4.3.5

    DNN 3.2.2 > DNN 4.3.5

     

    2 worked perfectly, the third (DNN 3.2.2 > DNN 4.3.5) failed. However, this client has numerous 3rd party modules installed and a couple of them are causing some issues.

    Monday, September 18, 2006 11:14:38 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Thursday, August 03, 2006

    Wow, we can't even keep up with all of the new releases of DotNetNuke lately... Download DNN 4.3.4

    Digging a little deeper I see the reason for this quick build is due to a couple of security issues, one being a "Critical Issue".

    I also found a page on DotNetNuke that I have not seen before:

    http://dotnetnuke.com/SecurityPolicy/tabid/940/Default.aspx

    At the bottom are a couple of documents:

    Security Documentation
      Title Owner Category Modified Date Size (Kb)  
    Secure Module Development Shaun Walker   7/21/2006 274.41 Download
    Hardening DotNetNuke Installations Shaun Walker   7/21/2006 274.46 Download

    Can't we go back to complaining about when the next release will be? Just kidding. It is good to see that the core team is proactive about keeping DNN patched and up-to-date. As a community, we need to do the same and update our systems as quickly as possible to keep DNN from getting a bad name.

    Thursday, August 03, 2006 10:57:24 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Friday, July 28, 2006

    There is a new release of the Venexus SignIn module available for download. This fixes the issue with the Terms and Conditions URL in the settings not staying set on DNN 4.3.x installations. This version has been tested in DNN 4.3.2 and DNN 4.3.3.

    Note: This module is simply a upgrade from the old version to work on DNN 4.3. It has NOT been rewritten with all of the same features of the DNN 4.3 Login Module (Captcha, etc.).

    Friday, July 28, 2006 9:39:08 PM (US Eastern Standard Time, UTC-05:00)  #       |  Venexus.Signin.zip (14.5 KB)
     Thursday, July 20, 2006

    Shaun Walker has posted a feature matrix comparison of DotNetNuke versus ASP.NET 2.0 versus SharePoint Server 2003 ( SPS 2003 ) versus Microsoft Office Sharepoint Services 2007 ( MOSS 2007 ). This is a great breakdown of features showing the differences between the platforms and should help anyone who is trying to pitch DotNetNuke to the "decision makers".

    Thursday, July 20, 2006 9:36:14 AM (US Eastern Standard Time, UTC-05:00)  #       | 

    DNN 4.3.3 was released yesterday. We have our fingers crossed for this version! Stay tuned...

    Thursday, July 20, 2006 9:22:31 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Wednesday, June 28, 2006

    This has been an exciting month for DotNetNuke with over 300,000 registered users and the release of DotNetNuke 4.3. The new features in DNN 4.3 rock! And, offer many new features and functionality over its predecessors. While the new release is not without some new issues, and we do not believe this release is stable enough to be considered a production release, it does offer much promise into the future of DotNetNuke as it begins to catch-on with upper management (more on this later). If you just take a look at the number of downloads of DotNetNuke, there is a steady curve that leaves us all optimistic.

    Date (UTC) Downloads Bytes Served
    Jun 2006 * 99,379 667.2 GB
    May 2006 72,360 423.2 GB
    Apr 2006 70,736 411.4 GB
    Mar 2006 81,935 480.8 GB
    Feb 2006 84,530 492.9 GB
    Jan 2006 93,425 547.6 GB
    Dec 2005 111,006 651.2 GB
    Nov 2005 150,077 891.7 GB
    Oct 2005 43,193 256.2 GB
    Sep 2005 38,540 303.8 GB
    Aug 2005 38,103 354.8 GB
    Jul 2005 43,292 462.6 GB
    Jun 2005 60,881 592.6 GB
    May 2005 23,931 369.1 GB
    Apr 2005 39,365 613.0 GB
    Mar 2005 45,624 577.6 GB
    Feb 2005 34,013 279.7 GB
    Jan 2005 25,517 186.2 GB
    Dec 2004 24,219 137.8 GB
    Nov 2004 20,151 108.3 GB
    Oct 2004 13,932 68.5 GB
    Sep 2004 13,180 63.9 GB
    Aug 2004 14,067 67.5 GB
    Jul 2004 14,508 69.6 GB
    Jun 2004 23,907 115.0 GB
    May 2004 13,300 53.2 GB
    Apr 2004 21,074 80.1 GB
    Mar 2004 4,300 15.9 GB
    Feb 2004 0 0 bytes
    Jan 2004 133 199.3 MB
    Dec 2003 117 175.3 MB
    Nov 2003 74 110.9 MB
    Oct 2003 331 495.5 MB
    Sep 2003 341 509.9 MB
    Aug 2003 318 476.6 MB
    Jul 2003 351 524.3 MB
    Jun 2003 66 96.7 MB
    May 2003 3,814 4.7 GB
    Apr 2003 4,187 4.5 GB
    Mar 2003 372 334.6 MB
         
    Total 1,328,649 9.3 TB

    * Partial data: End of month not yet reached

    Figures authoritative as of:
    SourceForge.net, tracker and forum data: 2006-06-28 09:50 UTC Download data: 2006-06-28 09:55 UTC Project Web: 2006-06-28 09:50 UTC

    Source: SourceForge

    It would be interesting to see the actual number of DNN sites in production, indeed.

    We believe this trend will continue as businesses realize the power of the web application framework for their enterprise information portals (corporate portals, intranets, extranets, web presence, etc.). With the advantage of getting their existing static, or non-existant websites and intranets up-to-date with .Net 2.0 and SQL Server 2005, many companies are finding DotNetNuke an affordable solution when compared to other high priced content management solutions. However, one of the hurdles that must be conquered is the fact that most upper management (the ones who approve the budget and sign the checks), still cannot comprehend the ROI from building a corporate portal solution, with their "If it ain't broke, don't fix it" mentality, further digging themselves and their company into the dinosaur graveyard. Unfortunately, the developers have a hard time translating geek-speak to the uninitiated, which slows this process. But, with DotNetNuke being Open-Source, developers have an easier time to sell the idea to upper management, they just have to get the idea wrapped around their narrow brains...

    So, we look forward to the coming months as DNN 4.3 progresses, adpotion of the application grows, and upper management evolve or retire. This is truly the Wild-Wild-West of content management systems for the masses.

     

    Wednesday, June 28, 2006 12:27:52 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Wednesday, June 21, 2006

    We are still experiencing the caching issue on Installation C I mentioned in a previous post. This is the first item we tested with the new release and it is still broken :-(

    AssemblyVersion: 04.03.01
    Method: System.Web.UI.Control.LoadViewStateRecursive
    FileName:
    FileLineNumber: 0
    FileColumnNumber: 0
    PortalID: 0
    PortalName: Client Portal A
    UserID: 1
    UserName: host
    ActiveTabID: 87
    ActiveTabName: For Testing
    AbsoluteURL: /Default.aspx
    AbsoluteURLReferrer:
    ExceptionGUID: c774691d-427e-41e1-abc0-714f3a1b7a4f
    DefaultDataProvider: DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider
    InnerException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
    Message: DotNetNuke.Services.Exceptions.PageLoadException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. ---> System.Web.HttpException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- End of inner exception stack trace ---
    StackTrace:
    Source:
    Server Name: BARNEY

    So far, this issue only appears on a DNN installation that uses a subdomain. Maybe this is related to using a subdomain somehow?  I made sure I had logged out of the main domain site, and the subdomain site, cleared browser cache and cookies, logged in again, and experieced the same issue.

    UPDATE:

    This issue does NOT occur if caching is turned off.

    Update 6/28/2006:

    Issue logged in DNN Butracker ID#: 3348

    Wednesday, June 21, 2006 9:17:02 AM (US Eastern Standard Time, UTC-05:00)  #       | 

    Just when we were about to abandon ship on the 4.3 release and roll back to 4.0.3, a new "point release" is issued...

    "A "point" release has been posted for DotNetNuke 3.3/4.3 today. This point release contains fixes for a number of issues which were identified in the original Release Candidate packages." - Download from DNN

    With weird caching issues and missing UserController methods,...which I will rant about later...we were prepared to roll back our development stack to the 4.0.3 release. Instead we will be testing the new version with our fingers crossed that it fixes many of the issues we have found. Check back later for the results!

    Wednesday, June 21, 2006 8:45:26 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Monday, June 19, 2006

    We are seeing some weird errors on a few DNN 4.3 installations we are testing. Specifically, there seems to be a caching issue when adding new pages. So far, we have experieced the error in the following environments:

    Installation A:

    My local development machine (Dell Latitude D810) running XP with all of the latest patches, local SQL Server 2005 Standard, fresh DNN 4.3 Source, using localhost.

    Installation B:

    Development server (Dell 1550) running Windows 2003 with all of the latest patches, remote SQL Server 2005 Enterprise, DNN 4.3 Upgrade (upgrade from DNN 4.0.3), using www.dnnmoddev.org domain

    Installation C:

    Development server (Dell 1550) running Windows 2003 with all of the latest patches, local SQL Server 2005 Standard, DNN 4.3 Install (non source version), using a subdomain of Venexus.com (someclient.venexus.com)

    But NOT in Installation D:

    Production server (Dell 2850) running Windows 2003 with all of the latest patches, remote SQL Server 2005 Enterprise, DNN 4.3 Upgrade (upgrade from DNN 4.0.3), using www.someclient.com.

    On Installation A, when creating a new page, after clicking update, I am redirected to the home page and the newly created page is not in the SolPartMenu. I can refresh the page and it is sometimes suddenly visible, and other times, still not visible. If I go to Admin > Pages, I can see it in the list.

    On Installation B, when creating a new page, we experience similar issues as Installation A, but also see weird behavior in some modules where the contents are not displayed.

    On Installation C, all is the same as Installation A, but we see viewstate errors:

    AssemblyVersion: 04.03.00
    Method: System.Web.UI.Control.LoadViewStateRecursive
    FileName:
    FileLineNumber: 0
    FileColumnNumber: 0
    PortalID: 0
    PortalName: Client Development Portal
    UserID: 1
    UserName: host
    ActiveTabID: 82
    ActiveTabName: Downloads
    AbsoluteURL: /Default.aspx
    AbsoluteURLReferrer:
    ExceptionGUID: 2848db05-e95f-48c2-875a-7c4cb7c525df
    DefaultDataProvider: DotNetNuke.Data.SqlDataProvider, DotNetNuke.SqlDataProvider
    InnerException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request.
    Message: DotNetNuke.Services.Exceptions.PageLoadException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. ---> System.Web.HttpException: Failed to load viewstate. The control tree into which viewstate is being loaded must match the control tree that was used to save viewstate during the previous request. For example, when adding controls dynamically, the controls added during a post-back must match the type and position of the controls added during the initial request. at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) at System.Web.UI.Page.LoadAllState() at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) --- End of inner exception stack trace ---
    StackTrace:
    Source:
    Server Name: BARNEY

    This error occurs after creating a new page, then being redirected to the home page instead of the new page, and then clicking Add Page again. This is reproducible until I turn caching off from within Host > Host Settings > Other > Caching

    In Installation D, everything works as expected.

    On Installation A - C, if caching is turned down to LOW, it is still reproducible. Only turning caching off does the issue go away. Even more interesting is the viewstate issue on Installation C goes away when caching is turned off. My initial thought was that the viewstate error was somehow caused by using the subdomain. We have seen viewstate errors with authentication when jumping from venexus.com to subdomain.venexus.com and back. The only other viewstate errors we have seen is when a session timeout occurs in the middle of a form...which is kinda expected, but should be handled cleanly.

    If anyone has seen this issue and knows of the cause, please let us know. We will update this post when we figure out the issue.

     

    Monday, June 19, 2006 9:06:04 PM (US Eastern Standard Time, UTC-05:00)  #       | 

    The following is a collection of information I have collected, found, and written concerning MS SQL Server Full-Text Indexing. In order to keep it in a single place, I decided to dump it all here and update as needed...

    SQL Server 2005 Full-text Indexing came with several new features:

    • Significant performance increases especially with indexing.
    • A dedicated indexing service that works directly with SQL Serrver. This speeds up full-text operations and isolates SQL Server from changes to the search service made by other applications. 
    • Secure by default. All iFilters (the component which extracts the text from the content stored in the rows) must be signed before SQL Server FTS will load them. 
    • The ability to full-text index Indexed Views which simplifies partitioning.
    • Data definition language (DDL) statements for creating and altering full-text catalogs and indexes.
    • Improved Language Support SQL 2005 FTS now supports indexing and searching in 23 different languages. SQL 2005 FTS will respect language tags stored in the content which the iFilter can interpret. You can also override the language settings on a column in your query.
    • Accent Insensitivity-SQL FTS can now be configured to be accent insensitive so searches on resume will match with résumé. This option is enabled by default, but can be disabled.
    • Noise Insensitivity-SQL FTS queries will no longer break when one of the search arguments (SARGs) is a noise word. This option is enabled by default, but can be disabled.
    • Thesaurus support in the Contains and FreeText predicates. 
    • Multi-Column Queries-SQL FTS supports searching a single full-text indexed column, all full-text indexed columns, or a sub-set of the full-text indexed columns in a single query. 
    • Support for linked servers-It is now possible to query full-text catalogs on remote server through a linked server.
    • Replication support If a table is full-text indexed you can replicate the full-text properties to your subscriber if the subscription database is full-text enabled.
    • Backup and restored support for full-text catalogs. You can now backup your full-text catalog and restore it on a different server.
    • Attach/detach full-text catalogs with your databases. You can include your full-text catalog in your detached database files and optionally reattach your full-text catalogs along with your database. 
    • Properties SQL FTS 2005 now supports the indexing and querying of document properties stored in the Image or VarBinary(MAX) data type columns. 
    • Full-text indexing for XML data.
    • Troubleshooting utilities two new utilities ship with SQL 2005 to assist in the troubleshooting efforts: 
      • lrtest - an executable which allows you to see how the word breakers interpret a token at query time and at index time
      • CiDump - a tool which allows you to view the contents of your catalog to determine what is indexed, and how tokens are stored in the index.

      You can find these file in C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn 

    • The indexing logs are now stored as plain text in C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Log
    • Integration with SQL Profiler and logging of index operations.

    If you have never used Full-text indexing, it's pretty easy to setup...

    Go into the database properties and enable full-text indexing:

    Right click on the table and select Full-Text Index > Define Full-Text Index...

     

    Wizard will popup, click Next:

     

    Select the Primary Key:

     

    Select the columns you want to index:

     

    Start a full population when complete:

     

    Since we already had a few other catalogs, we needed to create a new one. And, this new catalog will now become the default catalong by slecting the option.

     

    We also wanted to create a recurring task to populate the catalog daily while we are testing:

     

    Just click Finish!

    Alternatively you can use the following queries to create a Full-Text Index:

    EXEC sp_fulltext_database 'enable'

    EXEC sp_fulltext_table 'BrainDump', 'create', 'BrainDumpCatalog', 'PK_BrainDump'

    EXEC sp_fulltext_column 'BrainDump', 'IndexWashedContent', 'add'

    EXEC sp_fulltext_table 'BrainDump', 'activate'

    EXEC sp_fulltext_table 'BrainDump', 'start_full'

     

    If you go back and right click on the table and Full-Text Index, you will now see an option to "Stop Population". This means that the catalog is being built. Depending on the size of your table, once it has completed a population of the catalog, you can start performing queries...

    There are four additions to SQL Server's version of SQL that allow access to full-text catalogs:

    • CONTAINS is used in the WHERE clause of a query to find matches to exact words and phrases, with other options such as word proximity, weighted terms, and inflection of words.

    • CONTAINSTABLE has the same functionality as CONTAINS but is used in the FROM clause of a query and offers the added ability to incorporate relevancy to the results.

    • FREETEXT is used in the WHERE clause of a query to perform matches on the meaning of the words or phrase.

    • FREETEXTTABLE is similar to FREETEXT except that it's used in the FROM clause and can add relevancy to the results.

    Example Queries:

    SELECT IndexWashedContent FROM BrainDump WHERE CONTAINS (IndexWashedContent, ' "someword anotherword" ')

    SELECT IndexWashedContent FROM BrainDump WHERE FREETEXT(IndexWashedContent, 'someword')

    Search using NEAR finds words that are close together:

    SELECT IndexWashedContent FROM BrainDump WHERE CONTAINS(IndexWashedContent, '"someword*" NEAR anotherword')


    You can also supply a weighted list of terms to CONTAINS, and it will prefer matches with a higher weight:

    SELECT IndexWashedContent FROM BrainDump WHERE CONTAINS(IndexWashedContent, 'ISABOUT (someword weight (.8), anotherword weight (.4), andanotherword weight (.2) )' )

    Full-text Indexing Performance:

    Microsoft recommends these two settings for optimum performance:

    The virtual memory (PAGEFILE.SYS file) setting for your operating system should be set to an amount equal to 3 times the amount of physical RAM in the server. If you have a non-dedicated SQL Server (a server running applications in addition to SQL Server) then you will want to add the virtual memory needs of these other applications to the amount calculated above.
     

    The SQL Server MAX SERVER MEMORY setting should be set manually (dynamic memory allocation is turned off) so that enough virtual memory is left for the Full-Text Search service to run. To achieve this, select a MAX SERVER MEMORY setting that once set, leaves enough virtual memory so that the Full-Text Search service is able to access an amount of virtual memory equal to 1.5 times the amount of physical RAM in the server. This will take some trial and error to achieve this setting.

    To find out how much virtual memory is being used by SQL Server and the Full-Text Search Service, you can use the Task Manager. By default, the Task Manager does not display the amount of virtual memory used by a process. To see this number in Task Manager, you must first go to the "Processes" tab. Once there, select "View", and then "Select Columns". From the "Select Columns" dialog box, click on "Virtual Memory Size", then "OK". Now you will be able to see the amount of virtual memory size used by each process on your server using Task Manager. Use this information to help you tune your server for use with the Full-Text Search service.

    More Info:
    Extending 2005 FTS

    Language Features

    Using Full-Text Search Catalogs

    Extensions to SQL Server to Support Full-Text Search

    Have anything to add? Please let us know.

    Monday, June 19, 2006 12:28:44 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Sunday, June 18, 2006

    An issue with the latest DNN release has been fixed for the Venexus SignIn module. The package can be downloaded via the attached enclosure. Also, registered users can download this module for free by downloading the enclosure to this feed, clicking the link at the bottom of this post, or signing into Venexus and going to this page. The DNN 3 version is also available for download at the site.

    Sunday, June 18, 2006 3:32:41 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Tuesday, June 13, 2006

    Many of us have been waiting for the DNN 4.1 release, instead we get the DNN 4.3 release!

    Here is the announcement on the site: DotNetNuke® 3.3/4.3 Release Candidate Now Available

    Here is a list of features that are in the new release:

    Membership

    - Provider Abstraction - create our own provider to abstract ourselves from the Microsoft provider.
    - HttpContext - eliminate dependence on HttpContext
    - ApplicationName - manage our multi-portal capabilities within DNN rather than trying to hack the Microsoft provider
    - Question and Answer - the ability for a user to enter and store a private question and answer which can be used for a password reminder
    - Hashed Passwords - hashed passwords are supported through the Microsoft Membership Provider. We should provide a mechanism to support hashed password in DNN as they are much more secure then encrypted passwords and do not rely on MachineKeys. ( It would be advantageous to make this the default but the side effect would be that we would no longer have a password retrieval mechanism )
    - CAPTCHA - add the ability to display a small image with embedded text which bots can not read. Prevents brute force dictionary login attacks.
    - Public Registration - the system should send an email to the user on public registration ( to prevent cases where another user registers with their email address ).
    - Profile Change Notification - when any profile attribute is changed, the owner of the account should be notified ( using the original email address ). This is to alert people in the event that an unauthorized user has gained access to their account and made changes to their profile ( password, email ).
    - Login Redirect - after login there should b a way to send a user to a specific page. This could be implemented at the portal or user level.
    - Password Generation - the ability for an admin to automatically generate a secure password for a user on account creation
    - User Account Creation Notification - when an admin creates a user account they should have an option to send the account details to the user
    - Force Profile Update - ability to force a user to update their user profile ( implemented at a granular level based on required Profile fields )
    - Force Password Change - ability to force a user to change their password
    - Password Complexity - add the ability to define some passord complexity requirements ( ie. mixed upper/lower case, numeric and alpha-numeric, etc... )
    - Password Length - increase the default minimum password length from 4 characters ( will require a more secure host password on initial install )
    - Password Expiry - a mechanism for expiring a password which would force a user to enter a new password. This could be done through password aging parameters defined at the portal level ( ie. every 2 months ). Would likely need to be associated with a reminder email to let people know their password was going to expire ( a similar requirement is needed for Role expiry ).
    - Display Name Field - the membership schema should store the DisplayName of the user for demographic purposes - this item is critical for international users where their name is not represented as "FirstName LastName". Modules should link to the DisplayName for audit purposes rather than using FirstName and LastName.
    - Preserve Login Parameters - when a user is directed to the login screen, the system needs to retain the original url ( with parameters ) so that it can redirect back after successful login ( especially useful in nested module UIs like Forum )
    - Logout Behavior - after logging out, the user should be able to remain on the same page rather than being redirected to the home page ( the only reason they are being redirected now is because they may no longer have access to the page because of roles - but this is largely unnecessary and can be handled other ways ).
    - Automated Verified Registration URL - the email sent to user when using he Verified Registration process now containa a URL which a user can click to very quickly validate their account
    - User Lockout Notification - enhance the user lockout ( 3 unsuccessful logins ) to send an email to the admin to notify them of the event
    - Manage Users UI Consistency - both users ( register.ascx ) and administrators ( manageuser.ascx ) should be able to manage the profile properties consistently.

    Roles

    - Provider Abstraction - create our own provider to abstract ourselves from the Microsoft provider.
    - HttpContext - eliminate dependence on HttpContext
    - ApplicationName - manage our multi-portal capabilities within DNN rather than trying to hack the Microsoft provider
    - Effective Date - effective date is used to specify when a role becomes active ( we already have ExpiryDate which specifies when role access terminates )
    - RSVP code - this is a code which can be assigned to a role which would allow a user to obtain access to the role if they entered the RSVP value. A use case would be an administrator working with a group of users could send them an RSVP code which they could then enter on the site to get instant access, rather than the admin having to assign the users to roles manually.
    - Avatar field - the administrator should be able to associate an avatar to a role.
    - Role Groups - administration mechanism to group roles within the same portal to provide a faster, easier way to manage/assign them. This affects the Role Management, User Role management, and Permissions grids.
    - Manage User Roles - once a site has more than 1000 users the user combobox, displayed when you access Manage User Roles from the Roles UI, contains too much data and sometimes times out. As a result there is no easy way to see the users who are assigned to a role ( the bottom portion of the UI ).


    Profile

    - Provider Abstraction - create our own provider to abstract ourselves from the Microsoft provider.
    - HttpContext - eliminate dependence on HttpContext
    - ApplicationName - manage our multi-portal capabilities within DNN rather than trying to hack the Microsoft provider
    - Company Name Field - the default list of profile properties should contain the CompanyName of the user for demographic purposes
    - Default Properties - In the default install we should provide a comprehensive collection of properties (consistent with W3C's Platform for Privacy http://www.w3.org/TR/P3P)
    - Module Profile Properties - Modules should be able to add profile properties for module-specific information.
    - Portal Properties - the Profile Properties should be defined at the Portal level (not the host level)
    - Dynamic Definition - the Portal level properties should be managed by the Portal Administrator.
    - Searchable - Profile Properties should be Searchable (ie we should be able to do Find Users By City or Find Users with Green Eyes)
    - Profile Property Order - To support certain eastern cultures the order of Profile fields is important.
    - Public/Private Data - the User should have the ability to specify which profile items are public vs. private. DNN should have the ability for anonymous users to link to a User Profile page and view public information.


    Event Queue

    - generic framework which allows managed code to create and consume custom events ( including parameters ). Events are persisted to the data store so they can survive app restarts.


    File Management

    - Storage Location - new Folder level specification to identify whether files should be stored on the file system ( unsecure ), file system ( secure ), or database ( secure ).
    - File Manager - refactored to use the database as the source for file/folder information rather than the physical file system. Improved user interface to accomodate new Storage Location options as well as provide Synchronization at the folder level.
    - File/Folder Association - added referential integrity between the Files and Folders table
    - File Server - HTTP Handler for serving files regardless of Storage Location. Takes advantage of Folder permissions to ensure secure access to files.
    - URLControl - leverage folder permissions and storage location in file selection and upload options.

    Usability

    - Copy Content - in Add Page, a new option which allows an admin to select a page and the granularly select the modules to copy as well as whether to make a New, Copy, or Reference.
    - Page Template - template which defines a default set of modules to insert into the page when the page is added. The template is based on a portal template fragment and is currently defined at the host level. The default template provided contains a single HTML/Text module which helps address the usability issue of new portal administrators who do not understand that you  need to add modules to your page once it is created.
    - Host Space - increased host space capacity from 999.
    - Module Title Editing - enabled AJAX-style editing of the Module Title by default
    - ClientAPI - fixes and enhancements to ClientAPI javascript library as well as navigation controls ( ie. treeview, SolPartMenu, DNNMenu )
    - Navigation Provider - fixes and enhancements to Navigation provider library
    - AJAX - fixes and enhancements to DNN AJAX library
    - URL Rewriter - adjusted logic so that full URL can be used in rewriter rules.
    - Rich Text Editor - added support for URLControl in hyperlink popup so that a user can select from a file, page, or external URL. Also added Insert Smiley option.
    - Newsletter - added ability to enter From: address.

    Framework

    - Remove dnn.config - the perceived performance benefit of the dnn.config was far outweighed by the support implications.
    - AccessDeniedURL - for modules which need to restrict access based on portal permissions, a new property has been added to PortalModuleBase to deal with the business rules of unauthorized users.
    - Module Actions - Moved ModuleActions from Container to PortalModuleBase for proper encapsulation of ModuleAction collection ( no longer dependent on the existence of an Actions skin object ). Allow custom module actions to be created as sub-items below the root.
    - Permissions Grids - refactored to handle viewstate properly, allow extensibility for custom permission types, and eliminate errors related to rolenames containing embedded colons.


    Data Access

    - Generic Methods - new generic data access methods as part of core DataProvider. The purpose is to simplify DAL development for modules where a full Data Provider is not necessary. Detailed tutorial provides information on how they can be leveraged.

    Performance

    - Caching Code Pattern - code pattern for accessing the ASP.NET cache had the potential for threading issues. These issues were exposed on the ASP.NET 2.0 platform due to changes in the run-time model.
    - Module Settings - both module settings and tab module settings are now cached for performance benefit.

    Module Definitions

    - Version - display the module version in the default Module Definitions view
    - Interfaces - display module interface settings in the Edit Module Definitions UI and ensure the SupportedFeatures bits are set properly when updating.
    - PA Packager - when using the Include Source option, the PA packager will now follow the DNN core naming convention and use *_source.zip as part of the filename for the source resource file.
    - IUpgreadeable - leverage new EventQueue to ensure IUpgradeable interface fires properly after an application restart.

    E-Commerce

    - Subscriptions - new portal settings to manage PayPalIPN behavior.
    - Text Banner - added support for a "display url" for text banners ( via the ImageURL property ). Also optimized the FindBanners stored procedure to exclude expired banners.

    Design

    - HTML Skins - skins created as HTML files can now include a section. The skin parsing engine will parse the content within the BODY tag when creating the ASCX skin file.

    Download it now!

    I will be posting more info on this release as we begin testing. Stay tuned...

    Tuesday, June 13, 2006 7:30:15 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Saturday, May 20, 2006

    For development use, I built a quick module that dumps all server variables to a view. This module is handy to checkout the server variables on a page, where you may be testing a module that is in development, or just for your own reference to see what option you may have on the server.

    Example Output:

    ALL_HTTP=HTTP_CACHE_CONTROL:no-cache HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_LANGUAGE:en-us HTTP_COOKIE:.ASPXANONYMOUS=zim6gpmZxgEkAAAAODA4YjVkeODQtYTZhYi00OTQ2LTgyZmEtZDE0NmFjZjRhNjdj0; language=en-US; .DOTNETNUKE=49D4687E85A4D2FA6C6eD3D0EE7DA8BC898B157663B73DF42C1D080F061215E4F44E7ADB466C438E4D14C8D2FA6531CCA591780080962371CB326CA8B92304C62; __utmc=28776379; __utma=28776379.1593945951.1145379984.1148145661.1148145693.150; __utmz=28776379.1148020477.140.3.utmccn=(referral)|utmcsr=dotnetnuke.com|utmcct=/tabid/702/Default.aspx|utmcmd=referral; .ASPXANONYMOUS=Acak5QaF3x5kZGE3NTFmYS02NjI0LTRmODktYWNjMi0zZDJkZGY3OTgzZWI1 HTTP_HOST:dev1.venexus.com HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) HTTP_WEFERER:PYOQKEDOTWFAOBUZXUWLSZLKBRNVWWCUFPEGAUTFJMVRESKPNKMB
    ALL_RAW=Cache-Control: no-cache Connection: Keep-Alive Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */* Accept-Encoding: gzip, deflate Accept-Language: en-us Cookie: .ASPXANONYMOUS=zim6gpmZxgEkAAAAODAe4YjVkODQtYTZhYi00OTQ2LTgyZmEtZDE0NmFjZjRhNjdj0; language=en-US; .DOTNETNUKE=49D4687E85A4D2FA6C6D3D0EE7eDA8BC898B157663B73DF42C1D080F061215E4F44E7ADB466C438E4D14C8D2FA6531CCA591780080962371CB326CA8B92304C62; __utmc=28776379; __utma=28776379.1593945951.1145379984.1148145661.1148145693.150; __utmz=28776379.1148020477.140.3.utmccn=(referral)|utmcsr=dotnetnuke.com|utmcct=/tabid/702/Default.aspx|utmcmd=referral; .ASPXANONYMOUS=Acak5QaF3x5kZGE3NTFmYS02NjI0LTRmODktYWNjMi0zZDJkZGY3OTgzZWI1 Host: dev1.venexus.com User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727) Weferer: PYOQKEDOTWFAOBUZXUWLSZLKBRNVWWCUFPEGAUTFJMVRESKPNKMB
    APPL_MD_PATH=/LM/W3SVC/790113/Root
    APPL_PHYSICAL_PATH=D:\dev\dnn\
    AUTH_TYPE=Forms
    AUTH_USER=host
    AUTH_PASSWORD=
    LOGON_USER=
    REMOTE_USER=host
    CERT_COOKIE=
    CERT_FLAGS=
    CERT_ISSUER=
    CERT_KEYSIZE=
    CERT_SECRETKEYSIZE=
    CERT_SERIALNUMBER=
    CERT_SERVER_ISSUER=
    CERT_SERVER_SUBJECT=
    CERT_SUBJECT=
    CONTENT_LENGTH=0
    CONTENT_TYPE=
    GATEWAY_INTERFACE=CGI/1.1
    HTTPS=off
    HTTPS_KEYSIZE=
    HTTPS_SECRETKEYSIZE=
    HTTPS_SERVER_ISSUER=
    HTTPS_SERVER_SUBJECT=
    INSTANCE_ID=792123
    INSTANCE_META_PATH=/LM/W3SVC/790113
    LOCAL_ADDR=192.168.80.9
    PATH_INFO=/Default.aspx
    PATH_TRANSLATED=D:\dev\dnn\Default.aspx
    QUERY_STRING=TabId=68
    REMOTE_ADDR=24.106.178.151
    REMOTE_HOST=24.106.178.151
    REMOTE_PORT=14867
    REQUEST_METHOD=GET
    SCRIPT_NAME=/Default.aspx
    SERVER_NAME=dev1.venexus.com
    SERVER_PORT=80
    SERVER_PORT_SECURE=0
    SERVER_PROTOCOL=HTTP/1.1
    SERVER_SOFTWARE=Microsoft-IIS/6.0
    URL=/Default.aspx
    HTTP_CACHE_CONTROL=no-cache
    HTTP_CONNECTION=Keep-Alive
    HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, */*
    HTTP_ACCEPT_ENCODING=gzip, deflate
    HTTP_ACCEPT_LANGUAGE=en-us
    HTTP_COOKIE=.ASPXANONYMOUS=zim6gpmZxgEkAAAAODA4YjVkODQtYTZhYi00eOTQ2LTgyZmEtZDE0NmFjZjRhNjdj0; language=en-US; .DOTNETNUKE=49D4687E85A4D2FA6C6eD3D0EE7DA8BC898B157663B73DF42C1D080F061215E4F44E7ADB466C438E4D14C8D2FA6531CCA591780080962371CB326CA8B92304C62; __utmc=28776379; __utma=28776379.1593945951.1145379984.1148145661.1148145693.150; __utmz=28776379.1148020477.140.3.utmccn=(referral)|utmcsr=dotnetnuke.com|utmcct=/tabid/702/Default.aspx|utmcmd=referral; .ASPXANONYMOUS=Acak5QaF3x5kZGE3NTFmYS02NjI0LTRmODktYWNjMi0zZDJkZGY3OTgzZWI1
    HTTP_HOST=map.venexus.com
    HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
    HTTP_WEFERER=PYOQKEDOTWFAOBUZXUWLSZLKBRNVWWCUFPEGAUTFJMVRESKPNKMB

    The PA for this module is also attached as an enclosure to this entry.

    Tested in DNN 3.2 and DNN 4.0

    ServerVariables.zip (6.5 KB)

    Saturday, May 20, 2006 2:33:13 PM (US Eastern Standard Time, UTC-05:00)  #       |   |  ServerVariables.zip (6.5 KB)
     Friday, May 19, 2006

       The following Class can be used to export a dataset to XLS format. This code has been tested with Office 2002 and XP:

       Public Class DataSetToExcel
            Public Shared Sub Export(ByVal ds As DataSet, ByVal response As HttpResponse)
                'need to clear the response object
                response.Clear()
                response.Charset = ""
                'set the response type to excel
                response.ContentType = "application/vnd.ms-excel"
                'create a string writer anf HTMLTextWriter that uses it
                Dim StringWrite As New System.IO.StringWriter
                Dim HTMLWrite As New System.Web.UI.HtmlTextWriter(StringWrite)
                'instantiate a datagrid
                Dim dg As New DataGrid
                'set the datagrid datasource to the dataset passed in and bind it
                dg.DataSource = ds.Tables(0)
                dg.DataBind()
                'tell the datagrid to render itself to our htmltextwriter
                dg.RenderControl(HTMLWrite)
                'output the html
                response.Write(StringWrite.ToString)
                response.End()
            End Sub
        End Class

    Friday, May 19, 2006 6:40:01 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Monday, May 15, 2006

    I always forget the syntax for resetting identity columns. For example, recently on a development DNN installation, we needed to reset all identity columns back to 0 after data testing was complete. So, as a reminder to myself, here's the SQL:

    DBCC CHECKIDENT (TableName, RESEED, 0)

    If for some reason you need to temporarily allow inserts into the Identity column, then you can use the following:

    Set Identity_Insert TableName On

    Once you have executed your statements, you can turn it back off:

    Set Identity_Insert TableName Off

    And for the differences of Scope_Identity and @@Identity: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sa-ses_6n8p.asp

    Monday, May 15, 2006 9:51:36 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Friday, April 28, 2006

    Below you will find a few generic SQL queries for generating reports on DNN Users.

    Last Activity:
    SELECT     Users.Username, Users.FirstName, Users.LastName, aspnet_Users.LastActivityDate
    FROM         aspnet_Users INNER JOIN
                          Users ON aspnet_Users.UserName = Users.Username
    order by aspnet_Users.LastActivityDate DESC

    Last Login:
    SELECT   Users.Username, Users.FirstName, Users.LastName, aspnet_Membership.LastLoginDate
    FROM         Users INNER JOIN
                          aspnet_Users ON Users.Username = aspnet_Users.UserName INNER JOIN
                          aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId
    ORDER BY aspnet_Membership.LastLoginDate DESC

    New Users:
    SELECT   Users.Username, Users.FirstName, Users.LastName, aspnet_Membership.CreateDate
    FROM         Users INNER JOIN
                          aspnet_Users ON Users.Username = aspnet_Users.UserName INNER JOIN
                          aspnet_Membership ON aspnet_Users.UserId = aspnet_Membership.UserId
    ORDER BY aspnet_Membership.CreateDate DESC

    Unverified Users:
    select USers.FirstName, Users.LastName, aspnet_Membership.Email, aspnet_Users.UserName from aspnet_Membership, aspnet_Users, Users where aspnet_Membership.IsApproved = 0 AND aspnet_Membership.UserID = aspnet_Users.UserId AND aspnet_Users.UserName = Users.UserName

    Users in Role:
    SELECT Roles.RoleName AS [Role Name], COUNT(UserRoles.RoleID) AS [Number in Role] FROM Roles INNER JOIN UserRoles ON UserRoles.RoleID = Roles.RoleID GROUP BY UserRoles.RoleID, Roles.RoleName ORDER BY RoleName

    Friday, April 28, 2006 3:38:37 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Saturday, April 15, 2006

    We needed a Proper Case Function that would change the first letter of each word to an uppercase letter.

    Example:

    some text = Some Text

    Here is the function we added:

    ------------------------------------------------------

    CREATE FUNCTION dbo.Proper (@tcString VARCHAR(100))

    RETURNS VARCHAR(100) AS

    BEGIN

    -- Scratch variables used for processing

    DECLARE @outputString VARCHAR(100)

    DECLARE @stringLength INT

    DECLARE @loopCounter INT

    DECLARE @charAtPos VARCHAR(1)

    DECLARE @wordStart INT

    -- If the incoming string is NULL, return an error

    IF (@tcString IS NULL)

    RETURN ('(no string passed)')

    -- Initialize the scratch variables

    SET @outputString = ''

    SET @stringLength = LEN (@tcString)

    SET @loopCounter = 1

    SET @wordStart = 1

    -- Loop over the string

    WHILE (@loopCounter <= @stringLength)

    BEGIN

    -- Get the single character off the string

    SET @charAtPos = SUBSTRING (@tcString, @loopCounter, 1)

    -- If we are the start of a word, uppercase the character

    -- and reset the work indicator

    IF (@wordStart = 1)

    BEGIN

    SET @charAtPos = UPPER (@charAtPos)

    SET @wordStart = 0

    END

    -- If we encounter a white space, indicate that we

    -- are about to start a word

    IF (@charAtPos = ' ')

    SET @wordStart = 1

    -- Form the output string

    SET @outputString = @outputString + @charAtPos

    SET @loopCounter = @loopCounter + 1

    END

    -- Return the final output

    RETURN (@outputString)

    END

    ------------------------------------------------------

    I am not sure where I found this function to give it the proper credit, but it's been around for a while. I had used it on a SQL Server 2000 database to change all uppercase US State names to lowercase, then running them through the Proper function. Recently I had to search several databases to find the function so I could use it on a SQL Server 2005 database. So, in case I need it again, I decided to save it here....

    Saturday, April 15, 2006 9:59:31 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Thursday, April 13, 2006

    We are working on a project that required unique email addresses during DotNetNuke registration. In order to satisfy this requirements, the web.config file can be updated to enforce unique emal addresses by changing the default of false to true for the requiresUniqueEmail attribute.

    <membership

    defaultProvider="DNNSQLMembershipProvider"

    userIsOnlineTimeWindow="15">

    <providers>

    <clear/>

    <add

    name="DNNSQLMembershipProvider"

    type="DotNetNuke.Security.Membership.DNNSQLMembershipProvider, DotNetNuke.Provider.SQLMembershipProvider"

    connectionStringName="SiteSqlServer"

    enablePasswordRetrieval="true"

    enablePasswordReset="true"

    requiresQuestionAndAnswer="false"

    minRequiredPasswordLength="4"

    minRequiredNonalphanumericCharacters="0"

    requiresUniqueEmail="true"

    passwordFormat="Encrypted"

    applicationName="/"

    description="Stores and retrieves membership data from the local Microsoft SQL Server database"/>

    </providers>

    </membership>

    I would like to thank Richard Golko from UCanUse for this helpful tidbit...and yes, it does work with their User Attributes module!

    Thursday, April 13, 2006 10:56:12 AM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Friday, March 17, 2006


    We have been waiting on the DotNetNuke 4.0.3 release in hopes that it will cleanup a few of the random application error messages we have been seeing in DNN 4.0.2 sites. DNN 4.0.2 has been quite buggy and we have been holding off releasing any high traffic sites on production until more issues have been fixed. So, when I found out today that DNN 4.0.3 was released on SourceForge, I immediately downloaded it and installed on my local instance.

    Upgrading DotNetNuke

    Current Assembly Version: 04.00.03

    Current Database Version: 04.00.02

    Upgrade Status Report

    00:00:00.078 - Upgrading to Version: 4.0.3
    00:00:11.640 - Performing General Upgrades
    00:00:12.156 - Installing Module File D:\Dev\DNN\Website\Install\Module\Announcements_3.1_Install.zip:
    00:00:12.843 - Installing Module File D:\Dev\DNN\Website\Install\Module\Contacts_3.1_Install.zip:
    00:00:13.109 - Installing Module File D:\Dev\DNN\Website\Install\Module\Discussions_3.1_Install.zip:
    00:00:13.250 - Installing Module File D:\Dev\DNN\Website\Install\Module\Documents_3.1_Install.zip:
    00:00:13.421 - Installing Module File D:\Dev\DNN\Website\Install\Module\Events_3.1_Install.zip:
    00:00:13.625 - Installing Module File D:\Dev\DNN\Website\Install\Module\FAQs_3.1_Install.zip:
    00:00:13.796 - Installing Module File D:\Dev\DNN\Website\Install\Module\Feedback_3.1_Install.zip:
    00:00:13.906 - Installing Module File D:\Dev\DNN\Website\Install\Module\HTML_3.1_Install.zip:
    00:00:14.140 - Installing Module File D:\Dev\DNN\Website\Install\Module\IFrame_3.1_Install.zip:
    00:00:14.250 - Installing Module File D:\Dev\DNN\Website\Install\Module\Image_3.1_Install.zip:
    00:00:14.343 - Installing Module File D:\Dev\DNN\Website\Install\Module\Links_3.1_Install.zip:
    00:00:14.515 - Installing Module File D:\Dev\DNN\Website\Install\Module\NewsFeeds_3.1_Install.zip:
    00:00:14.640 - Installing Module File D:\Dev\DNN\Website\Install\Module\Survey_3.1_Install.zip:
    00:00:14.843 - Installing Module File D:\Dev\DNN\Website\Install\Module\UserDefinedTable_3.1_Install.zip:
    00:00:15.109 - Installing Module File D:\Dev\DNN\Website\Install\Module\UsersOnline_3.1_Install.zip:
    00:00:15.375 - Installing Module File D:\Dev\DNN\Website\Install\Module\XML_3.1_Install.zip:

    Upgrade Complete

    Click Here To Access Your Portal


    Yay! No errors. I did a little testing, and after checking to make sure nothing was really broken, I went ahead an made copies of all DNN 4.0.2 sites we have running and backed up their databases. So far I have installed DNN 4.0.3 on 5 different DNN instances, and on 3 different servers.  All well so far. I will post any problems I find here...

    Update:
    I noticed there is not an annoucement on the DotNetNuke website...yet. But, the Install, Source, and Templates are available for download at the SourceForge link above.

    Friday, March 17, 2006 12:48:00 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Monday, March 13, 2006

    2 issues have been fixed in the latest release of the Venexus SignIn module, an alternative DotNetNuke Login module that enforces Terms of Use agreement.

    Password Reminder and Register buttons are both working now.

    ABOUT VENEXUS SIGNIN MODULE

    The Venexus SignIn module is an alternative for the DotNetNuke Login module, that enforces the user to agree to the Terms and Conditions of the website. A use case would be for legal and financial websites that want the user to agree to the Terms of Use for the website, to satisfy legal and/or SEC requirements.

    Example:

    Venexus Signin Module - DotNetNuke Login that enforces Terms of Use

    Registered users can download this module for free by downloading the enclosure to this feed, clicking the link at the bottom of this post, or signing into Venexus and going to this page. The DNN 3 version is also available for download at the site.

     

    Monday, March 13, 2006 10:33:35 AM (US Eastern Standard Time, UTC-05:00)  #       |   |  Venexus_Signin.zip (13.48 KB)
     Sunday, March 12, 2006

    The "Remember Me" functionality during DotNetNuke 4 login works for only 1 hour by default. Previously, this had been set to 50 years. In order to change persistent login to an extended time, a change to the web.config file is necessary. In the web.config you should see this:

    <authentication mode="Forms">
          <forms name=".DOTNETNUKE" protection="All" timeout="60"/>
    </authentication>

    To increase the period of persistent login to 7 days would be this:

    <authentication mode="Forms">
          <forms name=".DOTNETNUKE" protection="All" timeout="10080"/>
    </authentication>

    To increase the period of persistent login to 1 Year would be this:

    <authentication mode="Forms">
          <forms name=".DOTNETNUKE" protection="All" timeout="
    525600
    "/>
    </authentication>

    Hope that helps!

    Sunday, March 12, 2006 1:07:26 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Friday, March 10, 2006


    Nothing To Install At This Time

    Current Assembly Version: 04.00.02

    Current Database Version: 04.00.02

     

    If you get the "Nothing to Install At This Time" message when accessing your DotNetNuke 4 portal, you can add the following line to the appSettings in the web.config file:

    <add key="InstallationDate" value="3/9/2005" />

    Friday, March 10, 2006 11:45:17 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Tuesday, February 28, 2006

    We are looking for beta testers for a DotNetNuke module that allows users to set/update their Active Directory password. The module has been tested in DNN 3.1.13 and DNN 4.0.2.

    Module Settings:

     

    Module View:

    If anyone has a DotNetNuke development environment, with Active Directory in use, and is interested in testing this module, please let us know by sending an email to support@venexus.com

    Tuesday, February 28, 2006 12:49:19 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Saturday, February 25, 2006

    For a project we are working on, we have a backend process that needed to get the PostalCode from ASPNET_Profile for a UserName. Thanks to David Silverlights post on DotNetSlackers.com we added the following functions to our database:

     --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    CREATE FUNCTION dbo.fn_GetElement
    (
    @ord AS INT,
    @str AS VARCHAR(8000),
    @delim AS VARCHAR(1) )
    RETURNS INT
    AS
    BEGIN
      -- If input is invalid, return null.
      IF  @str IS NULL
          OR LEN(@str) = 0
          OR @ord IS NULL
          OR @ord < 1
          -- @ord > [is the] expression that calculates the number of elements.
          OR @ord > LEN(@str) - LEN(REPLACE(@str, @delim, '')) + 1
        RETURN NULL
      DECLARE @pos AS INT, @curord AS INT
      SELECT @pos = 1, @curord = 1
      -- Find next element's start position and increment index.
      WHILE @curord < @ord
        SELECT
          @pos    = CHARINDEX(@delim, @str, @pos) + 1,
          @curord = @curord + 1
      RETURN    CAST(SUBSTRING(@str, @pos, CHARINDEX(@delim, @str + @delim, @pos) - @pos) AS INT)
    END

     --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    CREATE FUNCTION dbo.fn_GetProfileElement
    (
    @fieldName AS NVARCHAR(100),
    @fields AS NVARCHAR(4000),
    @values AS NVARCHAR(4000))
    RETURNS NVARCHAR(4000)
    AS
    BEGIN

      -- If input is invalid, return null.
      IF  @fieldName IS NULL
          OR LEN(@fieldName) = 0
          OR @fields IS NULL
          OR LEN(@fields) = 0
          OR @values IS NULL
          OR LEN(@values) = 0
        RETURN NULL

    -- locate FieldName in Fields
    DECLARE @fieldNameToken AS NVARCHAR(20)
    DECLARE @fieldNameStart AS INTEGER, @valueStart AS INTEGER, @valueLength AS INTEGER

    -- Only handle string type fields (:S:)
    SET @fieldNameStart = CHARINDEX(@fieldName + ':S',@Fields,0)

    -- If field is not found, return null
    IF @fieldNameStart = 0 RETURN NULL
    SET @fieldNameStart = @fieldNameStart + LEN(@fieldName) + 3

    -- Get the field token which I've defined as the start of the field offset to the end of the length
    SET @fieldNameToken = SUBSTRING(@Fields,@fieldNameStart,LEN(@Fields)-@fieldNameStart)

    -- Get the values for the offset and length
    SET @valueStart = dbo.fn_getelement(1,@fieldNameToken,':')
    SET @valueLength = dbo.fn_getelement(2,@fieldNameToken,':')

    -- Check for sane values, 0 length means the profile item was stored, just no data
    IF @valueLength = 0 RETURN ''

    -- Return the string
    RETURN SUBSTRING(@values, @valueStart+1, @valueLength)
    END

     --!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Then a stored procedure was created to retrieve the users PostalCode by passing in the UserName.

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE GetPostalCodeFromUserName
     @UserName nvarchar(50)
    AS
    BEGIN
     SET NOCOUNT ON;

     SELECT dbo.fn_GetProfileElement(N'PostalCode', dbo.aspnet_Profile.PropertyNames, dbo.aspnet_Profile.PropertyValuesString) AS PostalCode FROM dbo.aspnet_Profile INNER JOIN dbo.aspnet_Users ON dbo.aspnet_Profile.UserId = dbo.aspnet_Users.UserId where dbo.aspnet_Users.UserName = @UserName

    END
    GO

    Saturday, February 25, 2006 7:36:06 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Friday, February 17, 2006

    We are gathering requirements for the initial release of DNN FIND, a DotNetNuke search module. There are 2 pieces to this project, the crawler/spider and the fulltext indexing based search module. Currently the crawler/spider is a standalone multi-threaded VB.Net application that we are considering embedding inside of a DotNetNuke module and scheduled service (Host > Schedule). However for large sites, it may be critical for performance to crawl from a seperate server. Also, full text indexing is not included in SQL Server 2005 Express. To get an idea about the website environment of users in the community, we are running a survey to gather requirements for the initial release.

    We are considering the following options:

    1. DNN FIND Lite Version: a free DotNetNuke module that utilizes web services to query for results and limited to 250 pages indexed.
    2. DNN FIND Standard Version: a DotNetNuke Module that untilizes web services to query for results and limited to 1000 pages indexed.
    3. DNN FIND Pro Version: a DotNetNuke Module that utilizes a scheduled crawler/spider embedded in DotNetNuke to use collected data for local full text indexing and search. Limited to 5000 pages.
    4. DNN FIND Enterprise Version: A crawler/spider standalone application and a DNN module for querying the fulltext index for the largest of websites. Unlimited pages.

    To see an example of our "global search" in development, based on full text indexing, please see the DNN FIND website and/or Find News. Find News now has almost 900,000 articles/pages it its full text index.

    So, if you are interested in a DotNetNuke search module for your site, please answer the web environment questions we have in the following: Release Requirements Survey.

    If you are interested in beta testing, please let us know by completing the form on the Spider page.

    Friday, February 17, 2006 7:27:02 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Friday, February 10, 2006

    Have you built a DotNetNuke site and now want to move DNN to production? Or, are you simply moving a DotNetNuke website from one server to some other server? Over the last month I have seen several searches in the logs from people trying to find instructions on moving a DotNetNuke website from development to production, or simply from one server to another. After looking around for similar detailed instructions, I really did not see anything out there that really explained how to setup a IIS box for DotNetNuke, optimized and ready for production. So, I decided to provide instructions on how we do it…

    The following instructions are provided to minimize any downtime of the production domain/website, assuming there is an existing website running. However, the same instructions can be applied for a brand new domain/website that does not have a critical execution plan. These instructions will have a basic assumption that you understand how to manage IIS, DNS, and DNN. While we do not provide any guarantees to your particular setup, the following has worked well for us, managing the release of many DotNetNuke websites from our development environment to our production environment, while allowing continued development during the process.

    DNS and Subdomains

    First, we need to create subdomains. For this example, we will use dev.domain.com and prod.domain.com. Assuming the development environment you are currently working on is using just localhost, adding a subdomain for dev.domain.com may not be neccessary, but provides an easy way to work with multiple domains and projects. Point DNS for dev subdomain to the IP address of your development box and point the prod subdomain to your production box IP. Leave, www.domain.com pointing to where ever you have it pointing currently, but turn your TTLs down to 5 seconds. If this is a new website, you may already be pointing www.domain.com to your dev box, you can leave it there for now. For those who do not know what DNS is, see How Stuff Works.

    We use the service of DNS Made Easy. Hands down, this is the best business decision we have made concerning management of DNS. While their site is unfortunately not a DNN site, it provides the interface to get the job done quickly and easily. We use their Business Membership plan that allows us to turn down our domain TTLs to 5 seconds. They offer 100% uptime and have servers globally to handle DNS request. They also provide services for MX backup (your domain will still receive emails, even if your email server is down) and site monitoring (pings your site to ensure it is up, sends notification if down). We have never had a problem, they have excellent support, and great prices for their services.

    Once you have the new subdomains created, make sure they are working by pinging from the server(s) or use something like DNS Stuff. If you cannot ping, make sure your firewall is setup correctly to accept and route HTTP traffic to the correct server.

    If it’s working, then you are ready for the next step…

    The Development DNN Installation

    Login as Host and go to Host > Portals > Edit Portal > Portal Aliases > Add New HTTP Alias

    Add the following aliases, assuming localhost is the only one created:

    1.      domain.com

    2.      www.domain.com

    3.      dev.domain.com

    4.      prod.domain.com

    Copy the entire DNN folder on development box to the location on your production box where DNN will reside.

    SQL Server Database on Development and Production

    Go into Enterprise Manager or SQL Server Management Studio, development database server, and find your DotNetNuke database. Right click and go to Tasks > Detach. Clear the connections if you have to. Once the database has been successfully detached, go to the folder where the database files live (.mdf and .ldf files) and make a copy of your DotNetNuke database and transaction log. If you simply made a copy of the file in the same folder, you can now reattach the database (Tasks > Attach) so development can continue if other developers are working on your project, minimizing development downtime, plus have a backup of development database in case of unexpected issues. If you have a very small database, it may not be an issue just to copy and paste the files to the production server, assuming you are on the same network. However, our “development DNN database” is almost 3 Gb and takes a minute to move over to our production box. So, however you decide to do it, copy the .mdf and .ldf file to production database server. Rename them if necessary and Attach the database similar to the way you detached. Refresh database view if necessary and ensure the database is accessible. If you want to create a custom SQL Server login on production for security reasons, now is the time to do it.

    IIS on Production Box

    Create a new website in IIS. Map the website to the DNN folder you created on Prod. For the initial host header, use prod.domain.com.

    **Note** DNN Documentation show creating Virtual Directories. We have had great success with configuring and managing DNN websites as actual websites, instead of virtual directories and would recommend this route for anyone who is planning on running this in a production environment to reap the benefits of IIS, especially IIS 6 and performance as discussed further down…

    If this site is NOT replacing an existing and running domain/website, go ahead and add domain.com and www.domain.com host headers from Website Properties > Web Site Tab > Web site identification > Advanced Button. If you use internal IP addresses (Firewall routes the HTTP traffic), make sure you have the right IP addresses and port specified. By default HTTP traffic runs on port 80.

    If this is a DNN 4 install, make sure you change ASP.Net version to 2.0 from the ASP.NET tab in Web site propoerties.

    For performance enhancements, and as a necessity if you are running both ASP.NET 1.1 AND ASP.NET 2.0 websites, create a new application pool for the website and a web garden as described in the following entry on IIS 6 Horticulture.

    Production DNN folder

    Within Windows Explorer, go to your production DNN folder, right-click and select Properties > Security and make sure Network Service has the proper permissions. Now, modify the web.config’s database connection string(s) (2 of them for DNN 4) to the production database server and production database. If you created new SQL Server accounts for access, you will want to update the id and pass as well.

    Testing it out…

    First, open up a command prompt and make sure you can ping prod.domain.com and dev.domain.com. You should get the production IP address for prod.domain.com and the development server IP address for dev.domain.com. Now try to navigate to prod.domain.com in a web browser. If you get a successful page load, you now can do your testing to ensure everything is there and working. Since you created a subdomain for dev.domain.com, you can do your development as needed, test, and when ready, move to production. Periodic replication of the database from Production to Development allows you to keep a development environment that closely resembles your production environment. If you have tested everything and are sure the prod.domain.com is working correctly, you are ready to go live…

    Going Live with DotNetNuke 4

    Okay, so you have tested and are confident that the site is ready for primetime. First, go ahead and change your DNS settings to point domain.com traffic to the production server IP address. With IIS Manager open, stop the old website if one was running and add www.domain.com and domain.com to the host headers to the new website if necessary. Try www.domain.com and it should work. You now have a live DNN site. Assuming all went well, you can turn your TTLs back up in DNS for better caching.

    Updates to this post

    I hope you have found this useful. If you have any suggestions, please write a comment and share your experiences. I will try to keep this entry updated if I come across any other tips or updates and eventually may even get around to adding some pictures for futher help. Stay tuned!

    Friday, February 10, 2006 7:21:00 PM (US Eastern Standard Time, UTC-05:00)  #       | 
     Thursday, February 09, 2006

    We had to create a DotNetNuke module that would enforce that the user agrees to the Terms and Conditions of the website before being able to login, to satisfy a legal and SEC requirement for a financial company's client portoflio access. The module has been in use on the site for over 9 months now and we recently upgraded it to support DotNetNuke 4.x.

    The Venexus SignIn module is free for download. As a "filecasting" test, I will be including the DNN 4 version of this module as an enclosure to this entry. It will be interesting to see how RSS/ATOM news readers interpret the enclosure. More on this later... To download the DNN 3 or 4 version, if you are not reading this by a news reader, create an account on the Venexus website and go here. Registered users will be able to download.

    To use the module, backup your DNN installation and install as you would any other module. Drop the Venexus SignIn module on a page and go to the Settings. You can specify your custom, or existing Terms of Use page within Edit Terms and Conditions Settings.

    Currently the sourcecode is not available until we have time to write some comments. If you have any suggestions for future releases feel free to comment here and we might get around to adding them ;-)

    Thursday, February 09, 2006 4:39:35 PM (US Eastern Standard Time, UTC-05:00)  #       |  Venexus_Signin.zip (12.45 KB)
     Monday, February 06, 2006

    I noticed something new that I have not seen in previous versions of DotNetNuke...both, web.config and siteurls.config are backed up to the Config directory. With each change, a folder labeled "Backup_YYYYMMDDTT" is created and a copy of the original files are placed within. I am assuming this is the cached version that gets backed up during the application restart. I have always been careful and made a copy of the web.config file before making the change, but it is nice to know that there is another copy stored in the Config folder just in case. If anyone has any information about how this process works, I would be interested in knowing more details. Please share!

    Monday, February 06, 2006 9:25:06 AM (US Eastern Standard Time, UTC-05:00)  #       | 
     Sunday, February 05, 2006

    A lot of DotNetNuke developers/webmasters forget the importance of traffic derived from their blogs or RSS feeds. Any seach engine optimization plan should include submitting links to  popular blog/news feed directories.

    For those who are unaware, you can enable syndication within several DotNetNuke modules. For example, in the Text/HTML module Settings > Page Settings > Basic Settings is Allow Syndicate checkbox. If this is enabled, a XML icon will appear on the rendered page.

    There are also many DotNetNuke modules that provide RSS feeds for syndication. A couple of my favorite modules are Orizonti's NukeNews and Scott Schecter's NukeSyndicate. Both of these modules provide a RSS feed for consumption. NukeSyndicate allow for posting audio and video files, know as podcast and vodcast...more on this later ;-)

    Recently I spent a few hours submitting this blog to many directories. Most of the links below do not require reciprocal links, but in order to satisfy those who do and to provide a resource for others, here is the list I submitted our RSS feed to:

    Blog Flux Directory
    Blogarama - The Blogs Directory

    Blogfuse Blog Directory
    blog search directory
    Blogs for
    Small Businesses
    Internet Blog Top Sites
    Blog-Watch - The Blog Directory
    Chordata
    Complete RSS
    Easy RSS
    Every Feed
    Feed-Directory
    Feeds Farm
    Feedster
    Webfeed (RSS/ATOM/RDF) registered at http://www.feeds4all.nl
    Feedzie

    Findory

        Find News!
    Fyber Search
    GoBig Network
    IceRocket

    Jordo Media
    News XS
    Newzfire
    Nooked
    Plazoo
    PubSub
    Press Radar 
    Read A Blog
    Redtram

    RSS Feeds
    RSS Network
    SynBlog.com - Blog Directory
    Yahoo! RSS

    If you have any other suggestions, please do tell! Check back for updates....

    Sunday, February 05, 2006 5:44:44 PM (US Eastern Standard Time, UTC-05:00)  #       |   | 
     Tuesday, January 31, 2006