Hello Mobile: New job as Android developer



Hello Mobile Inc.
I'm delighted to announce my new job as an Android App developer at Hello Mobile in Tallinn.


Real-Time Social Network

Share your life automatically in a private, real-time social network. Keep up and stay connected with your family and friends in a brand-new way.

Turn your daily journey into a story you can share. See where you've been, where your people are and what they're doing. Never text or call again.
 
 
 

PHP Example Code, Taxi App

This code was written for a customer who contracted me to write a Hailo style Taxi App. They also needed a PHP server good enough to demonstrate that the app worked (I think they were going for funding). Even though I'm not a PHP programmer I am flexible and can generally learn on the fly.



<?php
 /* 
 Taxa server to be used with Taxa iPhone App.
 Copyright 2011 <name>
 V1 Writen by Keith Loughnane (loughnanedevelopment@gmail.com)
 */
 //Only use echo of device data
 //Use debugMsg for debuging
 
 
 //TODO Time
require_once ("gps_class.php");
$AproachDist = 5; //KM
$ArriveDist = 0.5; //KM
$timeoutTime = (5*60); //Seconds
$id = $_GET['id'];
$url = $_SERVER[SCRIPT_NAME]."?".$_SERVER[QUERY_STRING]; 
$debug = false;
//Setup MySQL connection
$conn = mysql_connect("mysql9.unoeuro.com","needataxino_com","opjunk64");
mysql_select_db("needataxinow_com_db",$conn);
//See if there is anything to be done, most timeouts for inactive devices
 //Uncomment to reset
/*
$sqlStmnt = "delete from messages";
$result = mysql_query($sqlStmnt,$conn);
$sqlStmnt1 = "delete from devices";
$result = mysql_query($sqlStmnt1,$conn);
$sqlStmnt2 = "delete from pickupCalc";
$result = mysql_query($sqlStmnt2,$conn);
$sqlStmnt3 = "delete from pickups";
$result = mysql_query($sqlStmnt3,$conn);
*/
  debugMsg("BEGINING INTERACTION URL=" . $url);
  //housekeeping();

C# Code Example, Omnipressent

Omnipressent was an experiment I worked on, the idea was to use varius services like vnc and file transfers to give the impression that multiple computers were one system. Allowing users to drag files from one desktop to another or take control of the speakers on another computer. To make the development manageable I couldn't write each service from scratch so I worked out a way of wrapping services others had developed and coming up with a constant way of passing messages to them and even allowing services to pass messages between each other.

Below is the OmniService class that any service we want to use in our program needs to extend. Mainly it needs to provide a way of getting messages and sending messages.



using System;  
 using System.Collections.Generic;  
 using System.Text;  
 using System.Collections;  
 using System.Diagnostics;  
 namespace Omnipressent {  
   public abstract class OmniService {  
     protected ArrayList messageQue;  
     public int targetHost = -2;  
     public OmniService() {  
       messageQue = new ArrayList();  
     }  
     public void generateMessage(Message msg) //From this class out. giveMessage isward.   
     {  
       messageQue.Add(msg);  
     }  
     public Message getMessage() {  
       Message returnMessage = null;  
       if (messageQue.Count != 0) {  
         returnMessage = (Message)messageQue[0];  
         messageQue.RemoveAt(0);  
       }  
       // #if DEBUG //---------------------------------------------------------------  
      /* debugLog(this.GetType().Name + " MESSAGES. Count = " + messageQue.Count);  
       for (int i = 0; i < messageQue.Count; i++) {  
         debugLog("i=" + i + "] " + messageQue[i].ToString());  
       }*/  
       //#endif //------------------------------------------------------------------  
       return returnMessage;  
     }  
     public abstract void giveMessage(Message message);  
     protected void setTargetHost(int host)  
     {  
       //debugLog(this.GetType().Name + "Changed TargetHost to >> " + host.ToString());  
       targetHost = host;  
     }  
     protected void debugLog(string s)  
     {  
       Debug.WriteLine(s);  
       generateMessage(new Message(0, messageTypeEnum.ServiceGUI, messageEnum.PrintDebug, s));  
     }  
     protected void warningLog(string s)  
     {  
       generateMessage(new Message(0, messageTypeEnum.ServiceGUI, messageEnum.PrintWarning, s));  
     }  
     protected void infoLog(string s)  
     {  
       generateMessage(new Message(0, messageTypeEnum.ServiceGUI, messageEnum.PrintInfo, s));  
     }  
   }  
 } 
