RapidXml Parsing Wrapper

Hey All,

Want to share with you all a piece of code that i wrote. Recently i was working on a c++ application where some xml parsing was required, i you search on google for C++ xml parser their are lot of open source parser that is available but my favorite was RapidXml. Rapid Xml is much faster than others. You can check the performance comparison here . So if you need a xml parser in c++ Rapid Xml is strongly recommended.

The piece of code that i wish to share is wrapper over rapid xml to read the data from xml a bit easier.

Following is the code

RapidXmlWrapper.h

#pragma once
#include <string>
#include <map>
#include "rapidxml-1.13\rapidxml.hpp"

using namespace std;

class RapidXmlWrapper
{
public:
	RapidXmlWrapper(){}
public:
	static rapidxml::xml_node<>* getNodeByName(const string& nodeName, rapidxml::xml_node<>* parentNode);
	static rapidxml::xml_node<>* getNodeByNameAndAttribute(const string& nodeName, const string& attrName, const string& attribValue, rapidxml::xml_node<>* node);
	static string getAttributeValue(const std::string& attributeName, rapidxml::xml_node<>* node);
	static map<string, string> getParamMapsFromNode(rapidxml::xml_node<>* node);
};


RapidXmlWrapper.cpp


#include "RapidXmlWrapper.h"
#include <sstream>

/**
* Gets a node object from given node name and parent node.
*/
rapidxml::xml_node<>* RapidXmlWrapper::getNodeByName(const string& nodeName, rapidxml::xml_node<>* parentNode)
{
	if(parentNode == NULL)
	{
		// parent node must not be null
		ostringstream errorBuilder;
		errorBuilder << " parentNode object should not be null: ";
		throw runtime_error(errorBuilder.str());
	}

   rapidxml::xml_node<>* node = parentNode->first_node();

   while(node != NULL)
   {
      if(node->name() == nodeName)
      {
         return node;
      }

      node = node->next_sibling(); 
   }
   return NULL;
}

/**
* Get node object from given node name, attribName, attribValue and parent node.
*/
rapidxml::xml_node<>* RapidXmlWrapper::getNodeByNameAndAttribute(const string& nodeName, const string& attrName, const string& attribValue, rapidxml::xml_node<>* parentNode)
{
	if(parentNode == NULL)
	{
		// parent node must not be null
		ostringstream errorBuilder;
		errorBuilder << " parentNode object should not be null: ";
		throw runtime_error(errorBuilder.str());
	}

	rapidxml::xml_attribute<>* attr = parentNode->first_attribute(attrName.c_str());
	if( (attr != NULL) && (attr->value() == attribValue) && (parentNode->name() == nodeName))
	{
		return parentNode;
	}

	rapidxml::xml_node<>* node = parentNode->first_node();

	while(node != NULL)
	{
		if(node->name() == nodeName)
		{
			// If attribute name and value empty then return node
			if(attrName.empty() || attribValue.empty())
			{
				return node;
			}
			else
			{
				rapidxml::xml_attribute<>* attr = node->first_attribute(attrName.c_str());
				if( (attr != NULL) && (attr->value() == attribValue) )
				{
					return node;
				}
			}
		}
		node = node->next_sibling(); 
	}
	return NULL;
}

/**
* Get attribute value from given attribute name and given node object.
*/
string RapidXmlWrapper::getAttributeValue(const std::string& attributeName, rapidxml::xml_node<>* node)
{
	string attributValue = "";

	if(node == NULL)
	{
		// throw This node must be initialized
		ostringstream errorBuilder;
		errorBuilder << "node object should not be null,for attribute name:" + string(attributeName);
		throw runtime_error(errorBuilder.str());
	}

	rapidxml::xml_attribute<>* attribute = node->first_attribute(attributeName.c_str());
	if(NULL == attribute)
	{
		ostringstream errorBuilder;
		errorBuilder << "Attribute not found, for attribute name:" + attributeName;
		throw runtime_error(errorBuilder.str());
	}
	attributValue = attribute->value();
	return attributValue;
}

