Wednesday, July 14, 2010

Something is wrong !

You know something is wrong when even applications like Acrobat Reader require a restart to update themself!

Saturday, May 1, 2010

A simple class to read and write application settings

I'll come straight to the point. All I want to do is save a few setting for my little .NET application like

MaxSizeOfText=256.

Ok, that not all. I want each user to have his own settings. I can do this by storing such settings to a file in the user's appData folder.

Programming in the .NET world is usually pretty easy though a bit frustrating because at times it is painfully easy. There are also times when exisitng classes can get the work done but finding out how exaclty to use these classes is so darned unintuitive that its easier to write the functionality all by yourself.

I consider all classes present in the base-class-library revolving around reading / writing application configuration a big fiasco. There aren't many areas which are as confusing as this. With each version of .NET new ways to access appSettings keep cropping up. Come on, how difficult is to define an easy to understand programmatic access to some XML data? and if you can't do that why not just hide those classes from end developers, we are capable of writing our own.

Here is a class I quickly wrote which allows you to store application settings in a 'name'-'value' form in XML. The file can be located anywhere on your computer. It has just 3 menthods for interacting with it so it's very simple to use. Settings can be added without any special methods, setting can be read and setting can be removed. Minimum requirement, a target file should be present with atleast following xml:


Rest is taken care of by the class. I am sure there must be lots of improvement that can be made and I would appreciate any comments.

The class diagrams is presented below:

class diagram

Here is the complete code for the XmlSettings class:


// ++
// (C) Copyright Siddharth Barman, 2010.
// Copyright notice: You are free to use this material with or without the copyright notice.
// Author is not reponsible for any damage/problems arising out of the use of this material.
// --

using System.Xml;

namespace Sid.Utilities
{
    /// <summary>
    /// Allows reading and writing settings to XML files. The XML files should have
    /// the following structure <settings><setting name="ABC" value="XYZ" /></settings>
    /// </summary>
    public class XmlSettings
    {
        #region Public interface

        /// <summary>
        /// Path to the settings file. The file must exist.
        /// </summary>
        /// <param name="file"></param>
        public XmlSettings(string file)
        {
            this.file = file;
            doc = new XmlDocument();
            doc.Load(file);
        }

        /// <summary>
        /// Returns the settings file being used.
        /// </summary>
        public string SettingsFile
        {
            get { return file; }
        }

        /// <summary>
        /// Allows a setting to be read or written. Each setting is referred by it's name. 
        /// Null is returned if a setting does not exist while reading. 
        /// A new setting is created if it does not exist while writing.
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string this[string name]
        {
            get 
            {
                return ReadSetting(name);
            }
            set 
            {
                SetSetting(name, value);
            }
        }

        public void Remove(string name)
        {
            XmlNode node = GetSettingNode(name);

            if (node != null)
            {
                RootNode.RemoveChild(node);
            }
        }

        public void Save()
        {
            doc.Save(file);
        }

        #endregion

        #region Protected and Private members

        protected XmlNode RootNode
        {
            get
            {
                return doc.SelectSingleNode("/settings");
            }
        }

        protected string ReadSetting(string name)
        {
            XmlNode node = GetSettingNode(name);

            if (node == null || node.Attributes.Count == 0 || node.Attributes["value"] == null)
            {
                return null;
            }

            return node.Attributes["value"].Value;
        }

        protected void SetSetting(string name, string value)
        {
            XmlNode node = GetSettingNode(name);

            if (node == null)
            {
                node = CreateSettingNode(name);
            }

            node.Attributes["value"].Value = value;
        }

        protected XmlNode GetSettingNode(string name)
        {
            return doc.SelectSingleNode(string.Format("/settings/setting[@name='{0}']", name));
        }

        protected XmlNode CreateSettingNode(string name)
        {
            XmlNode node = doc.CreateNode(XmlNodeType.Element, "setting", string.Empty);
            RootNode.AppendChild(node);

            XmlAttribute nameAtt = doc.CreateAttribute("name");
            node.Attributes.Append(nameAtt);
            nameAtt.Value = name;

            XmlAttribute valueAtt = doc.CreateAttribute("value");
            node.Attributes.Append(valueAtt);

            return node;
        }

        protected string file;
        protected XmlDocument doc;

        #endregion
    }
}

Monday, February 22, 2010

Survival of the cheapest

Working as a software engineer, I have seen a few lay offs, mostly in the United States and the UK. Anyway, I'm working in India so I should be safe, right? Right?

No, a resounding No!

I used to work for a British company. I was sent to the UK to do knowledge-transfers so that the work could be done from India (Bangalore). Oh yes, 'you have been Bangalored'.

I met a lot of developers and project managers in the UK who were all really nice people and I was helping the company to get them (the developers and PMs in the UK) laid off and move the work to India.

I never did feel the need to ask if it was the right thing for a company to do.
But now, four years later, every time I hear a speech made by any CEO, I can't believe the amount of hypocrisy. Each CEO tries to brain-wash the employees into believing their tag-line. Things like, 'customer first', 'we do this better than anyone'. You also hear words like 'costs', 'competitive advantages' a lot. Beware, the moment such words start getting tossed around, its very likely that things are about to change ... and perhaps for you.