It actually took a while to figure out how to do make this this simple. The message itself is below





using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
//using System.Threading.Tasks;
using System.Diagnostics;

/**************************************************
 * TargetHost numbers:
 * -3 To the Webservice for the services consumption
 * -2 Null, just a safe place to point things
 * -1 Write to file
 * 0 Use internaly, pass to service
 * >0 Pass to host via webservice
 * */
namespace Omnipressent {
    public class Message {
        public messageTypeEnum messageType;
        /*{ //Fix this
            get { return messageType; }
            set { messageType = value; }
        }*/
        public int targetHost = -2; //-2: Unset/nowhere, -1: To log, 0 Internal, n host number.
        public messageEnum message;
        public String arguments;
        public int key = -2;  //-2 unset
        public int requestingHost = -2; //-2 unset. This host, get by ServiceWebService on Authentication with WebService.

        public Message(int targetHost, messageTypeEnum mt, messageEnum msg, String args) {
            this.targetHost = targetHost;
           // messageType = new messageTypeEnum();
            messageType = mt;   message = msg;  arguments = args;
        }


        public Message(string msg)
        {

            /***************************
             * Takes a message in string form. 
             * This string could be from the console, 
             * the network or a script file.
             ***************************/


            string[] splitMessage = msg.Split(','); //Split up parameters.
            try
            {
                //SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");
                 targetHost = (Convert.ToInt32(splitMessage[0]));
                   messageType= (messageTypeEnum)Enum.Parse(typeof(messageTypeEnum), splitMessage[1]);
                   message = (messageEnum)Enum.Parse(typeof(messageEnum), splitMessage[2]);
                    arguments = splitMessage[3];

                

                if(splitMessage.Length > 5) //Long form
                {
                    try
                        {
                    requestingHost = Convert.ToInt32( splitMessage[4]);
                    key = Convert.ToInt32( splitMessage[5]);
                        }
                        catch(Exception ex)
                    {
                           Debug.Write("MESSAGE INIT EX : \n" + msg);
                        }
                }
                
                //dbgLog("Create message from string : " + m.ToString());
            }
            catch (Exception ex)
            {

               Debug.WriteLine("Exception parsing message ex : " + ex.ToString());
               // throw new ArgumentException("Invalid message string exception", msg);

                
                //dbgLog("Message from string exception ex : " + ex.ToString());
                try
                {
                     /*debugLog("Received string message : " + msg.ToString());
                     debugLog("S0 = " + splitMessage[0]);
                     debugLog("S1 = " + splitMessage[1]);
                     debugLog("S2 = " + splitMessage[2]);
                     debugLog("S3 = " + splitMessage[3]);*/
                }
                catch (Exception ex2)
                {
                    //dbgLog("Could not print values.");
                }

                //dbgLog("\n\n");
               //printEnumValues();
            }
        }

        public override string ToString() {
            return targetHost + "," + messageType.ToString() + "," + message.ToString() + "," + arguments + "," + requestingHost + "," + key;
        }
        //public Message messageType
    }

    public enum messageTypeEnum {
        /*******************************************
         * WARNING: Setting up of the services in theHub is strongly linked to these values
         *******************************************/
        ServiceInfo = 0,
        ServiceCommandClient = 1,
        ServiceScriptSetter = 2,
        ServiceScriptGetter = 3, //Not used
        ServiceVNCClient = 4,
        ServiceVNCServer = 5,
        ServiceClipboardSetter = 6,
        ServiceClipboardGetter = 7,
        ServiceHIDGetter = 8,
        ServiceHIDSetter = 9,
        ServiceScreenSlide = 10,
        ServiceScreenBlocker = 11,
        ServiceGUI = 12,
        ServiceController = 13
   
        

