Tuesday, September 05, 2006
by Nik Kalyani
Tuesday, September 05, 2006 5:58:55 AM (Pacific Standard Time, UTC-08:00)

DotNetNuke forums user odontech has posted an excellent collection of DNN-related links which I am reproducing here:

 

DotNetNuke Factoid

Community

· A community of over 300,000 members

· [link] Within the top 25 Open Source Projects at SourceForge.net (by Page Views)

 

Performance

Scalability

· [link] Web Farm Support

· High Traffic Reference Sites

· [link] DotNetNuke itself handles ~ 15 million pageviews daily

· [link] Georgia Institute of Technology > 10 million pageviews daily

· [link] WildVoice.com > 6 million pageviews daily

· [link] Transperth > 6 million pageviews daily

· [link] National Rugby League > 4 million pageviews daily

· [link] South Australian Central > 4 million pageviews daily

· [link] Vinum Canada ~ 1 million pageviews daily

· [link] University of Texas El Paso ~ 1 million pageviews daily


Security

· Public Registration
Allows the general public to sign up for accounts.

o [link] CAPTCHA
Prevents people from writing programs to create accounts.

· [link] Security Groups
Allows site users to be placed into groups.

o Group Settings

§ Auto Assignment
Automatically assigns new users into the role.

§ Public Role
Allows users to subscribe/unsubscribe into different roles.

§ Private Role
Prevents users from changing their assignmment to a role.

· Page Level Security

o Allows security settings on a page level basis

§ Ability to View Page

§ Ability to Edit Page

· Module Level Security

o Allows security settings to be set on modules placed on pages

§ Ability to View Module

§ Ability to Edit Module

§ (Custom settings available on a per module basis)

Skins

· [link] Over 70 skins listed on Salaro

· [link] Over 500 skins listed on SnowCovered

Modules

· Over 30 Core Modules

o [link] Account LogIn

o [link] [project page] Announcements

o [project page] Blog

o [link] Banner

o [project page] Chat

o [link] [project page] Contacts

o [link] Discussion

o [link] [project page] Documents

o [link] [project page] Events List / Calendar

o [link] [project page] FAQs

o [link] [project page] Feedback

o [project page] Forum

o [project page] Gallery

o [project page] Help

o [link] [project page] IFrame

o [link] Image

o [link] [project page] Links

o [project page] Map

o [project page] Media

o [link] [project page] News Feed (RSS)

o [project page] Reports

o [project page] Repository

o [project page] Store

o [link] [project page] Search

o [link] [project page] Survey

o [link] [project page]Text/HTML

o [link] User Accounts

o [link] [project page] User Defined Table

o [project page] Users Online

o [project page] Wiki

o [link] [project page] XML/XSL

· Community Developed

o [link] Over 100 modules listed on DotNetNuke

o [link] Over 700 modules listed on SnowCovered

Localized

· [link] [project page] DNN Supports multiple languages (currently 25 user submitted language packs)

Books - Five books have been published on DotNetNuke

· [link] Professional DotNetNuke 4: Open Source Web Application Framework for ASP.NET 2.0

· [link] Professional DotNetNuke ASP.NET Portals

· [link] Beginning DotNetNuke 4.0 Website Creation in C# 2005 with Visual Web Developer 2005 Express: From Novice to Professional

· [link] DotNetNuke For Dummies

· [link] Building Websites with VB.NET and DotNetNuke 3.0

Magazines / Media

· Microsoft published a 2 part webcast on DNN 4.0 (March 17, 2006)

o [part1] Overview and What's New

o [part2] Running on ASP.NET 2.0

· Microsoft published a 6 part webcast on DNN (Jan 10 – Jan 31, 2006)

o [part1] Overview and Installation of DotNetNuke

o [part2] Working with Modules in DotNetNuke

o [part3] Programming Your Own DotNetNuke Module Using Visual Basic .NET

o [part4] Using Security Features in DotNetNuke

o [part5] Creating Skins for Your DotNetNuke Portal

o [part6] DotNetNuke Architecture and Wrap-up

· DotNet Developers Journal ran a 4 part series on DNN (Dec 2005 – Feb 2006)

o [part1] An Introduction to the DotNetNuke Application Framework (Nov 2005)

o [part2] Managing an Open Source Project for DotNetNuke (Dec 2005)

o [part3] When Design and Development First Met (Jan 2006)