/**
* Get map of string, string i.e. key value pair from given node object.
* ex: <Employees>
		<Employee Name="John" Age="30"/>
		<Employee Name="Harry" Age="27"/>
		<Employee Name="Kate" Age="29"/>
*     </Employees> 
*    
*    Method will result the map of Employees with Name and age as key value pairs 
*/
map<string, string> RapidXmlWrapper::getParamMapsFromNode(rapidxml::xml_node<>* node)
{
   map<string, string> paramsMap;

   if(node == NULL) 
   {
      // This node must be initialized
	   ostringstream errorBuilder;
	   errorBuilder << "node object should not be null";
	   throw runtime_error(errorBuilder.str());
   }


   for(rapidxml::xml_node<>* currNode = node->first_node(); currNode != NULL; currNode = currNode->next_sibling())
   {
      string nodeName = currNode->name();
      rapidxml::xml_attribute<>* nameAttr = currNode->first_attribute("Name");
      rapidxml::xml_attribute<>* valueAttr = currNode->first_attribute("Age");
      if(nodeName == "Employee" && nameAttr != NULL && valueAttr != NULL)
      {
         paramsMap.insert(pair<string, string>(nameAttr->value(), valueAttr->value()));
      }
   }

   return paramsMap;
}

Usage of the Wrapper class is very simple, consider the following xml as sample

<?xml version="1.0" encoding="utf-8"?>
<Company>
  <Employees>
    <Employee Name="John" Age="30"/>
    <Employee Name="Harry" Age="27"/>
    <Employee Name="Kate" Age="29"/>
  </Employees>
  <Departments>
    <Department Name="Sales" TeamSize="4"/>
    <Department Name="Marketing" TeamSize="10"/>
    <Department Name="Developemnt" Head="kapil" TeamSize="5"/>
    <Department Name="Testing" Head="John">
    </Department>
  </Departments>
</Company>
 

Following is the usage:

		rapidxml::xml_document doc;
		string fileContents = getFileContents("SampleXmlFile.xml");
		doc.parse((char*)fileContents.c_str());

		//Extract employee Map
		rapidxml::xml_node* node = RapidXmlWrapper::getNodeByName("Employees",doc.first_node());
		map employeeList = RapidXmlWrapper::getParamMapsFromNode(node);


		//Extract Head of the Development Department
		rapidxml::xml_node* pNode = RapidXmlWrapper::getNodeByName("Departments",doc.first_node());
		rapidxml::xml_node* dNode = RapidXmlWrapper::getNodeByNameAndAttribute("Department","Name","Developemnt",pNode);
		string departmentHead = RapidXmlWrapper::getAttributeValue("Head",dNode);

License
This project is licensed under the WTFPL Public License

Download

Attached is the visual studio solution describing usage and functionality, download it from here

Thanks For reading the post and please post your valuable comments and suggestion for improvement.

Posted in c++, Uncategorized | Tagged , , , , , , | Leave a comment

NSIS Sqlite Plugin

Hey Guys,

recently i was working on an installer which required some sqlite db manipulation, i searched over the nsis plugin directory but found none. So i went on reading the “how to create nsis plugin” over internet and trust me it is so easy. Nsis is an amazing installer framework and best tutorial for creating the nsis pluing is in the nsis examples which comes with the nsis installtion.

By referencing the example plugin , i created the plugin for sqlite which can perform operations on sqlite db.
Have hosted the project @ sourceforge.net (one of the many awesome things for open source developers :) ).

Browse the project at https://sourceforge.net/projects/nsissqliteplug/

Usage is very simple:

from you nsis script just call excuteQuery like :
nsisSqlplugin::executeQuery “sqliteDatabase” “sql_query”

Do get in touch with me for any clarification and queries. Happy coding :)

Posted in C# | Tagged , , , , , , , , | Leave a comment

C# Dummy Image Generator Utility

Hey Friends!!
Hope you all are rocking with your lives, if not remember “One life to live” :).

Recently i made a utility project , command line utility project to create dummy images, sharing the project with you all.

Introduction
Dummy image generator is a console application to create dummy images of different size based on the arguments provided, Can be used for creating test images for any application.

Code Explained

Used System.Drawing Graphics class for creating images, it Encapsulates a GDI+ drawing surface. More details here