        /*
            services[4] = new ServiceVNCClient();
            services[5] = new ServiceVNCServer();
            services[6] = new ServiceClipboardSetter();
            services[7] = new ServiceClipboardGetter();
            services[8] = new ServiceHIDGetter();
            services[9] = new ServiceHIDSetter();
            services[10] = new ServiceScreenSlide();
            services[11] = new ServiceScreenBlocker();
         */
        
    }

    public enum messageEnum {
        //Common
        MessageParseProblem,
        SetTarget,

        //Info
        Version, PrintHelp, GiveHostInfoXML, GetHostInfoXML, GetLocalHostInfoXML, UpdateInfo,setUsernamePassword,
        //HID Messages
        StopGettingMouse, StartGettingMouse, StopGettingKeyboard, StartGettingKeyboard,
        KeyUp, KeyDown, MouseX, MouseY, MousePos, LeftDown, MidDown, RightDown, LeftUp,MidUp,RightUp,MouseMove, ScrollUp, ScrollDown,


        //ServiceScriptSetter
        SaveToFile,

        //ServiceScriptGetter
        ReadScript,SetPath,

        //Net Messages
        //TODO

        //RDP Messages
        //TODO
        //GUI
        PrintInfo, PrintDebug, PrintWarning,

        //Blockerform
        Block,Unblock,
        //VNC Client Messages
        Connect, Disconnect, Centre, GetStatus, ScrollCenter, ScrollLeft, ScrollRight, SetClipText,
        //SlideScreen
        GetScreen, HideScreen, ShowScreen,
        //VNC Server Messages
        Start, Stop, SetPort,
        //ScriptOut
        Delete,
        //Clipper
        SetClipboardText, 

        //CommandService
        GetMessages, Register, StartClientAuth, CheckClientAuth, StartServerAuth, CheckServerAuth, ConfirmClientAuth, ConfirmServerAuth
    }}


Last but not least the Hub class. The Hub class actually took a lot of work. I tried developing this project before and the whole thing became too unwieldy to continue and I had to find a new route. The Hub is the controller (In the MVC sense) for the whole program. It's pretty small but it took a lot of planning and re-planning to get it that small and if I wasn't coding this whole thing by myself I probably wouldn't have put so much time into making this so small but I needed it to be manageable. I replaced the old controller with more of a message router and by doing that reduced a lot of code I had to write. Any startup functions I needed were outsourced to a script that ran, a happy byproduct of the way messages worked was they could be stored in a text file, essentially creating a scripting language with no extra effort. 



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Collections;
using System.Diagnostics;

namespace Omnipressent
{
    class Hub
    {
        bool running = true;
        string startupScriptPath = "startup.os";
        OmniService[] services; //Array containing all services.
        ArrayList messagesWaiting;
        GUI theGUI;

