Saturday, November 27, 2010

NDepend :- Part II

Quite from some time I was thinking about using NDepend to check my code with the yardstick of standard metrics . I finally got free and started to dig , how I can use NDepend to catch loose points in the code ?  NDepend analysis is the process of capturing all the information from the code that can be used as a metrics for measuring and calculating the quality and stability of the code.

Metrics has always been used in other sciences as a measure of the property of some tangible element. But in software development process, where software as an outcome is considered intangible , applying metrics and deducting the meaning out of them has been subject to open discussion. But with advance in the process of software development , many standard and time tested metrics has been setup. NDepend is based on these standard metrics. Tool provides the way to capture the information and present us with the detailed report of all these metrics.

So to utilize the NDepend to its full potential , we have to look at two core component of NDepend , NDepend metrics and CQL. Starting with metrics,  NDepend provides the list of all the metrics it uses and also the values for metrics that should be considered as standard for good quality code (http://www.ndepend.com/Metrics.aspx ). NDepend's metrics page also provides some links to the patrick smacchia blogs at codebetter.com, that can helps us to understand the usefulness and relevance of the code metrics in relation to code analysis.  Some of the links that you might want to check out are :-

http://codebetter.com/blogs/patricksmacchia/archive/2007/10/05/why-is-it-useful-to-count-the-number-of-lines-of-code-loc.aspx

http://codebetter.com/blogs/patricksmacchia/archive/2008/02/15/code-metrics-on-coupling-dead-code-design-flaws-and-re-engineering.aspx

http://codebetter.com/blogs/patricksmacchia/archive/2008/03/07/a-simple-trick-to-code-better-and-to-increase-testability.aspx

After understanding one of key component of NDepend ,  NDepend’s metrics. We now can move forward to other core component CQL (Code Query Language). CQL is easy to use query language , used in NDepend .It is similar to SQL and we can easily write intuitive queries . CQL works on metrics and code structure of .Net application and fetches the result for the query. NDepend constraints are based on the CQL and checks for any violation.

CQL is one of my favourite feature of NDepend , as it is similar to SQL so it is easy for me or any developer to write queries against the .Net code structure and metrics. We can easily write a query to find out all the methods in particular namespace where the no of lines of code or IL code is greater than 250 and then can factor out these big methods in small ones .

Ex:-

WARN IF Count > 0 IN SELECT METHODS OUT OF NAMESPACES "MyNameSpace.GUI"  WHERE NbILInstructions > 200

CQL editor of NDepend provides intellisense for query writing and we can turn our CQL queries into constraints and check for any violation with successive builds.  To see the power of CQL and various samples,  you can check out this link:- 

http://www.ndepend.com/CQL.htm

NDepend also presents a visual layout of analysis as Dependency Graph and Dependency Matrix , we can use these visual tools to see entire picture of our codebase and its composition with perspective of metrics.

But with knowledge of software metrics and instrument as CQL we can explore and have control over the process of software development to achieve high quality code.

I am still new to NDepend and feeling like I have just discovered the tip of iceberg.

Tuesday, November 23, 2010

C.L.R :- .NET Debugging

If you ever get curious enough to know how .Net debugging works,  there is an excellent source of knowledge :-                     http://blogs.msdn.com/b/jmstall/.

I got curious and found excellent posts from the insider Mike Stall , one of previous team member of Microsoft Managed Debugging Team. My curiosity lead me to  unmanaged api ICorDebug  (COM api). Next I was in search of managed wrapper around the CorDebug.idl, my search lead me to Managed Stack Explorer, a command line managed debugging tool . You can get your hands on source code at  http://mse.codeplex.com/.  Once you get hold of code, you get all the managed wrappers (C#) around the COM api of ICorDebug . Wrappers are manually created using ComImport   attributes in C# , so you do not have to go through laborious process of creating each and every wrapper around classes, interfaces and structures.  Apart from manually created wrappers , you also get p-invoke methods from mscoree.dll within the source code:--

[DllImport("mscoree.dll", CharSet=CharSet.Unicode, PreserveSig=false)]
public static extern Debugger.Interop.CorDebug.ICorDebug CreateDebuggingInterfaceFromVersion(int debuggerVersion, string debuggeeVersion);

[DllImport("mscoree.dll", CharSet=CharSet.Unicode)]
public static extern int GetCORVersion([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder szName, Int32 cchBuffer, out Int32 dwLength);

These dll-import method gets the current ICorDebug version and creates the ICorDebug interface which is encapsulated within the ICorDebug managed wrappers.  You have to call Initialize() and SetManagedHandler()  on the ICorDebug managed wrapper , to initialize the ICorDebug interface and set the managed call-back interface for all the call-backs returned from the ICorDebug interface.  ICorDebugManagedCallback interface is also the wrapper around the com interface.

ICorDebug rawDebuggingAPI;
          rawDebuggingAPI = NativeMethods.CreateDebuggingInterfaceFromVersion((int)CorDebuggerVersion,debuggerVersion);

rawDebuggingAPI .Initialize ();
           rawDebuggingAPI .SetManagedHandler (new ManagedCallback(this));

When ever we want to start debugging, we create ICorDebug interface and spawn out a CorDebug process from the call to CreateProcess() method on ICorDebug interface providing the information of the debugee process .

ICorDebugProcess process = CorDebug.CreateProcess(
                            filename,   // lpApplicationName
                              // If we do not prepend " ",

                           " " + arguments,                       // lpCommandLine
                            ref secAttr,                       // lpProcessAttributes
                            ref secAttr,                      // lpThreadAttributes
                            1,//TRUE                    // bInheritHandles
                            0x00000010 /*CREATE_NEW_CONSOLE*/,    // dwCreationFlags
                            IntPtr.Zero,                       // lpEnvironment
                            workingDirectory,                       // lpCurrentDirectory
                            (uint)pprocessStartupInfo,        // lpStartupInfo
                            (uint)pprocessInfo,               // lpProcessInformation,
                            CorDebugCreateProcessFlags.DEBUG_NO_SPECIAL_OPTIONS   // debuggingFlags
                            );

or we can attach to existing process by calling DebugActiveProcess method on ICorDebug interface which returns the ICorDebugProcess.

m_debugger.DebugActiveProcess ((uint)processId, win32Attach ? 1 : 0, out proc);

Whatever method we choose to start debugee process under debugger , the call backs from the creation of debugee process are send to us via ICoreDebugManagedCallback. There are all kinds of call-backs related to debugging  that we get  (LoadAppDomian,  LoadModule, CreateProcess,  Breakpoint, StepComplete,EditAndContinue etc).  Using the call-backs we can keep track of all the ICorDebug elements for current session.

Call-back also includes notification for the creation of ICorDebugThread . We can keep the track of this thread and can utilize this com wrapper to get the hold of current stack frames. We can call EnumerateChains method on ICorDebugThread and loop through the ICorDebugChain element. ICorDebugChain represent the one segment of call stack for ICorDebugThread and consists of ICorDebugFrame collection. ICorDebugFrame is the stack frame for current call stack segment (ICorDebugChain). We can get the collection of stack frames by invoking the method EnumerateFrames on ICorDebugChain element.

 

uint corChainIndex = CorThread.EnumerateChains().GetCount();
                foreach(ICorDebugChain corChain in CorThread.EnumerateChains().GetEnumerator()) {
                    corChainIndex--;
                    uint corFrameIndex = corChain.EnumerateFrames().GetCount();
                    foreach(ICorDebugFrame corFrame in corChain.EnumerateFrames().GetEnumerator()) {
                        corFrameIndex--;
                  try {
                         ------------

                    } catch (COMException) {

                            continue;
                        };
                        yield return corFrame ;
                    }
                }

Once we get ICorDebugFrame from the ICorDebugChain, we get the method or function (ICorDebugFunction ) at that frame by calling GetFunction() on ICorDebugFrame element.

ICorDebugFunction func = corFrame .GetFunction();

Setting breakpoint on specified line number:--------------

From ICorDebugManagedCallBack we also get the notification of the current module through ICorDebugModule parameter from LoadModule call-back.  ICorDebugModule contains the method GetMetaDataInterface() for retrieving the IMetaDataImport interface which is the interface that provides the metadata information for the current ICorDebugModule . Having got the metadata interface next step is to create the CorSymBinder_SxSClass instance and cast it into ISymUnmanagedBinder interface. Now we can call the method GetReaderForFile that takes the path of pdb file for current module and metadata interface as parameters to return ISymUnmanagedReader. This method opens the pdb file and returns the ISymUnmanagedReader , which is responsible for reading the debugging symbols from the pdb file.

Guid guid = new Guid("{ 0x7dac8207, 0xd3ae, 0x4c75, { 0x9b, 0x67, 0x92, 0x80, 0x1a, 0x49, 0x7d, 0x44 } }");
  IMetaDataImport     metaData = (IMetaDataImport)pModule.GetMetaDataInterface(ref guid);

ISymUnmanagedBinder symBinder = new Debugger.Interop.CorSym.CorSymBinder_SxSClass();
  ISymUnmanagedReader reader   =  symBinder.GetReaderForFile(metaData, fullname, searchPath);

Now we can get ISymUnmanagedDocument collection from the ISymUnmanagedReader by calling GetDocuments method on ISymUnmanagedReader. ISymUnmanagedDocument is the document referenced by the pdb symbol store.

Through ISymUnmanagedDocument we can get the closest line to the sequencepoint , providing our line number for the function that we want to debug. Sequencepoints are the places that IL marks as the points that can be used for stopping and debugging purpose. We do so by invoking method FindClosestLine on ISymUnmanagedReader providing our line number.

FindClosestLine returns the closest line number to the relevant Sequencepoint in IL corresponding to our provided line  number. Using this line number we can get the function at this line number and all the sequence points for this function.

uint validLine = symDoc.FindClosestLine((uint)line);
  ISymUnmanagedMethod    symMethod = symReader.GetMethodFromDocumentPosition(symDoc, (uint)validLine, (uint)column);

SequencePoint[] seqPoints = symMethod.GetSequencePoints();

Now we can iterate through all the sequence points and get the ICorDebugFunction .

ICorDebugFunction func =  pModule.GetFunctionFromToken(symMethod.GetToken());

On this ICorDebugFunction we can place our breakpoint.

ICorDebugFunctionBreakpoint corBreakpoint = func .GetILCode().CreateBreakpoint((uint)ILStart);

ILStart parameter:- we get it through sequencepoint

int ILStart=(int)sqPoint.Offset;

Above code was taken by me  for study purpose from Managed Stack Explorer and SharpDevelop Debugging Addin  source code.

ICorDebug is feature rich debugging api, so it has numerous functionalities that I have yet to cover. Hope this blog will be useful.

Sunday, November 21, 2010

Android :- VOIP & SIP

Mostly we  use  PSTN (public switched telephone network) for making and receiving the voice calls and pay the call charges as per call plan.  But with the use of VOIP for mobile or mVOIP we can set up our own small  mVOIP (mobile voice over IP) network  and communicate with our group members  (pbxes.org) or can call anyone having VOIP enabled phone .  VOIP over mobile phone  is achieved  using different kind of protocols , but most popular SIP (session initiation protocol) is the most widely used standard. VOIP uses the SIP standard for signalling and controlling the voice or video over IP (Internet Protocol). 

SIP is peer-to-peer protocol so it requires very basic network over internet. VOIP converts the analog voice signals to digital , creates the data packets and transmits the packets over internet. SIP plays the role of signalling and controlling protocol for these data packets.

Like me if you have a droid and access to Wi-Fi ,  you can install a SIP client and make  voice / video  call using the Wi-Fi.   SIP client installed on phone makes the phone act as  SIP phone. SIP protocol needs the SIP clients , which are SIP network endpoints to communicate. As SIP is peer-2-peer protocol so we do not need any other network element in- between, but SIP service providers will put a SIP server in-between which will act as proxy server connecting different clients with each other.

To get a SIP number you can create a account with any SIP provider  (ipetel,   tpad, worldnet etc) .You will get a SIP number , password, SIP proxy. I used ( https://secure.tpad.com/signup/) to get my SIP number .  For android the best available SIP client is Sipdroid , it is open source SIP application and is generally available via gnu licence.  Go to android market on your phone and download sipdroid . After installing Sipdroid , start the sipdroid . It will ask for phone number and calling party address, it also give option to create new pbx account and link it to your google voice account. You can create a account with pbxes.org or you can use sipdroid as normal SIP client without pbx account associated with it .

To use Sipdroid without pbx account go to settings and select SIP Account .  Provide the SIP number for authorization name field, type in your password for password and enter the SIP proxy for server or proxy field.  All these information was available to us from SIP account creation with SIP provider. Check mark the use WLAN if you are using Wi-Fi .
After configuration, if you connect to Wi-Fi you will get a green dot in your notification pad on phone , confirming the sipdroid online.  Now to connect to any other SIP client just dial the SIP number and get connected.  SIP clients provide us with free VoIP calls over IP , condition phone should be  IP enabled. 

If you have fring account , you can download fring mobile app for android which is free and also can use it as SIP client along with normal fring calls.

Friday, November 19, 2010

SharpDevelop:- ToolBoxProvider Service

In this blog , we will look at ToolBoxProvider service of SharpDevelop. SharpDevelop ToolBox window  uses this service for creating the categories and  loading the controls inside  the ToolBox . This service is provided by FormsDesigner AddIn.  Default controls loaded  in the SharpDevelop’s ToolBox are from various assemblies (System.Windows.Forms, System.Data, System.Drawing etc ) . Information regarding these controls assemblies and components inside them is stored by SharpDevelop in a  xml file called  “SharpDevelopControlLibrary.sdcl” , this file is located at  “..\data\options”. If we want our custom controls  to be  added to the ToolBox , we have to use the services of ToolBoxProvider.  Lets us see how to add the components from controls library . 

public static void LoadToolBoxItems()
   {
       List<ToolComponent> lstToolsComponent = null;

       string ControlsFilePath = System.Configuration.ConfigurationManager.AppSettings["Controls_File_Path"].ToString();

       Category myCatagory = new Category("MyCatagory");
       myCatagory.IsEnabled = true;

       ToolboxProvider.ComponentLibraryLoader.Categories.Add(myCatagory);

       //Add the controls file controls
       Assembly asm = Assembly.LoadFrom(ControlsFilePath);
       lstToolsComponent = AddComponentsToList(asm, Path.GetDirectoryName(ControlsFilePath));
       foreach (ToolComponent comp in lstToolsComponent)
       {
           myCatagory.ToolComponents.Add(comp);
       }

       ToolboxProvider.SaveToolbox();
       ToolboxProvider.ReloadSideTabs(true);
   }

Above routine gets the control library’s path from config and loads the assembly at runtime to fetch the components from the assembly . Another routine AddComponetsToList()  takes the assembly and assembly directory path as parameter and returns the list of  ToolComponent instances. At last we call SaveToolBox on ToolBoxProvider and reload the toolbox. SaveToolBox routine populates the “SharpDevelopControlLibrary.sdcl” file with our assembly and components information and saves it. ReloadSideTabs routine reads the .sdcl file and fills the components in ToolBox.

AddComponentsToList routine :--

static List<ToolComponent> AddComponentsToList(Assembly assembly, string loadPath)
    {
        List<ToolComponent> lstToolsComponent = new List<ToolComponent>();
        if (assembly != null)
        {
            try
            {

                foreach (Type t in assembly.GetExportedTypes())
                {
                    if (!t.IsAbstract)
                    {
                        if (t.IsDefined(typeof(ToolboxItemFilterAttribute), true) || t.IsDefined(typeof(ToolboxItemAttribute), true) || typeof(System.ComponentModel.IComponent).IsAssignableFrom(t))
                        {
                            object[] attributes = t.GetCustomAttributes(false);
                            object[] filterAttrs = t.GetCustomAttributes(typeof(DesignTimeVisibleAttribute), true);
                            foreach (DesignTimeVisibleAttribute visibleAttr in filterAttrs)
                            {
                                if (!visibleAttr.Visible)
                                {
                                    goto skip;
                                }
                            }
                            ToolComponent toolComponent = new ToolComponent(t.FullName, new ComponentAssembly(assembly.FullName, loadPath), true);
                            lstToolsComponent.Add(toolComponent);

                        skip: ;
                        }
                    }
                }
                return lstToolsComponent;
            }
            catch (Exception e)
            {
                return lstToolsComponent;
            }
        }
        return lstToolsComponent;
    }

Thursday, November 18, 2010

Android :- Google voice India

How to activate google voice account for myself ?  After tolling hours on net to find the procedure for getting a google voice account for myself (in India) , I finally got something  nice from Harsh Agrawal’s article at http://www.callingallgeeks.org/how-to-get-google-voice-account-india-country-world/ . After following all the procedure from the articles , I was finally able to get a free US based phone number from Redmond   and a Google voice account .  This blog is just a short description of my experience  based on Harsh article. As described I signed up for Tpad account (https://secure.tpad.com/signup/) and provided my mail address and a password. After setting up an account with Tpad, I got a  mail , providing me with a Tpad number (SIP number) and Tpad proxy  “sipx.tpad.com” (SIP proxy) .

Next step was to download Softphone (Ninja Lite)  app and install it, download link is provided within received mail . Starting softphone app will ask for Tpad number and password, Tpad number is SIP number we received via mail and password is the same password we used to create Tpad account. Next step is to sign up for IPkall account (http://phone.ipkall.com/) , information required are Tpad number (SIP) and Tpad proxy (SIP) that we received in mail  from Tpad account creation. After finishing the IPkall account creation we will receive mail from IPkall having a US based IPkall number  and our SIP number and SIP proxy associated with it. So far so good.

Next we have to set up a google voice account that will need a US based number and also for me google voice is not available in my home country (India). To get hold of google voice website in regions where it is not available we have to use proxy , I downloaded the UltraSurf proxy client and it worked for me. Using proxy I was able to get to google voice site . Google Voice website asks  us to choose a google voice number based on area  code or phrase. I choose Redmond as area code and selected a google number from available numbers.  After first step site ask us to set a four digit PIN number and then ask us to set a call forwarding number. Set call forwarding number,  the number we got from IPkall confirmation mail (US based number).  After setting the call forwarding number , google voice site ask us to make a call via google number that is forwarded to the IPkall number .

To test the google number keep the softphone (Ninja Lite) on. Select make a call from google website option , option also show us a two digit number that we have to dial on out softphone when we receive a google forwarded call. When we receive google forwarded call and after dialling the code we will be asked for a sample voice recording and a greeting voice recording , after finishing this step our google voice account is activated.

After activating the Google voice number , visit the m.google.com/voice on your android mobile phone . There is download link for installing the google voice application on your android mobile from android market.

After installing the google voice application , start the google voice application from your mobile. Login to your google voice account. At application start-up you will be given option for registering the google voice number or your exsisting phone  number for your android phone. Select the IPKall number that we received from IPKall registration as done through above said procedure (253**************).   After providing the phone number we will be asked for configuration of voicemail. After going through all the step google voice application wizard is completed. Soon we will get a voice mail from the google voice , confirming the completion of  setup for google voice on our android mobile.

Now with our google voice account set up we can call a another google voice number configured same way as our android phone.

Saturday, November 13, 2010

C# :- Dynamic Keyword and Reflection

With help Dynamic keyword in C# we can invoke methods on the types without specifying the types at compile time . Once the Dynamic keyword is used compiler do not try to infer the type from the context  as  var keyword do , but instead rely upon the runtime to resolve the call . I found Dynamic keyword very useful while using reflection . I got in the scenario were I have the types name specified in the xml file and I have to create the instance of these types using reflection.  Lets say for instance i have types  with names  type1 and type2  in a xml file,  having method RoutineOne()  in both classes  and there implementation in a  .dll ( implementation.dll ) .  To create the instances using reflection I have to do following :--

         Type refelectedType;
         Assembly refelectedAssembly = null;

refelectedAssembly = Assembly.LoadFrom(dllPathName);
refelectedType = refelectedAssembly.GetType(“type1”);

       type1 routine = (type1)Activator.CreateInstance(refelectedType);
        routine.RoutineOne();

and do same thing to get the instance of “type2”.  We can see that we have to typecast the instance into respective  type. Or we can create an Interface and get common method in this interface. Lets say interface  ICommonRoutines :-

public interface ICommonRoutines
    {
        void RoutineOne();

    }

After implementing the interface in both the classes we can again do :-

         Type refelectedType;
         Assembly refelectedAssembly = null;

refelectedAssembly = Assembly.LoadFrom(dllPathName);

foreach (string clsName in lstClassNames){ 

refelectedType = refelectedAssembly.GetType(clsName);

ICommonRoutines routine = (ICommonRoutines)Activator.CreateInstance(refelectedType);
routine.RoutineOne(); }

Here also we have to type cast the created instance into ICommonRoutine interface . We now can read the type name from xml file and create the instances using the common interface , but to do so we have to reference the implementation dll (Implementation.dll) to get the type ICommonRoutines for typecasting .

As the new types are added in the xml file we have to create the type definition and implement the interface in order for our code to be valid for instance creation.

Another way to do above thing is to use Dynamic keyword which removes the dependency on the implementation dll and bypasses the compilation time checking.

         Type refelectedType;
         Assembly refelectedAssembly = null;

refelectedAssembly = Assembly.LoadFrom(dllPathName);

foreach (string clsName in lstClassNames){ 

refelectedType = refelectedAssembly.GetType(clsName);

dynamic routine = Activator.CreateInstance(refelectedType);
routine.RoutineOne(); }

Using Dynamic keyword removes the need for typecasting during instance creation and dependency on implementation dll.  Now we can add any number of types in xml file and create their instances without worrying about availability of types for typecasting . As the compile time checking is ignored , it becomes little dangerous if all the types are not properly implemented . In this case it is still better to use an interface as a contract for all the types to follow and use dynamic keyword .

Wednesday, November 10, 2010

SharpDevelop :- ParserService

While working on SharpDevelop  , I got in situation where I have to construct the assembly name at runtime just before the build happens and set it as the assembly name of the SharpDevelop project.  Assembly name has to be in format  {NameSpace.ClassName.dll} . To construct this assembly name I have to parse the code file for example say MyClass.cs and get the namespace name and class name .

Previously I have done this in Visual Studio using  CodeDom (FileCodeModel, CodeElements etc).

In SharpDevelop to get the job done I followed the below algorithm :---

i)  Get the instance of currently opened project ( IProject ) . We can get it through ProjectService class     (ProjectService.CurrentProject) .

ii) Iterate the project items and find the code file/project item  to parse.

iii) Get the file path of this project item ( projectitem.FileName ) and create the instance of FileName class by calling   FileName.Create(<file path>).

iv) Create the instance of class ParsableFileContentFinder and call method Create on instance taking FileName instance as parameter (parsableContentFinderObject.Create(<FileName filename>)).This call on method parses the code file and buffers the content. This content is made available through the return type of Create method (ITextBuffer).