Code to create the images

        private static Bitmap CreateImage(string sImageText, int width, int height, Color backColor, Color textColor, float fontSize)
        {
            Bitmap bmpImage = new Bitmap(1, 1);

            int iWidth = width;
            int iHeight = height;

            float pointX = (width / 2) - ((width / 2) / 2) / 2;
            float pointY = (height / 2) - ((height / 2) / 2) / 2;
            // Create the Font object for the image text drawing.
            Font MyFont = new Font("Verdana", fontSize,
                               System.Drawing.FontStyle.Bold,
                               System.Drawing.GraphicsUnit.Point);

            // Create a graphics object to measure the text's width and height.
            Graphics MyGraphics = Graphics.FromImage(bmpImage);

            // Create the bmpImage again with the correct size for the text and font.
            bmpImage = new Bitmap(bmpImage, new Size(iWidth, iHeight));

            // Add the colors to the new bitmap.
            MyGraphics = Graphics.FromImage(bmpImage);
            MyGraphics.Clear(backColor);
            MyGraphics.TextRenderingHint = TextRenderingHint.AntiAlias;
            MyGraphics.DrawString(sImageText, MyFont,
                                new SolidBrush(textColor), pointX, pointY);
            MyGraphics.Flush();
            return (bmpImage);
        }

The application required so many command line arguments so i googled for a better way to pass command line argument and found an amazing command line argument parser. It is really wowsome and easy to implement, do check it out here

It is easy to implement just add the required library reference

using CommandLine;
using CommandLine.Text;

Now, have to create a class having all the arguments that we need

        sealed class Options : CommandLineOptionsBase
        {
            [Option("d", "dimensions", Required = true, HelpText = "Dimension heightxWidth ex: 300x400")]
            public string Dimensions { get; set; }

            [Option("t", "text", Required = true, HelpText = "Text to wirte on the image")]
            public string TextToWrite { get; set; }

            [Option("b", "backColor", HelpText = "Background color of the image ex: red, black, brown ")]
            public string BackColor { get; set; }

            [Option("f", "fontColor", HelpText = "Font Color of the text ex: red, white, black")]
            public string FontColor { get; set; }

            [Option("o", "outFileName", Required = true, HelpText = "Full path of the output file including the extenstion as format required , supported gif, png, jpeg")]
            public string OutFileName { get; set; }

            [Option("s", "fontSize", HelpText = "Font size of the text to be written")]
            public float FontSize { get; set; }

            [HelpOption]
            public string GetUsage()
            {
                var help = new HelpText
                {
                    Heading = new HeadingInfo(Assembly.GetExecutingAssembly().FullName, Assembly.GetExecutingAssembly().GetName().Version.ToString()),
                    Copyright = new CopyrightInfo("CodingGrapes", 2012),
                    AdditionalNewLineAfterOption = true,
                    AddDashesToOption = true
                };
                this.HandleParsingErrorsInHelp(help);
                help.AddPreOptionsLine("GNU General Public License version 2 (GPLv2)  ");
                help.AddPreOptionsLine("Usage: CodingGrapes_DummyImageGenerator -d300x400 -tSampleText -bblack -fyellow -oC:\\dummyImage.jpg -s16");
                help.AddOptions(this);
                return help;
            }

            void HandleParsingErrorsInHelp(HelpText help)
            {
                if (this.LastPostParsingState.Errors.Count > 0)
                {
                    var errors = help.RenderParsingErrorsText(this, 2); // indent with two spaces
                    if (!string.IsNullOrEmpty(errors))
                    {
                        help.AddPreOptionsLine(string.Concat(Environment.NewLine, "ERROR(S):"));
                        help.AddPreOptionsLine(errors);
                    }
                }
            }
        }

Now we just need to invoke this class and use command line parser to parse arguments

Add this main method to class Program