        public Hub()
        {
            int noOfMessageTypes = 0;
            messagesWaiting = new ArrayList();
            

            //This counts the number of message types to set the size of the services array.
            foreach (messageTypeEnum messageType in (messageTypeEnum[])Enum.GetValues(typeof(messageTypeEnum)))
                noOfMessageTypes++;  //There has to be a better way


            services = new OmniService[noOfMessageTypes];

            /*I have to say, I'm pretty proud of this. Almost everything is a service.
             *Enumerators matching the service names are used for routing messages (see sexy mainloop code).
             *The same enumerators are used for indexes here. Because I abscrated nicely you can be fairly agnostic when
             *Dealing this services and as such this control is fairly simple. Collects, routes and gives messages */

            services[messageTypeEnum.ServiceInfo.GetHashCode()] = new ServiceInfo();
            services[messageTypeEnum.ServiceController.GetHashCode()] = new ServiceController();
            services[messageTypeEnum.ServiceScriptGetter.GetHashCode()] = new ServiceScriptGetter();
            services[messageTypeEnum.ServiceScriptSetter.GetHashCode()] = new ServiceScriptSetter();
            services[messageTypeEnum.ServiceVNCClient.GetHashCode()] = new ServiceVNCClient();
            services[messageTypeEnum.ServiceVNCServer.GetHashCode()] = new ServiceVNCServer();
            services[messageTypeEnum.ServiceClipboardSetter.GetHashCode()] = new ServiceClipboardSetter();
            services[messageTypeEnum.ServiceClipboardGetter.GetHashCode()] = new ServiceClipboardGetter();
            services[messageTypeEnum.ServiceHIDGetter.GetHashCode()] = new ServiceHIDGetter();
            services[messageTypeEnum.ServiceHIDSetter.GetHashCode()] = new ServiceHIDSetter();
            services[messageTypeEnum.ServiceScreenSlide.GetHashCode()] = new ServiceScreenSlide();
            services[messageTypeEnum.ServiceScreenBlocker.GetHashCode()] = new ServiceScreenBlocker();
            services[messageTypeEnum.ServiceGUI.GetHashCode()] = new ServiceGUI();
            services[messageTypeEnum.ServiceCommandClient.GetHashCode()] = new ServiceCommandClient();
            RunStartupScript();
            while(running)
                mainLoop();
        }

        private void RunStartupScript()
        {
            messagesWaiting.Add(
                new Message(0,messageTypeEnum.ServiceScriptGetter,messageEnum.SetPath,startupScriptPath)
                );
            messagesWaiting.Add(
                new Message("0, ServiceScriptGetter, ReadScript, 0")
                );
        }

        public void setGUI(GUI g)
        {
            theGUI = g;
        }

        public void mainLoop()
        {
            dbgLog("Main Loop Started ************************************************************");
               
            foreach (OmniService s in services)
            {   //Get messages from each service
                    while (true)
                    {
                        dbgLog(s.GetType().Name.ToString());
                        Message m = s.getMessage();
                        if (m == null)
                            break; //This feels a little wrong but it works well
                        messageIn(m);
                    }
            }
            foreach (Message msg in messagesWaiting)
            {   //Deliver messages
                    //msg.targetHost == -2 goes nowhere intentionaly. This is like /dev/null
                    if(msg.targetHost == -2)
                    {
                        //System.Windows.Forms.MessageBox.Show("targetHost set to -2. Service running without being configured. Message : " + msg.ToString());
                    }
                    if (msg.targetHost == -1) //To Log / Script
                        //this.messagesWaiting.Add( //Apparently you can't add to this in the foreach

                        services[messageTypeEnum.ServiceScriptSetter.GetHashCode()].giveMessage(
                        new Message(0, messageTypeEnum.ServiceScriptSetter, messageEnum.SaveToFile, msg.ToString())
                        );
                       // );
                    /* The above line might be a little confusing. 
                     * If hostID == -1, that means print to file, 
                     * this is used mainly for logging out HID info so it can be read back in.
                     * What I'm doing is nesting a Sting of a message in a message destied for Serviceoutput.
                     * The message I'm saving is the argument in anouther message telling ServiceOutput to Save To File
                     */

                    if(msg.targetHost == 0) //Internal / Local
                    services[msg.messageType.GetHashCode()].giveMessage(msg);

                    if (msg.targetHost > 0 | msg.targetHost == -3) //>0 to other host routed though webservice. -3 of webservice itself;
                    {
                        services[messageTypeEnum.ServiceCommandClient.GetHashCode()].giveMessage(msg); 
                    }
            }
            //Asume all delivered or undelivable. Drop all messages
            ((ServiceController)services[messageTypeEnum.ServiceController.GetHashCode()]).Tick();
            messagesWaiting.Clear();
            addStandingOrders();
            dbgLog("MainLoop finished-----------------------------------------------------------------------");
            omniWait();
        }
        public void addStandingOrders()
        {
            //This is for adding messages that are run each loop
            //messagesWaiting.Add(new Message(0, messageTypeEnum.ServiceInfo, messageEnum.UpdateInfo, ""));
            //messagesWaiting.Add(new Message("0,ServiceCommandClient,GetMessages,,"));
        }

