From MATLAB To Python

Posted on

MATLAB:

For many years MATLAB has been my primary tool for prototyping algorithms, because of its rich set of optimization functions and the AI tool box it has proven to be a valuable tool to have. However, It is not cheap and if you do not have a company to pay for license or attend a university that provides you with a license then you will have to find an alternative.

MATLAB is not a programming language rather its a tool that has as part of its framework a programming language called M language, this language has a lot of quirks and takes some getting use to, the other issue I found with MATLAB is that the functions while well documented do not seem to follow a standard in terms of parameters; on the whole while MATLAB is a good tool for prototyping and is used a lot in engineering and medical fields which are my core domain; However,I am forced to look for a cheaper/free alternative that will give me as much if not more tools than MATLAB now provides.

Python to the rescue:

Python is powerful… and fast;
plays well with others;
runs everywhere;
is friendly & easy to learn;
is Open

All these wonderful things make Python a big contender for my MATLAB replacement.

The first thing we want to do is install Python.
Next install my favurite Python IDE PyCharm
Create a new Python Project using PyCharm
Python project

How do we add packages to our project?
Python is nothing without its packages and two of my favourites are numpy and scipy. To add these packages simply download the Anaconda distribution and configure it to be your default python implementation.

pylibs

And here is my first piece of python code as taken from the python website :-)

pyresult

All I need now is a good Python book and 2-4 months to delve into the language. Stay tuned for more posts on my Python journey. Happy coding!!

Finding stuff in SVN Source control with PowerShell

Posted on Updated on

Its as simple as this:

svn list -R [your svn repo url] | select-string [string to search for]

DICOM to XML Using MATLAB/JAVA

Posted on Updated on

This little code snippet converts MATLAB Struct to xml, enjoy!!

%Convert Struct to XML


function obj = struct2xml(param)
   doc = com.mathworks.xml.XMLUtils.createDocument(inputname(1));
   root = doc.getDocumentElement;

   obj = xmlwrite(parse(param, doc, root));
end

function obj = parse(param, doc, root)
   if isstruct(param)
      fields = fieldnames(param);
      for i = 1 : numel(fields)
         if isstruct(param.(fields{i}))
            write(doc, root, fields{i}, '')
            parse(param.(fields{i}), doc, root.getLastChild)
         else
            write(doc, root, fields{i}, param.(fields{i}))
         end
      end
   else
     doc = 'could not convert';
   end
   obj = doc;
end

function write(doc, root, pname, param)
   if isempty(param) == 1
      root.appendChild(doc.createElement(pname));
   else
      elem = doc.createElement(pname);
      if ismatrix(param)
         val = mat2str(param);
      else
         val = num2str(param);
      end
      elem.appendChild(doc.createTextNode(val));
      root.appendChild(elem);
   end
end

How To Unit Test A LINQPad Code Snippet

Posted on Updated on

Writing code is a programmers life; sometimes it becomes necessary to write pieces of code that you can conveniently run and evaluate  without spinning up a full fledged IDE. For those tasks there is a tool called LINQPad. LINQPad allows you to write/run snippets in C#, SQL and a few other languages. In oder to run the example in this tutorial you will need to download LINQPad and NUnit Lite.

After installing LINQPad and NUnit Lite open an instance of LINQPad and change the language to C# Program.

linkp

Next hit the F4 key on you keyboard to bring up the additional references dialog and browse to the location where you installed NUnit Lite. You will need to add NUnit Lite as a reference.

addref

Copy preceding code into the LINQPad edit window then hit the run button, the results of the test will be displayed in the console window, enjoy :-)

void Main()
{
	new NUnitLite.Runner.TextUI().Execute(new[]{"-noheader"});
}


public class Dog
{	
	public string Howl()
	{		
		return "awhooo!";			
	}
	
	public string Growl() {return "Gerrrr!";}
}

[NUnit.Framework.TestFixture]
public class DogTest
{
	Dog fido;

	[NUnit.Framework.SetUp]
	public void init()
	{
		fido = new Dog();
	}
	
	[NUnit.Framework.Test]
	public void Howl()
	{
		NUnit.Framework.Assert.AreEqual(fido.Howl(), "awhooo!", ":-(");
	}
	
	[NUnit.Framework.TearDown]
	public void done()
	{
		fido = null;
	}
}

2013 in review

Posted on

The WordPress.com stats helper monkeys prepared a 2013 annual report for this blog.

Here’s an excerpt:

The concert hall at the Sydney Opera House holds 2,700 people. This blog was viewed about 37,000 times in 2013. If it were a concert at Sydney Opera House, it would take about 14 sold-out performances for that many people to see it.

Click here to see the complete report.