o [part4] Rapid Module Development for DotNetNuke (Feb 2006)

· [link] CNet published article (July 11, 2005)

· [link] EWeek published article (April18, 2005)

· [link] Visual Studio Magazine published article (Sept 30, 2003)

#    Comments [0] - Trackback    

by Nik Kalyani
Tuesday, September 05, 2006 5:25:52 AM (Pacific Standard Time, UTC-08:00)

Joe Brinkman made an excellent post today (Repaving in a Virtual World) about the painful experience of dealing with the crapware most computer manufacturers force on us and the odyssey of re-installing software.

About six months ago, I got fed-up with the cycle and decided to end it once and for all by switching entirely to virtual machines (Virtual PC). Now, I am a convert. There is just no going back.

I upgrade my primary notebook approximately every 6-8 months. I will go from a HP Pavilion zd8000 to a Dell M90 later this month, and for once, I don't have the mixture of excitement about the new hardware, and dread about getting the environment just right. I'll copy the virtual machines over and be up and running in the time it takes the bits to cross the wire to their new home.

As Joe mentions in his post, I have multiple "theme-based" virtual machines:

  • Biz - for Office apps, email, blogging etc. (10Gb disk, 400Mb memory) 
  • Dev (multiple) - one standad dev VM for my business, and a couple for some other businesses I collaborate with. (16Gb disk, 768Mb memory)
  • Test (multiple) -  these are throwaway VM's. I use them sometimes only for a couple of hours and then delete them. (4Gb disk, 256Mb memory)
  • Media - for personal photos, music, videos etc. before I transfer them to my 2.5Tb media jukebox (10Gb disk, 384Mb memory)

At any given time I will have a combination of Biz-Dev-Test or Biz-Media or Biz-Test-Test running. Since the aggregate memory never exceeds 1500Mb, I never experience any problems. On the host, I do have Skype and my WinTV app running. These don't consume many resources and since I turned off just about every other non-essential service on the host, there is very little memory/CPU usage too. (Bonus: Incredibly fast boot time for host.)

It took a little getting used to this setup at first, but I think in the process VMs have helped me deal with another problem -- attention deficit. By setting up each VM to be specific to one general area, I have forced myself to be more disciplined in approaching tasks, especially development. Instead of bouncing between windows on multiple projects, I now focus on getting to a stopping point so I can switch to a different VM. I have all the VM's configured to have "My Documents" point to a shared folder on the host, so sharing docs is not a problem. I have not yet figured out the exact rules for when the clipboard works and when it doesn't between host-VM and VM-VM, but it is not a huge issue.

The key to excellent VM performance I found, was regular defragging. I run Raxco's Perfect Disk and the Invirtus VM Optimizer regularly on my VMs. It's like hitting a performance boost button -- things are just snappy after running these guys.

Another suggestion for saving time and effort is to get the base VMs right the first time. When I need to create a new VM, the only thing I need to do is copy the settings and disk files for the VM, edit the reference in the setting file to point to the new disk and once the VM is running, rename the computer. I figured that getting the VM right would save me countless headaches until the next major software upgrade cycle, so I invested a day in getting my base VMs just right. That investment has obviously paid off.

#    Comments [2] - Trackback    

 Sunday, September 03, 2006
by Nik Kalyani
Sunday, September 03, 2006 7:57:34 PM (Pacific Standard Time, UTC-08:00)

Yesterday, my mailbox contained a package that I was eagerly awaiting - Syllable v0.6.0a. Syllable is an open source Operating System that has been around for some time, but is now steadily picking up steam. I like it because it has the simplicity, polish and a lot of the functionality of the now defunct BeOS. I have been wanting to check it out for some time now, but have been too lazy to setup a dedicated box for it. Since it does not play nice with Virtual PC (my preferred desktop virtualization app) it was either setup a box or install VMWare. I chose the latter. My first impression of VMWare was not very favorable, but that's a topic for another post. To save some time, I downloaded one of the many pre-installed Syllable VMWare machines and gave it a go first, before installing it off the CD.

Even though I had read about how fast Syllable is, I was not prepared for what I experienced. From the time I started the virtual machine to the time I was staring at a login prompt, the elapsed time was 8 seconds. The complete desktop was rendered 2 seconds after I logged in.

Syllable-small

I tried the web browser ABrowse and was pleasantly surprised that it worked right away. I was able to surf the web and connect to a number of sites. There are compatibility issues, likely because the product is not yet finished, but the performance was pretty decent.