        public void omniWait()
        {
            //This will eventualy become more complex, hence moving it out onto it's own method
            System.Threading.Thread.Sleep(5000);
        }

        public string info()
        {
            //printEnumValues();
            return "Super alpha V0.0 turbo edition.";
        }
        public void messageIn(Message msg)
        {
            /***************************
             * Takes a message in message object form.
             * This is internal and already processed
             * ready for routing
             ***************************/
            messagesWaiting.Add(msg);
            //debugLog("Received Message Message : " + msg.ToString());
        }
        public void messageIn(String msg)
        {
            messageIn(new Message(msg));
        }
        /*public void printEnumValues()
        {
 
            string messageTypes = "";
            string messages = "";

            foreach (messageTypeEnum messageType in (messageTypeEnum[])Enum.GetValues(typeof(messageTypeEnum)))
                messageTypes += messageType.ToString() + "\n";

            foreach (messageEnum message in (messageEnum[])Enum.GetValues(typeof(messageEnum)))
                messages += message.ToString() + "\n";

            dbgLog("Message Types available:");
            dbgLog(messageTypes);
            dbgLog("Messages available:");
            dbgLog(messages);

        }*/
        public void debugLog(string s)
        {
            messagesWaiting.Add(new Message(0, messageTypeEnum.ServiceGUI, messageEnum.PrintDebug, s));
            //debugLog(s);
           // theGUI.consoleWrite(s);
        }
        public void dbgLog(String s)
        {
            Debug.WriteLine("S:" + System.DateTime.Now.Second.ToString() + "." + System.DateTime.Now.Millisecond.ToString() + " > " + s);
        }
    }
}

How I debug messy code.

I’ve been asked a couple of time how you debug code and I think the best way to spend a couple of years fixing someone else Spaghetti code. In fact think colleges should do more projects that involve working with a very tangles codebase so students can better understand the importance of writing clean, decoupled code but short this is what you can do.

Limit how far a mistake can compound without being caught. In a perfect world the code you are given will be nice tidy units that you give an input and get an output and if that output is incorrect you know the problem is somewhere in that unit. Spaghetti code is the opposite everything is connected in complicated, unplanned and messy ways. Usually in this case you’d love to refactor the whole thing but you have a release the next day and it just needs to be fixed. If you don’t have nice clean units you might have to trace the problem backwards from the final result like untangling christmas lights. Someone of the code I’ve been given renamed variables several times in the process even changing datatypes for no reason like string TICKETNUMBER, int ticketNumber, char[] TICKET_NUMBER. In this situation you have to start with the variable you are sure of that that was the one shown on the screen at the end of the process. You can follow it back using breakpoints or debug text until you find the point where something went wrong.


Initially don’t jump to conclusions just try to understand what is going on. Some people just want to impose a conclusion on what is going on and act based on that but when it comes to a messy codebase remember the NASA saying “no situation is so bad that you can’t make it worse”. If you do chose to make a change be very conservative.

If the code is very convoluted and not clear what is happening I like to add a lot of temporary debug login. Usually with some id for each line and a bit of detail like

100 TICKETNUMBER = unset ticketNumber = 100231
200 TICKETNUMBER = 100231 ticketNumber = 100231
300 TICKET NUMBER = 100231 ticketNumber = 100232


I will usually add these every ten lines or so in a section where I think there might be a problem, more if necessary. In the above section we have a problem where the ticket number is not being updated properly because we have two variables for the ticket number, one is being updated and the other isn’t. The real solution to this is to get ride of one of the variables to avoid confusion.