static void Main(string[] args)
        {
            var options = new Options();
            var parser = new CommandLineParser(new CommandLineParserSettings(Console.Error));
            if (parser.ParseArguments(args, options))
            {
                if(!options.Dimensions.Contains('x'))
                    Console.WriteLine("Dimension is not in correct format");
            }
            else
            {
                Environment.Exit(1);
            }

            try
            {
                int height = Convert.ToInt32(options.Dimensions.Split('x')[0]);
                int width = Convert.ToInt32(options.Dimensions.Split('x')[1]);
                float fontSize = options.FontSize == 0.0 ? 16 : options.FontSize;
                Color backColr = Color.FromName(string.IsNullOrEmpty(options.BackColor) ? "black" : options.BackColor);
                Color txtColr = Color.FromName(string.IsNullOrEmpty(options.FontColor) ? "white" : options.FontColor);
                Bitmap bmp = CreateImage(options.TextToWrite, width, height, backColr, txtColr, fontSize);

                string extension = Path.GetExtension(options.OutFileName);

                switch (extension)
                {
                    case ".png":
                        bmp.Save(options.OutFileName, System.Drawing.Imaging.ImageFormat.Png);
                        break;
                    case ".jpg":
                        bmp.Save(options.OutFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                        break;
                    case ".gif":
                        bmp.Save(options.OutFileName, System.Drawing.Imaging.ImageFormat.Gif);
                        break;
                    case ".jpeg":
                        bmp.Save(options.OutFileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                        break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
            }
        }

Usage
CodingGrapes_DummyImageGenerator.exe -d300x400 -tSampleText -bblack -fyellow -oC:\\dummyImage.jpg -s16

Explanation
-d dimension heightxwidth
-t text text to be written on the image
-b backColor Background color of the image ex, red, black, blue have to provide name
-f fontColor Font Color, color of the text
-o outFileName output file name including extension supported formats png,gif, jpeg
-s fontSize Size of the text to be written

License
This project is licensed under the GNU General Public License version 2 (GPLv2)

Download

Attached is the visual studio solution describing usage and functionality, download it from here

Thanks For reading the post and please post your valuable comments and suggestion for improvement.

Posted in C#, products | Tagged , , , , , , , , , , , | Leave a comment

Read xml from sd card in android phonegap

Hey Geeks!!

Last month, i was doing a project on android using phonegap ( amazing framework to develop mobile applications using html an javascript). i had a requirement to read a xml configuration file from sd card using javascript, googled it and found that phonegap File Api.

I wrote the code and now sharing that with you all.

Suppose this is the xml that we wish to read:

Code


<?xml version="1.0" encoding="utf-8" ?>
<config>
<categories>
<category name="cat1" displayName="Sample Cat 1"/>
<category name="cat2" displayName="Sample Cat 2"/>
</categories>
</config>

Javascript to read this xml file

document.addEventListener("deviceready", onDeviceReady, false);

// PhoneGap is ready
function onDeviceReady() {
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);
}

//xml file is in sdcard/config/config.xml
function gotFS(fileSystem) {
    fileSystem.root.getFile("config/config.xml", { create: true }, gotFileEntry, fail);
}

function gotFileEntry(fileEntry) {
    fileEntry.file(gotFile, fail);
}

function gotFile(file) {
    readAsText(file);
}

function readAsText(file) {
    var reader = new FileReader();
    reader.onloadend = function (evt) {
        console.log("Read as text");
        var xml = evt.target.result;
        fileObject = xml;
        ParseXmlCat(xml);
    };
    reader.readAsText(file);
}

//function to parse xml and create a li tag using the parsed values and append that to Ul tag 
function ParseXmlCat(xmlcat)
{
    $(xmlcat).find("category").each(function(){
        var name = $(this).attr("name");
        var displayName = $(this).attr("displayName");
        console.log(name);
        var litext = "<li class='licat'><a href='video.html' id='"+name+"'>"+displayName+"</a></li>";
        console.log(litext);
        $("#category").append(litext);
    });
    $('ul').listview('refresh');    
}

//if fail occurs at any point alert is displayed on phone device
function fail(evt) {
    alert("configuration Error" + evt.target.error.code);
    console.log(evt.target.error.code);
}

Please refer to phonegap api.

Thanks For reading the post and please post your valuable comments.
Happy Coding !!

Posted in android, JavaScript, jQuery, Phonegap | Tagged , , , , , , , , | 8 Comments

Yahoo Contact(email) Importer

Introduction

Hello friends!!
Recently i was googling about importing contacts from email providers. i found api’s for gmail but to get contacts from yahoo is bit troubling at least to me it was.
i found a project on Sourceforge OpenContacts but it wasn’t working, so i corrected it and sharing the code with you all.

Below is the output of the console application that uses this contact importer. I have blacked the emails of my friends coz i am afraid if someone sue me for that :P.

Code

Following is the code that i have written/changed

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
using System.Net;
using System.Collections.Specialized;
using System.Text.RegularExpressions;

namespace CodingGrapes_YahooContacts
{
    class YahooImport
    {
        private const string _addressBookUrl = "http://address.mail.yahoo.com/";
        private const string _authUrl = "https://login.yahoo.com/config/login?";
        private const string _loginPage = "https://login.yahoo.com/config/login";
        private const string _userAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3";


        public List<contacts> GetYahooContacts(string _username, string _pass)
        {
            try
            {
                WebClient webclient = new WebClient();
                webclient.Headers[HttpRequestHeader.UserAgent] = _userAgent;
                webclient.Encoding = Encoding.UTF8;

                byte[] firstResponse = webclient.DownloadData(_loginPage);
                string firstRes = Encoding.UTF8.GetString(firstResponse);

                NameValueCollection postToLogin = new NameValueCollection();
                Regex regex = new Regex("type=\"hidden\" name=\"(.*?)\" value=\"(.*?)\"", RegexOptions.IgnoreCase);
                Match match = regex.Match(firstRes);
                while (match.Success)
                {
                    if (match.Groups[0].Value.Length > 0)
                    {
                        postToLogin.Add(match.Groups[1].Value, match.Groups[2].Value);
                    }
                    match = regex.Match(firstRes, match.Index + match.Length);
                }

                postToLogin.Add(".save", "Sign In");
                postToLogin.Add(".persistent", "y");

                string login = _username;
                postToLogin.Add("login", login);
                postToLogin.Add("passwd", _pass);

                webclient.Headers[HttpRequestHeader.UserAgent] = _userAgent;
                webclient.Headers[HttpRequestHeader.Referer] = _loginPage;
                webclient.Encoding = Encoding.UTF8;
                webclient.Headers[HttpRequestHeader.Cookie] = webclient.ResponseHeaders[HttpResponseHeader.SetCookie];

                webclient.UploadValues(_authUrl, postToLogin);
                string cookie = webclient.ResponseHeaders[HttpResponseHeader.SetCookie];


                string newCookie = string.Empty;
                string[] tmp1 = cookie.Split(',');
                foreach (string var in tmp1)
                {
                    string[] tmp2 = var.Split(';');
                    newCookie = String.IsNullOrEmpty(newCookie) ? tmp2[0] : newCookie + ";" + tmp2[0];
                }

                webclient.Headers[HttpRequestHeader.Cookie] = newCookie;
                byte[] thirdResponse = webclient.DownloadData(_addressBookUrl);
                string thirdRes = Encoding.UTF8.GetString(thirdResponse);
                return ParseYahooResponse(thirdRes);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        private List<contacts> ParseYahooResponse(string _response)
        {
            List<contacts> ContactList = new List<contacts>();
            _response = _response.Substring(_response.IndexOf("InitialContacts"), (_response.IndexOf("InitialBucket") - _response.IndexOf("InitialContacts")));

            List<YahooContacts> Contacts = JsonConvert.DeserializeObject<List<YahooContacts>>(_response.Substring(_response.IndexOf('['), (_response.LastIndexOf(']') - _response.IndexOf('[')) + 1));
            foreach (YahooContacts oYahooContacts in Contacts)
            {
                if (!String.IsNullOrEmpty(oYahooContacts.Email))
                {
                    contacts ocontacts = new contacts();
                    ocontacts.Name = oYahooContacts.ContactName;
                    ocontacts.Email = oYahooContacts.Email;
                    ContactList.Add(ocontacts);
                }
            }
            return ContactList;
        }
    }
}

Above code returns a list of contact object which contains name and email. I have also used newtonsoft.json parser to parse the response it is an amazing parser do check it out

Using Code

Attached file is a sample console application which uses the yahoo importer class to import contacts.

Download

License

This project is licensed under the GNU General Public License version 2 (GPLv2)

Thanks For reading the post and please post your valuable comments.

Posted in C#, products | Tagged , , , , , , | 25 Comments

Spider Search Engine

Spider Search Engine sits at the top of the major search engine and gives you search results of the major search engines on the same page, so you don’t need to go on every search engine for the same search query.

you can test spider search engine at spidersearch.codinggrapes.com

Spider Search Engine

Also, spider search engine is in process of development, so i request to give your feedback and valuable comments/suggestions to make it better.

Cheers!!!
Eat Grapes|Drink Grapes

Posted in JavaScript, jQuery, products | Leave a comment

Registry Helper Library in C#

Introduction

Hello, presenting you a registry helper class to perform the operations on windows registry
This registry helper class can be used with any .net application.This class performs following registry operations:
1. Check the registry (registry at the given path exists or not)
2. Read the registry at the given path and key ( returns the value of the key)
3. Create the registry entry at the given path with given key and value
4. Edit the registry at the given path and key with the new value
5. Delete the registry at the given path

Code

following imports are required for the class

using Microsoft.Win32;
using System.Security.AccessControl;
using System.Security.Principal;

sourcecode of the class

class RegistryHelper
    {
        /// <summary>
        /// Checks if the registry entry at the given path exists or not
        /// </summary>
        /// <param name="path">path of the registry</param>
        /// <returns>True/False</returns>
        public bool CheckRegistry(string path)
        {
            try
            {
                RegistryKey regkey = Registry.LocalMachine.OpenSubKey(path);
                if (regkey == null)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Reads the registry value at the given path with the given key name
        /// </summary>
        /// <param name="path">Path of the registry entry</param>
        /// <param name="key">name of the key</param>
        /// <returns>Value of the key</returns>
        public string ReadRegistry(string path, string key)
        {
            try
            {
                RegistryKey regkey = Registry.LocalMachine.OpenSubKey(path);
                string RegValue = regkey.GetValue(key).ToString();
                if (string.IsNullOrEmpty(RegValue))
                {
                    return null;
                }
                else
                {
                    return RegValue;
                }
            }
            catch (Exception ex)
            {
                return "No Entry";
            }

        }


        /// <summary>
        /// Edits the registry at the given path with the new value
        /// </summary>
        /// <param name="path">registry path</param>
        /// <param name="key">key value</param>
        /// <param name="value">new value</param>
        /// <returns>bool</returns>
        public bool EditRegistry(string path, string key, string value)
        {
            try
            {
                RegistryKey regkey = Registry.LocalMachine.OpenSubKey(path, true);
                RegistrySecurity rs = regkey.GetAccessControl(AccessControlSections.Access);
                rs.SetGroup(new NTAccount("Administrators"));
                rs.SetOwner(new NTAccount("Administrators"));
                rs.SetAccessRuleProtection(false, false);
                regkey.SetAccessControl(rs);
                regkey.SetValue(key, value, RegistryValueKind.DWord);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Creates a registry entry at the given path with given key and value
        /// </summary>
        /// <param name="path">Registry subkey path to create</param>
        /// <param name="key">name of the key in the entry</param>
        /// <param name="value">value of the key</param>
        /// <returns>bool</returns>
        public bool WriteRegistry(string path, string key, string value)
        {
            try
            {
                Registry.LocalMachine.CreateSubKey(path);
                RegistryKey regkey = Registry.LocalMachine.OpenSubKey(path, true);
                regkey.SetValue(key, value);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        /// <summary>
        /// Deletes the registry entry at the given path
        /// </summary>
        /// <param name="path">path of the registry</param>
        /// <returns>bool</returns>
        public bool DeleteRegistry(string path)
        {
            try
            {
                Registry.LocalMachine.DeleteSubKey(path);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }

Using Code
Attached file is a sample console project using the registry helper class to show operations on registry.

Download

License

This project is licensed under the GNU General Public License version 2 (GPLv2)

Thanks For reading the post and please post your valuable comments.

Posted in C# | Tagged , , , , , , , , | 1 Comment

Hello visitor!!!

Hello Visitor,

welcome to codingGrapes, a technical blog for developers . This blog is intended to provide solutions and tutorials on various development as well as Quality Analysis strategies in an efficient and effective manner.

we will share all our knowledge and experience that we have learned so far by being in the industry working on industry level projects, also,  we do believe that open source matters and to just add open source community all our code ,solutions and tutorials will be open source free to use modify and distribute.

Our primary goal is to focus on web development with following technologies:

  • Microsoft Technologies C#, .net , asp
  • PHP
  • JavaScript, jQuery
  • Java, JSP, Struts, Hibernate
we will also provide some QA and Testing fundamentals
  • QC
  • Selenium
  • Xstudio
  • MS Test Manager
We hope that you will find our solutions useful and in times when you feel bored or sick , heres our first solution:
“Eat Grapes , or probably you can drink Grapes :)”
Posted in Uncategorized | 2 Comments