Cisco WebEx API v5.9 C# Integration Class

Posted on Updated on

Example code for integrating with Cisco WebEx Meeting API, provided without warranty :)

using System;
using System.Data;
using System.Net.Mime;
using System.Text;
using System.Net;
using System.Xml;
using System.IO;


public class ConnectWBX
{
    protected string _baseUrl;
    protected string _login;
    protected string _password;

    public enum Role
    {
        HOST,
        ATTENDEE,
        OTHER
    };

    public enum Type
    {
        MEMBER,
        VISITOR,
        PANELIST
    };

    public enum Active
    {
        ACTIVATED,
        REQUEST_TO_ACTIVATE,
        DEACTIVATED
    }

    public ConnectWBX(string baseUrl, string login, string password)
    {
        _baseUrl = baseUrl;
        _login = login;
        _password = password;
    }

    public void CreateUser(string firstName,
                        string lastName,
                        string webExId,
                        string email,
                        string password)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.user.CreateUser\">")
            .AppendLine("<firstName>" + firstName + "</firstName>")
            .AppendLine("<lastName>" + lastName + "</lastName>")
            .AppendLine("<webExId>" + webExId + "</webExId>")
            .AppendLine("<email>" + email + "</email>")
            .AppendLine("<password>" + password + "</password>")
            .AppendLine("<privilege>")
            .AppendLine("<host>true</host>")
            .AppendLine("</privilege>")
            .AppendLine("<active>ACTIVATED</active>")
            .AppendLine("<sessionOptions>")
            .AppendLine("<autoDeleteAfterMeetingEnd>false</autoDeleteAfterMeetingEnd>")
            .AppendLine("</sessionOptions>")
            .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    public void SetUser(string firstName,
                       string lastName,
                       string webExId,
                       string email,
                       string password,
                       string host,
                       Active active,
                       string autoDelete)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.user.SetUser\">")
            .AppendLine("<firstName>" + firstName + "</firstName>")
            .AppendLine("<lastName>" + lastName + "</lastName>")
            .AppendLine("<webExId>" + webExId + "</webExId>")
            .AppendLine("<email>" + email + "</email>")
            .AppendLine("<password>" + password + "</password>")
            .AppendLine("<privilege>")
            .AppendLine("<host>" + host + "</host>")
            .AppendLine("</privilege>")
            .AppendLine("<active>" + active.ToString() + "</active>")
            .AppendLine("<sessionOptions>")
            .AppendLine("<autoDeleteAfterMeetingEnd>" + autoDelete + "</autoDeleteAfterMeetingEnd>")
            .AppendLine("</sessionOptions>")
            .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    public void AuthenticateUser(string webExId)
    {
        var xmlAuthBodyContent = new StringBuilder()
                .AppendLine("<bodyContent ")
                .AppendLine("xsi:type=\"java:com.webex.service.binding.user.AuthenticateUser\">")
            //.AppendLine("<samlResponse><saml:Assertion>uid=" + webExId + "</saml:Assertion></samlResponse>")
                .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    
    public void DeleteUser(string webExId)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.user.DelUser\">")
            .AppendLine("<webExId>" + webExId + "</webExId>")
            .AppendLine("<syncWebOffice>true</syncWebOffice>")
            .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

  
    public string CreateMeeting(string name,
                            string password,
                            string start,
                            string duration)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.meeting.CreateMeeting\">")
            .AppendLine("<accessControl>")
            .AppendLine("<meetingPassword>" + password + "</meetingPassword>")
            .AppendLine("</accessControl>")
            .AppendLine("<metaData>")
            .AppendLine("<confName>" + name + "</confName>")
            .AppendLine("<agenda>" + name + "</agenda>")
            .AppendLine("</metaData>")
            .AppendLine("<attendeeOptions>")
            .AppendLine("<emailInvitations>true</emailInvitations>")
            .AppendLine("<registration>true</registration>")
            .AppendLine("</attendeeOptions>")
            .AppendLine("<participants>")
            .AppendLine("<maxUserNumber>20</maxUserNumber>")
            .AppendLine("</participants>")
            .AppendLine("<enableOptions>")
            .AppendLine("<chat>true</chat>")
            .AppendLine("<poll>true</poll>")
            .AppendLine("<audioVideo>true</audioVideo>")
            .AppendLine("</enableOptions>")
            .AppendLine("<schedule>")
            .AppendLine("<startDate>" + start + "</startDate>")
            .AppendLine("<openTime>0</openTime>")
            .AppendLine("<joinTeleconfBeforeHost>FALSE</joinTeleconfBeforeHost>")
            .AppendLine("<duration>" + duration + "</duration>")
            .AppendLine("<timeZoneID>4</timeZoneID>")
            .AppendLine("</schedule>")
            .AppendLine("</bodyContent>");

       return Request(xmlAuthBodyContent).SelectSingleNode("//*[local-name()='meetingkey']").FirstChild.InnerText;
    }

    public void SetMeeting(string name,
                        string password,
                        string start,
                        string duration,
                        string meetingKey)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.meeting.SetMeeting\">")
            .AppendLine("<accessControl>")
            .AppendLine("<meetingPassword>" + password + "</meetingPassword>")
            .AppendLine("</accessControl>")
            .AppendLine("<metaData>")
            .AppendLine("<confName>" + name + "</confName>")
            .AppendLine("<agenda>" + name + "</agenda>")
            .AppendLine("</metaData>")
            .AppendLine("<schedule>")
            .AppendLine("<startDate>" + start + "</startDate>")
            .AppendLine("<openTime>0</openTime>")
            .AppendLine("<joinTeleconfBeforeHost>FALSE</joinTeleconfBeforeHost>")
            .AppendLine("<duration>" + duration + "</duration>")
            .AppendLine("<timeZoneID>4</timeZoneID>")
            .AppendLine("</schedule>")
            .AppendLine("<meetingkey>" + meetingKey + "</meetingkey>")
            .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    public void DelMeeting(string meetingKey)
    {
        var xmlAuthBodyContent = new StringBuilder()
                .AppendLine("<bodyContent ")
                .AppendLine("xsi:type=\"java:com.webex.service.binding.meeting.DelMeeting\">")
                .AppendLine("<meetingKey>" + meetingKey + "</meetingKey>")
                .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    public void DelMeetingAttendee(string attendeeID)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.attendee.DelMeetingAttendee\">")
            .AppendLine("<attendeeID>" + attendeeID + "</attendeeID>")
            .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    public void CreateMeetingAttendee(string alias,
                                    string email,
                                    Type type,
                                    Role role,
                                    string sessionKey)
    {
        var xmlAuthBodyContent = new StringBuilder()
                .AppendLine("<bodyContent ")
                .AppendLine("xsi:type=\"java:com.webex.service.binding.attendee.CreateMeetingAttendee\">")
                .AppendLine("<person>")
                .AppendLine("<name>" + alias + "</name>")
                .AppendLine("<email>" + email + "</email>")
                .AppendLine("<type>" + type.ToString() + "</type>")
                .AppendLine("</person>")
                .AppendLine("<role>" + role.ToString() + "</role>")
                .AppendLine("<sessionKey>" + sessionKey + "</sessionKey>")
                .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);

    }

    public void RegisterMeetingAttendee(string name,
                                        string title,
                                        string email,
                                        Type type,
                                        Role role,
                                        string sessionKey)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.attendee.RegisterMeetingAttendee\">")
            .AppendLine("<attendees>")
            .AppendLine("<person>")
            .AppendLine("<name>" + name + "</name>")
            .AppendLine("<title>" + title + "</title>")
            .AppendLine("<email>" + email + "</email>")
            .AppendLine("<type>" + type.ToString() + "</type>")
            .AppendLine("</person>")
            .AppendLine("<joinStatus>ACCEPT</joinStatus>")
            .AppendLine("<role>" + role.ToString() + "</role>")
            .AppendLine("<emailInvitations>TRUE</emailInvitations>")
            .AppendLine("<sessionKey>" + sessionKey + "</sessionKey>")
            .AppendLine("</attendees>")
            .AppendLine("</bodyContent>");

        Request(xmlAuthBodyContent);
    }

    public string GetjoinurlMeeting(string sessionKey, string alias)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.meeting.GetjoinurlMeeting\">")
            .AppendLine("<sessionKey>" + sessionKey + "</sessionKey>")
            .AppendLine("<attendeeName>" + alias + "</attendeeName>")
            .AppendLine("</bodyContent>");

        return Request(xmlAuthBodyContent).
            SelectSingleNode("//*[local-name()='joinMeetingURL']").LastChild.Value;
    }

    public string GethosturlMeeting(string sessionKey)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding..meeting.GethosturlMeeting\">")
            .AppendLine("<sessionKey>" + sessionKey + "</sessionKey>")
            .AppendLine("</bodyContent>");

        return Request(xmlAuthBodyContent).
            SelectSingleNode("//*[local-name()='hostMeetingURL']").LastChild.Value;
    }

    /// <summary>
    /// Get meeting information
    /// </summary>
    /// <returns>meeting information</returns>
    public DataSet GetMeeting(string meetingKey)
    {
        var xmlAuthBodyContent = new StringBuilder()
            .AppendLine("<bodyContent ")
            .AppendLine("xsi:type=\"java:com.webex.service.binding.meeting.GetMeeting\">")
            .AppendLine("<meetingKey>" + meetingKey + "</meetingKey>")
            .AppendLine("</bodyContent>");

        DataSet dataSet = new DataSet();
        DataTable dataTable = new DataTable("meeting");

        var xmlSR = new StringReader(Request(xmlAuthBodyContent).SelectNodes("//*[local-name()='body']")[0].InnerXml);
        dataSet.ReadXml(xmlSR, XmlReadMode.InferSchema);

        return dataSet;
    }

    /// <summary>
    /// Return all meetings on server.
    /// </summary>
    /// <returns>List of meetings</returns>
    public DataSet GetAllMeetings()
    {
        var xmlAuthBodyContent = new StringBuilder()
                .AppendLine("<bodyContent ")
                .AppendLine("xsi:type=\"java:com.webex.service.binding.meeting.LstsummaryMeeting\">")
                .AppendLine("<listControl>")
                .AppendLine("<startFrom>1</startFrom>")
                .AppendLine("<maximumNum>10</maximumNum>")
                .AppendLine("<listMethod>OR</listMethod>")
                .AppendLine("</listControl>")
                .AppendLine("<order>")
                .AppendLine("<orderBy>HOSTWEBEXID</orderBy>")
                .AppendLine("<orderAD>ASC</orderAD>")
                .AppendLine("<orderBy>CONFNAME</orderBy>")
                .AppendLine("<orderAD>ASC</orderAD>")
                .AppendLine("<orderBy>STARTTIME</orderBy>")
                .AppendLine("<orderAD>ASC</orderAD>")
                .AppendLine("</order>")
                .AppendLine("</bodyContent>");

        var dataSet = new DataSet();
        
        var xmlSR = new StringReader(Request(xmlAuthBodyContent).SelectNodes("//*[local-name()='body']")[0].InnerXml);
        dataSet.ReadXml(xmlSR, XmlReadMode.InferSchema);

        return dataSet;
    }

    /// <summary>
    /// Build and run WebEx server requests.
    /// </summary>
    /// <param name="action"></param>
    /// <returns></returns>
    protected XmlElement Request(StringBuilder action)
    {
        var conn = WebRequest.Create(_baseUrl);
        conn.Method = "POST";

        conn.ContentType = "text/xml; charset=utf-8";

        byte[] byteArray = Encoding.UTF8.GetBytes(BuildRequestXML(action));
        conn.ContentLength = byteArray.Length;

        conn.GetRequestStream().Write(byteArray, 0, byteArray.Length);

        var resp = conn.GetResponse();

        var resultStream = resp.GetResponseStream();

        var doc = new XmlDocument();
        if (resultStream != null) doc.Load(resultStream);

        doc.DocumentElement.InnerXml = doc.InnerXml.Replace("<serv:header xmlns:serv=\"http://www.webex.com/schemas/2002/06/service\">", "").Trim();

        GetStatus(doc.DocumentElement);

        return doc.DocumentElement;
    }


    /// <summary>
    /// Build request url
    /// </summary>
    /// <param name="action"></param>
    /// <returns></returns>
    protected String BuildRequestXML(StringBuilder action)
    {
        Func<StringBuilder, StringBuilder> webExXML =
        bodySB => new StringBuilder(1024) 
            .AppendLine("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>")
            .Append("<serv:message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")
            .Append(" xmlns:serv=\"http://www.webex.com/schemas/2002/06/service\"")
            .Append(" xsi:schemaLocation=\"http://www.webex.com/schemas/2002/06/service")
            .Append(" http://www.webex.com/schemas/2002/06/service/service.xsd\">")
            .AppendLine("<header>")
            .AppendLine("<securityContext>")
            .AppendLine("<siteName>sitename</siteName>")
            .AppendLine("<siteID>554589</siteID>")
            .AppendLine("<webExID>" + _login + "</webExID>")
            .AppendLine("<password>" + _password + "</password>")
            .AppendLine("<partnerID>78dfrt</partnerID>")
            .AppendLine("</securityContext>")
            .AppendLine("</header>")
            .AppendLine()
            .AppendLine("<body>")
            .Append(bodySB)
            .AppendLine()
            .AppendLine("</body>")
            .AppendLine("</serv:message>");

        return webExXML(action).ToString();
    }

    private void GetStatus(XmlElement response)
    {
        var code = response.SelectNodes("//*[local-name()='result']").Item(0).InnerText;
        if (code != "SUCCESS")
        {
            var subcode = response.SelectNodes("//*[local-name()='reason']").Item(0).InnerText;
            throw new Exception("request: " + code + " -> reason: " + subcode);
        }
    }
}