If I want to narrow it down further I will add more debug code between 200 and 300. like DebugOut(“110 TICKETNUMBER = ” + TICKETNUMBER + “ticketNumber = “ + ticketNumber.toString());

I will often do this divide and conquer style putting a log output at the top of a function and one at the bottom and if there is a problem in the function I will at one in the middle, then one a quarter of the way down and so on until I find the line with the problem.

Sometimes thought the problem is so weird or so many variables are connected that it’s not that easy. Then I like to employ the scientific method. Narrow it down as much as you can. Here it’s not so much about find where the problem is, but where the problem is not. Is the data bad before it gets to the view, rule out the view. eliminate every class that isn’t a problem, any method. You might still have a big snakes nest of code to go through but try to eliminate anything you can, 2000 lines of code is still better than 4000 but then again don’t jump to conclusions, if you are not 100% sure don’t eliminate it.

Try to understand it as much as you can, think like a physicist, you can’t know everything but learn what you can so you can make educated hypotheses. Then when you have step back from the code, even leave the office. And on a note pad write down every hypothesis you can think of that might cause the problem try to come up with a dozen or more, really try to exhaust all your ideas. Then scribble down an experiment to test each, test a value at this point, try this input. etc. Then try them out, either you will solve the problem or you will have a more detailed understanding to make more hypotheses. You’ll hit a wall doing this a lot and I find taking a walk really helps.

Of course the real solution for all of this is to write good code in the first place and a messure of how good the code is is how much these things are contained. If the code you are working with is grabbing for variables from all over the place without properly passing them so much that it’s hard to keep track of that’s a bad thing.

Code should be contained in a way where you a unit does it’s job taking only what it needs and destroying variables when it’s finished with them. To take our real ticket number example it made send for there to be a ticketNumber accessible and stored for the whole run of the application but a single int value would have made more sense (than the 6 that were used). My guess is that the developer wanted a string type to do something like this “Current ticket number is 100132” but stored that string globally and used it inconsistently though out the program. It would have made more send for the int to the stored for the run and have the string passed temporarily. So instead of this:
———
//At the top

string TICKETNUMBER;
int TicketNumber,

———
//Some random spot
TICKETNUMBER = “Ticket number is “ + TicketNumber.toString();
———
//Updating screen
TicketLabel.text = TICKETNUMBER;


Something like this is cleaner.

——————
// Something like this

Public string getTicketNoString()
{
return “Ticket number is “ + TicketNumber.toString();
}

—————
//Later

TicketLabel.text = getTicketNoString();


The difference here is that the string only exists for a moment, long enough to insert it into the label and then it is destroyed. I eventually ended up moving the int TicketNumber into a container and using a getter and setter but the point is to keep things crystal clear and to try to prevent ad hoc accessing variables. If your just grabbing a value from another class maybe it’s a bad idea, maybe it should be passed in the header or there is a clearer way to do it. Will the next programmer know what you were trying to do.

Initial thoughts on Android platform


Initial thoughts on Android platform and review of the programming experience from the perspective of an iPhone developer

  

Resumé

K e i t h  L o u g h n a n e

  1. S o f t w a r e  D e v e l o p e r

  1. www.linkedin.com/in/keithloughnane
  2. www.github.com/keithloughnane
  3. www.keithloughnane.com
  4. keith.loughnane@gmail.com

RSS/XML iOS Weather App

Weather was an ObjectiveC app that connects to a weather RSS service and parses XML to show Weather information view Icons and text.

FineTracker Online

FineTracker Online is a new Ruby on Rails based port of the existing desktop based FineTracker software. FineTracker is used by local government to manage parking tickets, evidence, court documents, photographs and integrates with Impalas Windows Mobile software for traffic wardens producing the tickets.
This application is a Ruby on Rails port to allow for offering FineTracker as software as a service.

Omnipressent. Too many devices?

How many devices do you own? Personally I find it frustrating that each device is it's only silo of files, resources and settings. This is an idea I've been playing with for a while the get my devices to act like one device.