I also tried changing the appearance and playing with the various preference apps. All seemed to work, some better than others.

I ran out of time and could not continue to test Syllable, but will report back occasionally as and when I have a chance to experiment more with it. For now, my conclusion is that this is a fantastic OS. It has a way to go before it is ready for prime time, but it looks very promising. This is one to watch.

#    Comments [0] - Trackback    

by Nik Kalyani
Sunday, September 03, 2006 4:33:43 PM (Pacific Standard Time, UTC-08:00)

Several of you tried the tip in Speeding-up DNN Module Development and emailed to report that this does work, but on occasion, the assemblies in the private assembly folder are locked during development. I did some testing to find the cause and a solution.

Background: Assemblies in the "bin" folder are automatically shadow copied to a different folder before the ASP.net process loads them. This allows the files in the "bin" folder to be replaced without causing any locking issues. According to this article even assemblies specified in AppDomainSetup.PrivateBinPath are shadow copied. Of course, this raised the question -- does PrivateBinPath get initialized from the web.config <probing> element.

My curiosity piqued, I did some testing to find the answer. The test is simple enough -- delete the existing shadow copy folder for an app (typically in C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Temporary ASP.NET Files\{appname}); setup <probing> with a private path and move some assemblies there; run the app. Assemblies that are shadow copied will then show up in a sub-directory of this folder. In my test, the files from the <probing> path were not shadow copied (i.e. AppDomainSetup.PrivateBinPath is not initialized from <probing> element). But does this explain why the assemblies are locked sometimes? Not completely.

Typically, garbage collection is able to determine if an assembly should be unloaded if there are no more references to its contents. You can ensure that the unload attempt happens right away with GC.Collect(). However, if references to the assembly exist, then GC will not unload the assembly, and since there is no shadow copy, the result is a locked file. If you are recompiling in VS.Net and the file is still locked, it may indicate that there is a problem with your code ... i.e. something has a reference to "something" in your assembly after the ASP.Net page execution is complete. Or, it may not be your code, but VS.Net that has locked the assembly.

I tested with several assemblies that were being used on the page, but were not in the bin folder. Even though these assemblies were not shadow copied, I did not have a problem with them being locked (i.e. an attempt to delete or rename the file works). I could compile/debug etc. with no problem. I suppose it's only a matter of time before I encounter this issue. Is this one of those VS.Net quirks?

Bottom line, there is no quick fix. The "iisreset" command will take care of the locked DLL problem, but then it re-creates the problem that keeping the assemblies in the folder was trying to solve in the first place (i.e. app restart delay). If it does not happen too often, then keeping a command window open and typing iisreset may be the simplest fix (for now).

Working through this problem, I had a thought. What if DNN were to manage the assembly loading and unloading for modules? This would not only allow assemblies to be placed in their respective module folders, but would also solve the problem of DNN DLL-Hell. During development, it would also solve the problem of assemblies being locked as the assembly shadow copying could be enabled when the assembly is loaded on-the-fly.

I don't know the answer, but it's an experiment I'll add to my To-Do list.

#    Comments [1] - Trackback    

 Monday, August 28, 2006
by Nik Kalyani
Monday, August 28, 2006 5:36:32 AM (Pacific Standard Time, UTC-08:00)

Testing an implementation of the DNN ISearchable interface implementation for a module can be time-consuming and slow if you rely on the DNN search engine indexer to run and then either check the database for results or use the Search UI. There is a simpler way.

Copy and paste the below script into DNNSearch.aspx (or grab the attachment at the end of this post), place the file in the root folder of your app and you can test ISearchable for any module instance with ease. The script requires you to provide a TabId and a ModuleId. It then queries the database for the BusinessController defined in the DesktopModules table and instantiates it exactly as the DNN search indexer does. It then calls GetSearchItems() and displays the results.

Unlike the DNN search indexer, DNNSearch does not make any changes to the database. It is useful only for testing if the ISearchable implementation is working correctly and does not provide any insights into any issues that the search index provider you are using may have.

 

DNNSearch.aspx