With China offering cheaper labor, Indian I.T. professionals should no longer think their jobs secure.

It isn't 'survival of the fittest', it's survival of the cheapest'.

Tuesday, December 22, 2009

Remove Nissan.exe trojan / NewsPaedia

If your browser keeps opening on its own with websites like thenewpaedia.com, it is quite likely that you have a trojan/backdoor program nissan.exe.

This exe resides in your recycle-bin. It makes entries in the system registry so it gets loaded everytime someone logs in. The exe remains in memory all the time and detects any registry modification on a key and writes back its own values.

First let's see where the exe resides. It probably resides in a path like "C:\RECYCLER\S-1-5-21-3028898713-0813311981-684376638-1852\nissan.exe".
Open a command-prompt,
C:\>
C:\>cd \
C:\>cd "Recycler"
C:\>dir /a hsr *.*
You should now see an entry for nissan.exe. This exe has to be removed. Right now, it will not be possible as this exe is already loaded in memory.

Now lets see where in the registry the entry exists for loading the exe:
Open regedit.exe
Navigate to "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon"
Here you should see an entry named 'Taskman' having a value like "C:\RECYCLER\S-1-5-21-3028898713-0813311981-684376638-1852\nissan.exe".
We need to somehow get this entry deleted.
We cannot delete it right now as the nissan.exe will detect the 'delete' and will immediately write back the value.

How to get rid of this:
1. Create a user on the system who is not an Administrator
2. Log off from any account which may have Admin rights.
3. Log in as a regular (non-admin user).
4. Navigate to Windows\System32 folder and do a RunAs->Administrator on
- Regedt32.exe
- Cmd.exe
- TaskMgr.exe
5. Switch to TaskMgr instance which you started in Step 4. Kill all instances of
Explorer.exe
6. Now switch to Regedit instance and search for Nissan.exe and remove all values where it shows up. Do a find for 'nissan.exe' a few times just to make sure.
7. Switch to command prompt instance and del all entries of nissan.exe by running
C:\>
C:\>cd \
C:\>cd "Recycler"
C:\>dir /a hsr *.*
This will display exactly where nissan.exe is for e.g.
"C:\RECYCLER\S-1-5-21-3028898713-0813311981-684376638-1852\nissan.exe".
Now to delete the entries:
C:\>attrib -hsr "C:\RECYCLER\S-1-5-21-3028898713-0813311981-684376638-1852\nissan.exe"
C:\>del "C:\RECYCLER\S-1-5-21-3028898713-0813311981-684376638-1852\nissan.exe"

Do a dir nissan.exe and check if you missed out any entry.
By now all entries which launch the exe should have been removed.

I have a suspicion that USB drives get affected and when such 'affected' drives auto-run, the system gets infected. I would therefore recommend that you disable AUTORUN on all drives. Follow the instructions in the link:
Disable autorun

Thursday, September 17, 2009

Download FULL SQL Express 2008

Here are the links where the full installer for SQL Express may be found:

http://www.microsoft.com/downloads/details.aspx?familyid=58CE885D-508B-45C8-9FD3-118EDD8E6FFF&displaylang=en

http://www.microsoft.com/downloads/details.aspx?familyid=08E52AC2-1D62-45F6-9A4A-4B76A8564A2B&displaylang=en

Tuesday, August 25, 2009

Installing Microsoft products really sucks

Installing Microsoft applications is a fu**ed-up experience.
Why can't they ever get them right?
Ever since the highly touted .NET framework made its appearance, installing anything coming out of Microsoft has become a royal pain.

Thought I'd install SQL Server 2008 developer edition and see the new features. What I am greeted with? A long long long download process from the Internet to get .NET 3.5 SP1. Man! why couldn't they package the offline version on the DVD?

Anyway, after the download is complete, the installation of .NET 3.5 SP1 itself took almost an hour. Why? It takes that much time to install Windows OS in the first place?

Ok, now at least I can select all the cool 'features' of SQL I want to install, I select almost everything and click the dreaded 'Next' button. Whay do I see? I am now told to install SP1 of Visual Studio first before installing SQL 2008 Man, that's the final straw. Is this the way to make software?

That's not all, go to the download page for .NET SP1 on Microsoft's site:
http://www.microsoft.com/downloads/details.aspx?FamilyID=ab99342f-5d1a-413d-8319-81da479ab0d7&displaylang=en

This is taken right from the page:
"IMPORTANT: After installing the .NET Framework 3.5 SP1 package (either the bootstrapper or the full package) you should immediately install the update KB959209 to address a set of known application compatibility issues.
In addition, on Windows Vista x64 and Windows Server 2008 x64, install the update KB967190
to address a file association issue for XPS documents."


HAHAHA! Installing SP1 itself requires installing another fix on it immediately! hehehe.. Don't ask if installing the fix requires you to install another something, I am too scared to go check.

Where have all the 'real' developers gone from Microsoft?