I developed a C# application to test the idea, combining services like VNC, HID sharing and scripts to try to produce a seamless experience across various computers.

Client Construct Concept


Buying a house is very complicated. It involves auctioneers, mortgages, lawyers, builders and subcontractors and most people are unprepared for the process. That lack of preparation is both stressful for the customer and causes costly delays for the builder. The concept of Client Construct was developed in a builder building housing developments from scratch to help customers through the process of buying and building a new house from install interest, through sale, construct, customization, snags and handing over the keys.

2nd place at Google startup weekednd: Haulio concept


Haulio was a concept developed in a few hours during StartUp Weekend at the University of Limerick. It allows hauliers (truck drivers) in the construction industry to see what jobs are available from quarries to building sites or scrap removable and allows them to stream line a process that up to now is very ad-hoc and difficult to manage.

Using on-line updates to improve services and reduce maintenance times.

With the introduction of online updates we have reduced man hours spent on the road significantly as well as reducing development time and bugs related to software fragmentation ie: have several different versions.


  

Cross platform Cordova app development with Telerik/Progress.

Cross-platform cordova application development with Telerik/Progress. I was lucky enough to be attending training with Telerik/Progress in Dublin learning how to develop cross platform mobile applications for Windows Mobile, iOS and Android with Teleriks software which deploys to an web application server to be run in your phones browser and can also deploy cross platform Cordova hybrid application or compile to native applications for Windows Mobile, Android or iOS (Apple).

Fizz & Hummer

Fizz and Hummer is a scrolling shooter game. The player plays as either Fizz or Hummer two Honey Bees out to save there kidnapped queen from the evil wasps. As you fly through levels you must fight of enemies like ants, spiders, hornets ect. Two player can play as Fizz and Hummer cooperative over a network using two iPhones. It was nice to work on partly because the client had a fleshed out idea complete with story.
   We decided to use LevelSVG as the basis since I had worked with it before and liked it.

Technologies: iPhone / iOS, Objective C, LevelSVG/Cocoas2D, Network Sockets

Securecom; Wireless Personal Alarm, Emergency Software, SMS parser

The Wireless Personal Alarm (WPA/XPA) a pendant like electronic device for use by the old, infirmed and people in high risk situations developed by securecom technologies Ltd. Upon pressing a button on the device it finds the nearest bluetooth phone and GPS unit and uses it to send an emergency SMS message. I worked on this device and created the software that receives and process it's message and displays it on a map.

NeedATaxiNow, iPhone App, PHP Server

This application was for a client. He wanted an iPhone application that could serve two roles. It had to allow a customer, someone you would like to order a taxi to tap a button and have a taxi  ordered as simply as possible. The nearest taxi using the app would be informed that they had a potential customer and decide whether to accept or allow another taxi to pick the person up.
They also needed a centralized server that would allow for taxies and customers to be managed and potentially allow future software to interact with the system.

Programming beyond programming

I pride myself on being a good software developer and being a software developer involves coding but to be a good developer you have to look at software development more broadly.


  

2nd prize at Google Statup Weekend in Limerick

I recently attended Start-up Weekend Limerick where I had an amazing time. The idea is you start Friday at six O Clock, come up with new ideas, form groups and by Six O'clock on Sunday you develop and pitch your business idea.

Over the weekend our little company formed, merged, split and pivoted. It was at times stressful and frustrating but it was amazing fun and an amazing experience. Some teams developed working mobile apps, websites and products over the two days. On Sunday the last day we realized the original idea wasn't working so our team decided to start from scratch.

Gravitation; iPhone App

Description: Gravitation was my first iPhone app. It was initially developed as a prototype in C sharp before I made the jump to iPhone. The engine although simple was made from scratch, I also made all the graphics.

Technologies: iPhone, ObjectiveC, C Sharp, Physics, Graphics

Virtual Network Lab: Part 2

I showed how to build a Network lab using VMWare and Virtual machine but now I need it to do more. I can only connect one host to the network, I want to be able to contact my network from anywhere, I want a dedicated Attack network and another for Experimenting with active directory and Windows security and I'm building a media center from a Mac Mini.

Security Mistakes Programmers Make

I think it's fair to assume most novice or even intermediate programmers are looking to just get the thing to work, compile without errors, to not crash and to do the job it was designed to do. So unfortunately most programmers are unaware of the common security risks we can unwittingly write into our code. In no particular order here are the security problems software developers should look out for.

OpenStack Meetup / Software Defined storage


I recently attended an interesting OpenStack meetup/lecture on Software defined Storage or metering, touching on software defined networking. Here's the description:

Parallel, 3D Game

Technologies: C++, 3D, Ogre3D Engine, Blender 3D
My Responsibly: Software, Physics, Control, AI, Design, 3D Modeling, Some Texturing, Collision, World switching dynamic.
Not my work: Original Ogre3D Graphics Engine, Base Textures.
Description: Parallel is an experiment in game design, AI, Game engine development and the broader issues of developing a 3D game.

Very Simple Puplic Key Encryption and Certificates

Possibly the most important idea used to secure your data and authentication is Public-Private Key encryption. I learned to do the maths of this in college and while I can do it on pen and paper I'll confess I don't fully understand the mathematics, it has something to do with prime numbers and prime pairs but you don't need to understand the maths, in fact you don't need to understand the maths to be able to design a system based on these concepts. All you need to understand is it's a form of encryption where one key encrypts the message and another key decrypts it.

Pipes and Redirects

The UNIX philosophy is that programs should do one job and do it well. To do more complicated tasks programs can be chained together using pipes but before we go on we have to discuss input output streams. There are three standard streams in Linux; stdin, stdout and stderr. stdin provides input to a program, for example the text you type into the console. stdout provides the usual output from a program for example the feedback from the console. Finally stderr is the output stream for error messages.

Netcat Ninjutsu

Netcat is a an extremly flexible tool. It follows the Unix physiology that programs should do one thing and do it well. At it's simplest netcat allows you to connect to and listen to UDP or TCP sockets but as I'll show it can be very powerful. It comes standard on most Unix's including Linux and BSD and can be freely downloaded for windows.

Project: Physical Analytics server

Technologies: Linux, C++, Multithreading, Network Sockets, MySQL
My Responsibly: Design, Code

Description: This server provides a back end for the Physical Analytics iPhone app. Allowing iPhones to synch their workout data. Physical Analytics the iPhone fitness app I wrote had a network component, the app was designed to be a client to a server program that could manage the backup of data and sharing of data logged by the application. This meant that software could share training data between iPhones and could for example be sent to a trainer or downloaded onto PC software for analysis.

UX Idea: Visual Pipes

Pipes are a way of connecting two or more console programs so that the output of one becomes the input of the other. This allows simple programs to be connected together to do something complex. Visual pipes are a graphical equivalent. It can be very frustrating waiting for your computer to finish one task so you can start the next.

Physical Analytics: PC Utility

Technologies: C Sharp, Network, SQL
Project Size: 1/5
My Responsibly: Design, Programming
Not my work: Google Maps
Description: Physical Analytics is an fitness iPhone app. This Utility is a C Sharp program for the PC that can synch with the iPhone app, Save the data and process the data.

What it does
The program loads up data produced by the iPhone app, parses it and displays it on a map and graphically shows X,Y and Z acceleration for any number of training sessions. It can also export this information to Microsoft Excel format.

Thesis; Sound Location Project

Technologies: Physics, Academic, C Sharp, Audio
Project Size: 4/5
My Responsibly: Thesis Idea, Research, Hypothesis, Testing, Presenting, Software Development.

Description: A sound such as a gunshot can be found using the speed of sound and trigonometry but requires distance. I aimed to prove that the intensity (volume) of a could be used to find a sound in a shorter distance such as within a building.

CIX Datacenter

At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod ma