v) Call the ParserService.Parse(<filepath>, <ITextBuffer> ) method that takes the filepath and ITextBuffer as parameter. This method returns the ParseFileInformation object , that contains all the information related to the code elements .

Developed code on basis of above algorithm :
    
    public static void ParseNCreateWaspAssembly(string filename, out string assemblyName)  {

            assemblyName = string.Empty;
            IProject project = null;
            IEnumerable<ProjectItem> projectItems = null;
            ParseableFileContentFinder parseableFinder = null;
            string filepath = string.Empty;
            ITextBuffer contentBufferContainer = null;
            FileName targetCodefile = null;
            ParseInformation parseInfo = null;
            string projectName = string.Empty;
            string className = string.Empty;
            string nameSpace = string.Empty;

                project = ProjectService.CurrentProject;
                parseableFinder = new ParseableFileContentFinder();
                if (project != null){
                    projectItems = project.Items.AsEnumerable();
                    foreach (ProjectItem projItem in projectItems){
                        if (string.Compare(Path.GetFileNameWithoutExtension(projItem.FileName), filename,

StringComparison.OrdinalIgnoreCase) == 0){

                            filepath = projItem.FileName;
                            targetCodefile = FileName.Create(filepath);
                            if(ParserService.GetParser(filepath) != null){
                                contentBufferContainer = parseableFinder.Create(targetCodefile);
                                if(contentBufferContainer != null){
                                    parseInfo = ParserService.ParseFile(targetCodefile, contentBufferContainer);
                                    if(parseInfo != null){
                                        if (parseInfo.CompilationUnit.Classes.Count() > 0){
                                            assemblyName = parseInfo.CompilationUnit.Classes[0].FullyQualifiedName;
                                            project.AssemblyName = assemblyName;
                                            project.Save();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
        } 

That’s how we can search for the code file and get access to all the code elements .