<%@ Import namespace="DotNetNuke.Entities.Modules" %>
<%@ Import namespace="DotNetNuke.Services.Search" %>
<%@ Import namespace="DotNetNuke.Common" %>
<%@ Page Language="c#" AutoEventWireup="false" %>
<script runat="server">
 
    void Results_Click(object sender, EventArgs e)
    {
        int moduleId = -1;
        try
        {
            moduleId = Convert.ToInt32(ModuleId.Text);
        }
        catch
        {
        }
 
        int tabId = -1;
        try
        {
            tabId = Convert.ToInt32(TabId.Text);
        }
        catch
        {
        }
 
        if ((moduleId > -1) && (tabId > -1))
            GetSearchResults(moduleId, tabId);
        else
            SearchResults.Text = "Both Module ID and Tab ID are required";
    }
 
    void GetSearchResults(int moduleId, int tabId)
    {
        ModuleController moduleController = new ModuleController();
        ModuleInfo moduleInfo = moduleController.GetModule(moduleId, tabId);
        StringBuilder sb = new StringBuilder();
 
        if (moduleInfo == null) 
        {
            SearchResults.Text = "No module found with ModuleID=" + moduleId.ToString() + " and TabID=" + tabId.ToString();
            return;
        }
 
        if (moduleInfo.BusinessControllerClass == "")
            SearchResults.Text = "The BusinessControllerClass in the database is blank.";
        else
        {
            try
            {
                object bizController = DotNetNuke.Framework.Reflection.CreateObject(moduleInfo.BusinessControllerClass, moduleInfo.BusinessControllerClass);
                if (bizController == null)
                    SearchResults.Text = "The Business Controller Class <b>" + moduleInfo.BusinessControllerClass + "</b> could not be instantiated.";
                else
                {    
                    SearchContentModuleInfo contentInfo = new SearchContentModuleInfo();
                    contentInfo.ModControllerType = (ISearchable) bizController;
                    contentInfo.ModInfo = moduleInfo;
                    SearchItemInfoCollection results = contentInfo.ModControllerType.GetSearchItems(contentInfo.ModInfo);
                    if (results != null)
                    {
                        int counter = 0;
                        foreach(SearchItemInfo searchItem in results)
                        {
                    if (moduleInfo.ModuleID == searchItem.ModuleId)
                    {
                        sb.Append("<p>Title: " + searchItem.Title);
                        sb.Append("<br>GUID: " + searchItem.GUID);
                        sb.Append("<br>Date: " + searchItem.PubDate.ToLongDateString());
                        sb.Append("<br>Description: " + searchItem.Description + "</p>");
                    }
                    counter++;
                        }
                        SearchResults.Text = counter.ToString() + " results found.<br>" + sb.ToString();
                    }
                    else
                        SearchResults.Text = "No search results.";
                }
            }
            catch(Exception e)
            {
                SearchResults.Text = "Error: " + e.Message + "<br><br>" + e.StackTrace;
            }
        }
    }
 
    override protected void OnInit(EventArgs e)
    {
        Results.Click += new EventHandler(Results_Click);
        base.OnInit(e);
    }
 
</script>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
    <HEAD>
        <title>Speerio ISearchable Test</title>
        <style>
              body, p {font-family: Verdana; font-size: 9pt}
        </style>
    </HEAD>
    <body>
        <p><font size="4">DNNSearch Script - by <a href="http://www.speerio.net">Speerio, Inc.</a></p>
        <p><font color="red" size="4">WARNING: Do not leave this script installed on a production system.</font></p>
        <form id="Form1" method="post" runat="server">
            <p>Tab ID: <asp:TextBox ID="TabId" Runat="server"></asp:TextBox></p>
            <p>Module ID: <asp:TextBox ID="ModuleId" Runat="server"></asp:TextBox></p>
            <asp:Button ID="Results" Runat="server" Text="Get Search Results" /></p>
            <p>To test for user-specific results, add code to GetSearchItems() to check for userid=N in querystring.</p>
            <p><b>Search Results:</b></p>
            <asp:Label ID="SearchResults" Runat="server" />
        </form>
    </body>
</HTML>

DNNSearch.zip (1.48 KB)

#    Comments [2] - Trackback    

RSS feed
Search and Links
Bling

View Nik Kalyani's profile on LinkedIn

Contact me: nik*kalyani.com (replace "*")

TechBubble
www.flickr.com
This is a Flickr badge showing public photos from techbubble. Make your own badge here.
Statistics
Total Posts: 204
This Year: 22
This Month: 0
This Week: 0
Comments: 231
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2008
Nik Kalyani
Sign In
All Content © 2008, Nik Kalyani