Muralidharan's profileMurali@B'lorePhotosBlogLists Tools Help

Blog


    March 19

    100 best software development blogs in the world

    Few informations are worth mentioning:

    • As usual, this list is a weighed average of multiple rankings: Google page rank, Alexa rank, Technorati rank, Google hits, average number of comments, and Twitter rank.
    • Only blogs dealing with (some) generic software engineering topics are allowed. This requirement resulted in the removal of three blogs from this edition: Paul Graham (no software development topics), Rough Type (no software development topics) and PragDave (posts are only about Ruby).
    • I also removed a couple of blogs that didn't have any fresh content (= less than three months old, or anything later than November 2008).
    • There are 19 new entries on this list. Some of them did not participate in the last edition, because nobody had told me about them at the time, which accounts for some very high new entries.
    • The most remarkable change in this edition is Signal vs. Noise, moving from #67 to #5, which is largely due to their Google page rank having been upgraded from 4 to 7 since last time. Quite an achievement!
    • Some other great performers in this edition are: Regular Geek, Mike Cohn, James Bach, Software by Rob, and Agile Software Development. I congratulate them all!
    • Unlike last time, I did not include FeedRank in the calculations. The FeedRank statistics turned out to be more erratic than Alan Greenspan's economical predictions. So I discarded them.
    • However, unlike last time, I now included Twitter rank in the calculations. Micro-blogging is a logical extension of the activities of many bloggers. Therefore their performance in micro-blogging is now part of the overall blog ranks.
    • You can click the names in the Author/Twitter column to find and follow blog authors on Twitter.
    • If you want to be included on this list, then send me an email and make sure you earn high ratings on Google, Alexa, Technorati and Twitter. Please note that I only track blogs with a Google page rank of at least 3. (And there are just three blogs with page rank 3 on the top 100 list. All others have page rank 4 or higher.)
    • There is an OPML file available if you want to import the complete top 100 list (+25 extra) into your feed reader.
    • There is also a spreadsheet available with 200 blogs, incuding the individual rankings on Google, Technorati, Alexa, and Twitter.

    Here is the full list. Enjoy...

    TT LT Blog / Site Author / Twitter
    1 1 Joel on Software Joel Spolsky
    2 3 Coding Horror Jeff Atwood
    3 6 Martin Fowler's Bliki Martin Fowler
    4 11 The Daily WTF (various)
    5 67 Signal vs. Noise (various)
    6 5 Scott Hanselman's Computer Zen Scott Hanselman
    7 10 Rands in Repose Michael Lopp
    8 7 Bokardo: Social Design Joshua Porter
    9 8 Stevey's Blog Rants Steve Yegge
    10 19 Stack Overflow Jeff Atwood
    11 12 Eric.Weblog() Eric Sink
    12 9 Lambda the Ultimate (various)
    13 13 Raible Designs Matt Raible
    14 14 Dare Obasanjo aka Carnage4Life Dare Obasanjo
    15 17 Jon Udell Jon Udell
    16 15 UIE Brain Sparks Jared Spool
    17 23 ThoughtBlogs (various)
    18 27 CodeBetter.Com (various)
    19 25 High Scalability (various)
    20 28 Object Mentor Blog (various)
    21 41 Regular Geek Rob Diana
    22 21 Otaku, Cedric's Weblog Cedric
    23 47 Mike Cohn's Blog: Succeeding with Agile Mike Cohn
    24 37 NOOP.NL Jurgen Appelo
    25 18 The Berkun Blog Scott Berkun
    26 38 Good coders code, great reuse Peteris Krumins
    27 61 James Bach’s Blog James Bach
    28 20 Artima Weblogs (various)
    29 33 Google Testing Blog (various)
    30 22 J.D. Meier's Blog J.D. Meier
    31 -- Alex Payne Alex Payne
    32 26 10x Software Development Steve McConnell
    33 29 secretGeek Leon Bambrick
    34 -- Business of Software Blog Neil Davidson
    35 -- Contrast | The Blog (various)
    36 34 Enterprise Architecture: From Incite comes Insight... James McGovern
    37 43 Project Shrink Bas de Baar
    38 45 StevenHarman.net Steven Harman
    39 24 Shanine.com / omar / Omar Shahine
    40 66 Software by Rob Rob Walling
    41 57 Agile Testing Grig Gheorghiu
    42 36 Alistair Cockburn Alistair Cockburn
    43 77 Agile Software Development (various)
    44 56 Tyner Blain Scott Sehlhorst
    45 44 Interoperability Happens Ted Neward
    46 48 Pure Danger Tech Alex Miller
    47 39 Managing Product Development Johanna Rothman
    48 64 Elegant Code (various)
    49 58 Coding the Architecture (various)
    50 -- Ted Leung on the Air Ted Leung
    51 -- Relevance Blog (various)
    52 49 Reforming Project Management Hal Macomber
    53 46 James Shore: The Art of Agile James Shore
    54 59 Knowing.NET Larry O'Brien
    55 -- Blankenthoughts Jeff Blankenburg
    56 79 David Chelimsky David Chelimsky
    57 82 Aligning Technology, Strategy, People & Projects Eric Brown
    58 40 It's Just a Bunch of Stuff That Happens Eric Burke
    59 30 Dr. Dobb's CodeTalk (various)
    60 50 Better Projects Craig Brown
    61 75 Lean Software Engineering Corey Ladas
    62 51 {Codesqueeze} Max Pool
    63 68 /\ndy Andy Hunt
    64 69 All About Agile Kelly Waters
    65 72 Herding Cats Glen Alleman
    66 97 Exploration Through Example Brian Marick
    67 42 Object Technology Jeff Sutherland
    68 55 Implementing Scrum Mike Vizdos
    69 52 Agile Management Blog David Anderson
    70 96 Bit-Player Brian Hayes
    71 -- The Mendicant Bug Jason Adams
    72 -- Software Project Management Pawel Brodzinski
    73 -- A Software Insiders Point of View R "Ray" Wang
    74 71 Meme Agora Neal Ford
    75 85 Word Aligned Thomas Guest
    76 84 Chris Spagnuolo's EdgeHopper Chris Spagnuolo
    77 65 Evolving Web Jim Benson
    78 53 The Braidy Tester Micahel
    79 -- Tester Tested! Pradeep Soundararajan
    80 86 The Cutter Blog (various)
    81 74 Jeffrey Palermo (.com) Jeffrey Palermo
    82 93 Test Obsessed Elisabeth Hendrickson
    83 -- averyBlog James Avery
    84 -- GrokCode Jess
    85 -- Wide Awake Developers Michael Nygard
    86 -- Notes from a Tool User Mark Levison
    87 60 Petzold Book Blog Charles Petzold
    88 87 Agile Developer Venkat's Blog Venkat Subramaniam
    89 95 Creative Chaos Matthew Heusser
    90 -- Moserware Jeff Moser
    91 -- Codemonkeyism Stephan Schmidt
    92 88 Collaborative Software Testing Jonathan Kohl
    93 90 Jeff Patton's Holistic Product Design & Development Jeff Patton
    94 32 Curious Cat John Hunter
    95 -- Yourdon Report Ed Yourdon
    96 81 LeadingAnswers Mike Griffiths
    97 99 Silk and Spinach Kevin Rutherford
    98 -- Lazycoder Scott Koon
    99 92 Clarke Ching - More Chilli Please Clarke Ching
    100 -- Raven's Brain Raven Young

    Legend
    TT
    = Position this time
    LT
    = Position last time
    --
    = New entry on the list
    $$
    = This author bribed me

    You can find a full description of how this top 100 was calculated here: How to Make a Top Blog List.

    October 08

    Chat with me!

     
    September 17

    Imp. e-books

    June 04

    Profiling your .NET code

    Profiling gathers information about an executing application, allowing you to determine those improvements that are required in your application.
    Ten reasons why you should bother profiling your .NET code
    1) Focus on portions of your .NET code that really require attention
    2) Identify code blocks with performance issues
    3) Compare alternative approaches
    4) Get accurate code execution response times
    5) Avoid guessing performance issues
    6) Visualize performance and memory usage
    7) Track the lifecycle of your .NET objects
    8) Avoid unnecessary loading or initialization of your program
    9) Optimize your looping constructs in .NET
    10) Identify memory leaks in your application

    How to profile your .NET code?

    • CLR Profiler
    • Using PerfMon
    May 24

    Problem opening report solution: Project item '#itemn°#' does not represent a file.

    Today I had some problems with a report solution created in Visual Studio 2005:
    After I got the latest version out of SourceSafe, I could not open it anymore. The error message was "Project item '4294967294' does not represent a file."
    Searching for this error on the internet I came to this solution:

    - Open the .rptproj file in notepad (or another text editor) and delete the line that begins with "<State>$base64$"

           Sometime in notepad you may not view complete data, so try to open in CMD -> Edit window.
    - Open the solution
    - Delete the source control bindings
    - Add it to source control again
    - Done!

    May 20

    Visual studio 2005 Asp.net Issue

    Yesterday I got this error message while running Asp.net application in Visual studio 2005

    ---------------------------
    ASP.NET Development Server
    ---------------------------
    ASP.NET Development Server failed to start listening on port 1085.
    Error message:
    An attempt was made to access a socket in a way forbidden by its access permissions
    ---------------------------
    OK  
    ---------------------------

    By default the web application uses ASP.NET development server not the IIS. We
    can change it to IIS by selecting Project Properties->Web Tab. There we can
    create the virtual directory too.
    The error must be specifying some port. I try to use some tools like TcpView from
    Sysinternals (http://www.sysinternals.com/Utilities/TcpView.html) to check that
    port is used by some other process. Normally development server will take the
    free port while running the application.

    image

    May 03

    SQLSERVER

    Following query will display stored procedure content through Query.

        SELECT ROUTINE_DEFINITION
        FROM INFORMATION_SCHEMA.ROUTINES
        WHERE ROUTINE_NAME='SPLocationGetByID' AND ROUTINE_TYPE='PROCEDURE';

    Good to read basic of SQL Join at

    http://en.wikipedia.org/wiki/Join_(SQL)#Inner_join

    May 01

    Call Webservice with parameter from VBScript

    Following vbscript snippet call web service with parameter.

     

    Dim oXMLDoc, oXMLHTTP
    Sub btnclick
    Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.4.0")
    Set oXMLDoc = CreateObject("MSXML2.DOMDocument")
    Msgbox("Calling WebService To Approve Leave")
    oXMLHTTP.onreadystatechange = getRef("HandleStateChange")

    Dim strEnvelope

    strEnvelope = "userId=1"
    call oXMLHTTP.open("POST","
    http://localhost/MerchantServerWS/MCService.asmx/GetName",true)
    call oXMLHTTP.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    'call oXMLHTTP.setRequestHeader("SOAPAction","
    http://localhost/MerchantServerWS/MCService.asmx?wsdl")

    call oXMLHTTP.send(strEnvelope)
    End Sub
    Sub HandleStateChange
    if(oXMLHTTP.readyState = 4) then
    dim szResponse: szResponse = oXMLHTTP.responseText
    call oXMLDoc.loadXML(szResponse)
    if(oXMLDoc.parseError.errorCode <> 0) then
    call msgbox("ERROR")
    call msgbox(oXMLHTTP.responseText)
    call msgbox(oXMLDoc.parseError.reason)
    else
    call msgbox( oXMLDoc.getElementsByTagName("string")(0).childNodes(0).text)
    end if
    end if
    End Sub

    May 25

    Find string from stored procedure (Sql Server)

     
     
    declare
    @search varchar(50)
    SET
    @search = '%systemparameter%'
    SELECT
    ROUTINE_NAME
    ,
    ROUTINE_DEFINITION
    FROM
    INFORMATION_SCHEMA
    .ROUTINES
    WHERE
    ROUTINE_DEFINITION
    LIKE @search
    ORDER
    BY ROUTINE_NAME
     
     
    May 24

    Get value of Querystring using Javascript

    var tabvalue = getQueryVariable("tab");


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

    function getQueryVariable(variable)
    {
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++)
    {
    var pair = vars[i].split("=");
    if (pair[0] == variable)
    {
    return pair[1];
    }
    }
    }
    May 14

    Debug Java Script

    I know all of us struggle when we are working in javascripts.
    Many of us will use alert box to debug the javascripts.
    But microsoft provides a debugging features in its VS products.
    unfortunately none of us use this facility. use this facility and
    enjoy working with JS wiht out any stess.

    for that u need to do a single word
    -------------------------------------------------

    simply put the word 'debugger' inside ur JS thats all, now u can enjoy
    the debugging facility.
    u can enjoy how u put breakpoints in cs debugging, the same u can use
    here too.

     eg)

    <script language="javascript">
    function SendAttach()
    {
    debugger
    ---
    ---
    ---

    }

    Note :
    ---------

    Kindly ensure the disable script debugging checkbox remains unchecked.

    To do
    --------
    IE--> Tools-->InternetOptions -->Advanced --> uncheck Disable Script
    Debugging (Internet Explorer)
    IE--> Tools-->InternetOptions -->Advanced --> uncheck Disable Script
    Debugging (Otheres)

    April 05

    Google Paper

    Gmail Paper

    Everyone loves Gmail. But not everyone loves email, or the digital era. What ever happened to stamps, filing cabinets, and the mailman? Well, you asked for it, and it’s here.

    March 26

    Sudhakar's Interview (Audio)

     

    Sudhakar Gorti is a co-founder and CEO of Proteans Software Solutions, an outsourcing company based in Bangalore that focuses on product development using Microsoft technologies like .NET. In this interview, Sudhakar talks about opportunities in outsourced software product development and how his company created a niche in this segment.

     
     
     
    February 22

    MY NAME

    What Muralidharan Means
    M is for Mysterious

    U is for Unusual

    R is for Remarkable

    A is for Amorous

    L is for Logical

    I is for Intelligent

    D is for Darling

    H is for Honorable

    A is for Alluring

    R is for Rebellious

    A is for Amazing

    N is for Neat
     
    February 02

    Some Differences between ClickOnce and Windows Installer (MSI)

    Some Differences between ClickOnce and Windows Installer (MSI)

      ClickOnce Windows Installer (MSI)
    Prerequisites ClickOnce requires that version 2.0 of the .NET framework is already installed on the target machine. You can use an old-fashioned bootstrapper exe to ensure this.
    If your application requires runtime packages such as MDAC, MSDE etc. on the target computer again you must use a bootstrapper exe to install them. This cannot be achieved with ClickOnce.
    The MSI runtime is required on the target computer. You can use a bootstrapper exe to install it. The current Windows versions already include the MSI runtime.
    If your application requires runtime packages such as MDAC, MSDE etc. on the target computer, it's often a good idea to use a bootstrapper exe to install them, although in some cases it's possible to install them using a custom action inside your MSI setup.
    User input Installing an application via ClickOnce requires two clicks: a click on a hyperlink to launch the install, and clicking Yes on the confirmation dialog. The rest of the UI is a progress bar. There is no way to collect input from the user. Any personalization has to be done inside the application, e.g. on first run. Typically displays a wizard sequence where users can enter a user name and serial number, select features and installation directory, etc. If you run a MSI setup in BasicUI mode you get a user experience that's somewhat similar to ClickOnce.
    Per-user and per-machine installations ClickOnce installations are always for the current user only. Per-machine installations are impossible. If multiple users on a machine install the same software you end up with multiple copies of your application files. You can specify per-user installations and per-machine installations that are available to all users on the system.
    Installation directory You application files will always be copied to the My Applications folder under the user's My Documents folder. You can specify the installation directory for your application files at design time or at run time.
    Shortcuts A shortcut to your application will be placed in the Start menu under Programs > Your Company Name. This is not customizable. You cannot create shortcuts on the desktop. You can create as many shortcuts as you need in any place you wish, including the Start menu and the desktop.
    Target computer modifications Besides copying the application files and creating a Start menu shortcut ClickOnce installations cannot modify the target computer. Can create and modify files, registry entries etc. on the target computer, only limited by access permissions set by the administrator.
    Application isolation ClickOnce applications are isolated from each other and the operating system. A ClickOnce setup cannot damage the target computer. Replacing system files and modifying registry entries can cause all sorts of problems on the target computer ("DLL Hell").
    Update installation ClickOnce can automatically detect when a newer version of your application is available and download and install the update.
    Only the modified files are downloaded, but always complete files, not parts of files.
    Detecting available updates requires additional tools, this is not built into MSI.
    Patches can include either modified files in whole, or only the changed parts of a file (binary difference) which may result in a smaller download.
    Manageability ClickOnce applications (and updates) are published simply by posting them on the web or file server. There is no method to push them to clients during off work hours and there are no inventory or other management functions built in. MSI packages work nicely with management and deployment tools such as Active Directory and SMS.

     

    December 29

    Design Pattern

    Past few days, concentrating more on design patterens. here are some of the important notes from what i learn.

    Design patterns are recurring solutions to software design problems you find again and again in real-world application development. Patterns are about design and interaction of objects, as well as providing a communication platform concerning elegant, reusable solutions to commonly encountered programming challenges.

    The Gang of Four (GoF) patterns are generally considered the foundation for all other patterns. They are categorized in three groups: Creational, Structural, and Behavioral. Here you will find information on these important patterns.

    Creational Patterns
    Abstract Factory - Creates an instance of several families of classes
    Builder - Separates object construction from its representation
    Factory Method - Creates an instance of several derived classes
    Prototype - A fully initialized instance to be copied or cloned
    Singleton - A class of which only a single instance can exist

    Structural Patterns
    Adapter - Match interfaces of different classes
    Bridge - Separates an object's interface from its implementation
    Composite - A tree structure of simple and composite objects
    Decorator - Add responsibilities to objects dynamically
    Facade - A single class that represents an entire subsystem
    Flyweight - A fine-grained instance used for efficient sharing
    Proxy - An object representing another object

    Behavioral Patterns
    Chain of Resp.- A way of passing a request between a chain of objects
    Command - Encapsulate a command request as an object
    Interpreter - A way to include language elements in a program
    Iterator - Sequentially access the elements of a collection
    Mediator - Defines simplified communication between classes
    Memento - Capture and restore an object's internal state
    Observer - A way of notifying change to a number of classes
    State - Alter an object's behavior when its state changes
    Strategy - Encapsulates an algorithm inside a class
    Template Method - Defer the exact steps of an algorithm to a subclass
    Visitor - Defines a new operation to a class without change

    Remove Nulls from Datatable

    The individual cells in a DataTable can have a null value in the form of System.DbNull.Value. If the DataTable is created by querying a database through ADO.NET, you can write the SQL statement in a way eliminates nulls. It could look like this “SELECT isnull(name, 'n/a') AS name FROM products”.

    However, there can be scenarios where you don’t have the chance to manipulate the DataTable before you use it. Such a scenario have I recently been involved in and the problem was that the data retrieved from a database could contain nulls in any of the integer type columns. If I then bind the DataTable to a GridView in ASP.NET, I had to do a lot of workarounds to calculate footers and other values based on those columns.

    Instead of doing the workarounds in a lot of different places in the code, I decided it was a better idea to clean the DataTable for nulls before it is used. That led to the CleanDataTable method below, that replaces null values with zeros for a few integer type columns.

    /// <summary>

    /// In the case of null values in a data table, this method

    /// will turn all nulls into zeros instead.

    /// </summary>

    public static DataTable CleanDataTable(DataTable dt)

    {

    for (int a = 0; a < dt.Rows.Count; a++)

    {

    for (int i = 0; i < dt.Columns.Count; i++)

    {

    if (dt.Rows[a][i] == DBNull.Value)

    {

    Type type = dt.Columns[i].DataType;

    if (type == typeof(int) || type == typeof(float) || type == typeof(double))

    {

    dt.Columns[i].ReadOnly = false;

    dt.Rows[a][i] = 0.0F;

    }

    }

    }

    }

    return dt;

    }

    The point is that you only have to clean it once to avoid any workaround for handling null values.

    December 07

    Customize your place holder in Open / Save Dialog box

    Q. How can I hide the Places bar in Widows XP's and Windows 2000's Open
    and Save common dialog boxes?

    A. The Open and Save common dialog boxes display a bar along the left- hand
    side with quick links to the following default locations:
       * History
       * My Documents
       * Desktop
       * Favorites
       * My Network Places

    You can hide this bar by performing the following steps:
       1. Start a registry editor (e.g., regedit.exe).
       2. Navigate to the
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\co
    mdlg32 subkey. (If this subkey doesn't exist, select New, Key from the
    Edit menu to create it.)
       3. From the Edit menu, select New, DWORD Value.
       4. Enter a name of

       NoPlacesBar

    and press Enter.
       5. Double-click the new value, set it to 1, and click OK.
       6. Close the registry editor.

    The registry change will take effect immediately. To enable the Places
    bar again, either delete the NoPlacesBar registry value or set it to 0.
    This change will not affect applications within the Microsoft Office
    suite but will affect applications, such as Notepad and Microsoft
    Paint, that use the Open and Save common dialog boxes.

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

    Q. How can I edit the default Places bar quick links in Windows XP's
    and Windows 2000's Open and Save common dialog boxes?

    A. You can modify the five default quick links in the Open and Save
    common dialog boxes by performing the following steps:
       1. Start a registry editor (e.g., regedit.exe).
       2. Navigate to the
    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\co
    mdlg32 subkey. (If this subkey doesn't exist, select New, Key from the
    Edit menu to create it.)
       3. From the Edit menu, select New, Key.
       4. Enter a name of

       Placesbar

    and press Enter.
       5. Navigate to the new registry subkey. You can create five entries
    (i.e., Place0, Place1, Place2, Place3, and Place4). Make each entry
    either a string value (REG_SZ) entry (for a named folder) or a DWORD
    value (REG_DWORD) entry (for a special folder, such as My Documents or
    My Network Places).
       6. To create a new entry, go to the Edit menu, select New, DWORD
    Value or New, String Value (as appropriate), enter a name of Placen
    (e.g., Place0, Place4), and press Enter.
       7. Double-click the entry and set its REG_SZ "Value data" to a path
    and folder name or its REG_DWORD "Value data" to a numeric ID (the
    table below shows a partial list of these numeric IDs--the shlobj.h
    file, which is part of the platform software development kit (SDK),
    defines the full list of special numeric IDs).
       8. Close the registry editor.

    For example, the registry file below sets shortcuts to My Documents,
    the CD burning folder, and three named folders.

       Windows Registry Editor Version 5.00

       [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\
       Policies\comdlg32\Placesbar]
       "Place0"=dword:00000005
       "Place1"=dword:0000003b
       "Place2"="d:\\temp"
       "Place3"="d:\\documents"
       "Place4"="g:\\windows"

    This change will not affect applications within the Microsoft Office
    suite but will affect applications, such as Notepad and Microsoft
    Paint, that use the Open and Save common dialog boxes. Each new entry
    you add will replace one of the default quick links.

    ID    Pathway

    0     Desktop
    1     Internet Explorer
    2     Start Menu\Programs
    3     My Computer\Control Panel
    4     My Computer\Printers
    5     My Documents
    6     <user name>\Favorites
    7     Start Menu\Programs\Startup
    8     <user name>\Recent
    9     <user name>\SendTo
    a     <desktop>\Recycle Bin
    b     <user name>\Start Menu
    c     Logical "My Documents" desktop icon
    d     "My Music" folder
    e     "My Videos" folder
    10    <user name>\Desktop
    11    My Computer
    12    Network Neighborhood (My Network Places)
    13    <user name>\Nethood
    14    Windows\Fonts
    16    All Users\Start Menu
    17    All Users\Start Menu\Programs
    18    All Users\Startup
    19    All Users\Desktop
    1a    <user name>\Application Data
    1b    <user name>\PrintHood
    1c    <user name>\Local Settings\Application Data
          (nonroaming) 0x001d // nonlocalized startup
    1e    Nonlocalized common startup
    1f    Common favorites
    20    Internet cache
    21    Cookies
    22    History
    23    All Users\Application Data
    24    GetWindowsDirectory()
    25    GetSystemDirectory()
    26    C:\Program Files
    27    C:\Program Files\My Pictures
    28    USERPROFILE
    29    x86 system directory on RISC
    2a    x86 C:\Program Files on RISC
    2b    C:\Program Files\Common
    2c    x86 Program Files\Common on RISC
    2d    All Users\Templates
    2e    All Users\Documents
    2f    All Users\Start Menu\Programs\Administrative Tools
    30    <user name>\Start Menu\Programs\Administrative Tools
    31    Network and Dial-up Connections
    35    All Users\My Music
    36    All Users\My Pictures
    37    All Users\My Video
    38    Resource Directory
    39    Localized Resource Directory
    3a    All Users OEM-specific applications
    3b    USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
    November 13

    Encrypt & Decrypt XML using C# (2.0)

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Security;
    using System.Security.Cryptography;
    using System.Security.Cryptography.Xml;
    using System.Xml;
    namespace XmlEncryption
    {
        class Program
        {
            static void Main(string[] args)
            {
                EncryptionXML(); // Encryption
                DecryptionXML(); // Decryption
            }
            public static void DecryptionXML()
            {
                TripleDESCryptoServiceProvider sharedKey = new TripleDESCryptoServiceProvider();
                System.IO.StreamReader reader = new System.IO.StreamReader("sharedTDESkey.txt");
                Byte[] data = Convert.FromBase64String(reader.ReadToEnd());
                sharedKey.Key = data; //Assign the retrieved shared key value to the TripleDESCryptoServiceProvider object
                XmlDocument encryptedDoc = new XmlDocument();
                encryptedDoc.Load("encryptedorder.xml");
                XmlElement encryptedElement = (XmlElement) encryptedDoc.GetElementsByTagName("EncryptedData")[0];
                EncryptedData ed2 = new EncryptedData();
                ed2.LoadXml(encryptedElement); //Create an EncryptedData object and populate it.
                EncryptedXml exml2 = new EncryptedXml();
                Byte[] decryptedBilling = exml2.DecryptData(ed2, sharedKey); //  Decrypt the element using the shared key
                // Replace the encryptedData element with the plaintext XML element.
                exml2.ReplaceData(encryptedElement, decryptedBilling);
                encryptedDoc.Save("DecryptedOrder.xml");
            }
            public static void EncryptionXML()
            {
                XmlDocument xmldoc = new XmlDocument();
                try
                {
                    xmldoc.Load("order.xml");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }
                //Create a new TripleDES object, TripleDes will be the algorithm used to encrypt the XML data
                TripleDESCryptoServiceProvider sharedkey = new TripleDESCryptoServiceProvider();
                //Save this key to disk to enable the recipient to decrypt
                System.IO.StreamWriter writer2 = new System.IO.StreamWriter("SharedTDESKey.txt");
                String str = Convert.ToBase64String(sharedkey.Key);
                writer2.WriteLine(str);
                writer2.Close();
                //Create a new EncryptedXML object
                EncryptedXml exml = new EncryptedXml(xmldoc);
                //Select the Billing element to be encrypted
                XmlElement billingElem = (XmlElement)xmldoc.SelectSingleNode("/order");
                //Encrypt the billing element data using the TripleDES alogrithm, save the results into a byte array
                Byte[] encryptedBilling = exml.EncryptData(billingElem, sharedkey, false);
                //Create an EncryptedData object and populate it.
                EncryptedData ed = new EncryptedData();
                //Specify the namespace URI for XML encryption elements.
                ed.Type = EncryptedXml.XmlEncElementUrl;
                // Specify the namespace URI for the TrippleDES algorithm.
                ed.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncTripleDESUrl);
                //Create a CipherData element.
                ed.CipherData = new CipherData();
                //Set the CipherData element to the value of the encrypted XML element.
                ed.CipherData.CipherValue = encryptedBilling;
                // Replace the plaintext XML elemnt with an EncryptedData element.
                EncryptedXml.ReplaceElement(billingElem, ed, false);
                //Write the encrypted data to disk
                try
                {
                    xmldoc.Save("encryptedorder.xml");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }