Brandon McCulligh's Portfolio
Portals, Walls and Key Bindings!
Posted: 3/18/2013
      I had some time waiting on a contract to be signed and figured I would take the opportunity to finish Snake Rawr Rawr as it was so close to completion. The latest version has all of the originally planned features that were not completed due to time constraints. This includes, portals to warp across the screen, random walls that generate different shapes and sizes, and also the ability to configure controls for the snake under the options menu.

      If you previously installed Snake Rawr Rawr then the next time you run the game you should be prompted that an update is available. If the update fails, temporarily disable your firewall (not antivirus) as I do not have an SSL certificate at this time. If you do not have Snake Rawr Rawr you can head over to the Games page to find the information and the installer.

      Enjoy and I hope you have as much fun with this game as I do. As always, feel free to contact me incase of any problems or for feedback.
Top

Version 2 Is Here!
Posted: 2/16/2013
      The long awaited version 2 of my portfolio is finally here. This is what I initially envisioned for my portfolio but due to the job search I had to release version 1.0 with the bare minimum to help my cause (and it did; Wahoo).

      Version 2 wasn’t without its hurdles and was also delayed by paid contract work (paid work is always > unpaid work). Version 2 had roughly 12 high level tasks with many subtasks underneath to make a total of 49 tasks that I wanted to achieve for this version of my portfolio, along with performance upgrades, and bug fixes. You will find several new features with this version such as;
      -      Articles I have written on websites (some of which were featured)
      -      Proof of concepts I have worked on
      -      Recommendations I have for aspiring developers
      -      Videos for tools, games, proof of concepts and articles
      -      Navigational redesign
      -      Cosmetic updates

      I hope you enjoy the new site as much as I do. As always if you run into any problems with anything or have any suggestions I would love to hear it no matter how critical.
Top

And We Are Live!
Posted: 9/7/2012
      Welcome to version 1.0.0.1 of my Online Portfolio, please note the site looks best in a CSS3 compliant browser such as Chrome, FireFox and IE 9; without one of these browsers the site will look terrible and I have no intention on “fixing” it. The site is very crude at the moment as I wanted to just get it out there with some content. I currently have a long list of things I want to do for version 2.0.0.0 of the site which I am hoping to have out by the New Year.

      Learn, play and have fun with some of the freeware games and tools I have developed over the past several years of free time development. Please keep in mind while playing games that I in no way, shape or form claim to be an artist and am very aware that the graphics are terrible.

      If you experience any problems, have a request or just want to say thanks for this, I am all ears. Contact me under one of the methods on the Contact page and I will be sure to get back to you as soon as I can. At this time I am only accepting requests for simple tools; no game. Why you ask? The short answer is; Game development takes a lot longer than a tool.

      Enjoy and I would love to hear your thoughts; negative, positive, neutral or even yellow (what is a yellow thought??).
Top

Portfolio Update Tool Complete!
Posted: 7/8/2012
      I have completed the tool to build content for this website. In the process, as expected I ran into some bugs in the new framework so I fixed a whole slew of them. Also the functionality I built out into the DAL generator initially, was very solid and is used throughout the tool but during my first integration with it I found a couple of types of data that I needed frequently such as retrieving lists of objects. An example of this is for association tables I found myself needing a list of ProjectLanguageAsscoations quite frequently, so I built in this functionality now out of the box for the DAL generator; it too uses variable injection and builds these fields for Foreign Key (FK) entries.

      Some of the bugs I ran into during this integration were very interesting. I ran into one with the Communications framework where Dates were not being written to the database....no error was thrown but it wouldn't write. It turned out to be a couple of very stupid (always seems to be) small problems. The first was the database software accepts only specific formats of Dates and there is no way to specify the format you want. Once I figured that out and corrected it, the date still wouldn't write.....it ended up that again the format had to be exact. Anything before 10 had to be padded with a leading 0 such as this month (July) couldn't be "7", it had to be "07". Another bug that stumped me for a little was when I tried to read data out of a table via code it would crash yet the exact same query on the database would work. It was throwing unique constraint violations but yet it was allowing me to insert the data (as it should have as I was entering "summary" and "Summary" for 2 different records). It ended up being that there is a property on the ADO.NET DataTable object that enforces case sensitivity. I personally thought this was quite strange as you would think the database software should be left up to enforcing these constraints but oh well; another bug slain.

      Anyway now it is time to write the last layer of this process which is the actual website and then use this tool to populate it with the backlog of content I have sitting around.

Until next time, cheers.
Brandon
Top

Code Generator
Posted: 6/28/2012
      This is the final framework that I wanted to build at this time before I start building the content generation tool for this website. As the title suggests this framework is a code generation. Specifically it is a Data Access Layer(DAL) generator. Wait, why do you need this when you just completed your communications framework? Is this not the same thing? Actually no they are not the same, this framework sits in-between the Communications framework and the User Interface(UI) whether that be a web page or a windows form.

      This framework connects to a specified database and generates objects that represent the database structure. It generates an abstract class called BaseDAL which houses all of the common code between the objects and then it generates child classes which contain the specific fields for a table as well as any helper methods that it may need to look up foreign key data etc. The BaseDAL object contains virtual create/update/delete methods (which use the Communications framework) in which each child inherits. Once a UI is built the fields will get bound to these objects properties and then invoke the desired action to persist or delete the data.

      I was actually quite surprised how simple this was to build; basically you build a template class of what it should look like, then place variables for data that is going to change for each class. I slapped together a quick UI that allows the user to point at which database you want to generate the DAL for. Once the process starts it grabs all of the table names that you said you wanted to generate and digests the schema of said table. This schema information is then passed to a TemplateProcessor class which first injects the variable content, writes out the class and then updates the projects configuration so that it recognizes these new files.

      Here is an example of a class template(note the variables identified with a leading and trailing @ symbol);
using System;
using System.Data;
using System.Text;

namespace @namespace@ {
      [Serializable]
      public class @classname@ : BaseDAL {
            #region Member variables
@fields@
            #endregion Member variables

            #region Properties
@properties@
            #endregion Properties
            
            #region Constructor
            public @classname@()
                  : base("@tablename@") {
                  
            }
            #endregion Constructor
            
            #region Support methods
            #region Static support methods
            protected static DataTable getDataTable(int id) {
                  return getDataTable("@tablename@", id);
            }@fkgetters@
            public static @classname@ getByID(int id) {
                  return createInstance<@classname@>(getDataTable(id));
            }
            #endregion Static support methods

            public override string ToString() {
                  StringBuilder stringBuilder = new StringBuilder();
                  stringBuilder.Append(base.ToString());
@tostring@
                  return stringBuilder.ToString();
            }
            #endregion Support methods
      }
}

Which in turn would generate a class such as this;
using System;
using System.Data;
using System.Text;

namespace GeneratorTest.DAL {
      [Serializable]
      public class ProjectAuthorAssociations : BaseDAL {
            #region Member variables

            [FieldAttribute("PROJECT_ID")]
            protected Int32 projectID;
            [FieldAttribute("AUTHOR_ID")]
            protected Int32 authorID;

            #endregion Member variables

            #region Properties

            public Int32 ProjectID { get {return this.projectID; } set { this.projectID = value; } }
            public Int32 AuthorID { get {return this.authorID; } set { this.authorID = value; } }

            #endregion Properties
            
            #region Constructor
            public ProjectAuthorAssociations()
                  : base("Project_Author_Associations") {
                  
            }
            #endregion Constructor
            
            #region Support methods
            #region Static support methods
            protected static DataTable getDataTable(int id) {
                  return getDataTable("Project_Author_Associations", id);
            }

            public Project getProjectByID() {
                  return Project.getByID(this.projectID);
            }

            public Author getAuthorByID() {
                  return Author.getByID(this.authorID);
            }

            public static ProjectAuthorAssociations getByID(int id) {
                  return createInstance(getDataTable(id));
            }
            #endregion Static support methods

            public override string ToString() {
                  StringBuilder stringBuilder = new StringBuilder();
                  stringBuilder.Append(base.ToString());

                  stringBuilder.Append("\nprojectID: ");
                  stringBuilder.Append(this.projectID);
                  stringBuilder.Append("\nauthorID: ");
                  stringBuilder.Append(this.authorID);

                  return stringBuilder.ToString();
            }
            #endregion Support methods
      }
}


Thank you for reading.
Top

Communications Framework
Posted: 6/25/2012
      This is one of the frameworks that I had mentioned earlier that I wanted to build and utilize for content creation for this site. This framework employs the Service Oriented Architecture (SOA) design pattern to communicate with any database regardless of the software it runs on(Oracle, SQLite, SQL, and Access). What does this exactly mean? This means that the consumer of this framework does not need to know how to communicate to the database (nor should it), rather it passes the data that it wants read & written.

      This framework also has a full automated NUnit test suite backing it so future expansion or bug fixes will be low risk of causing unidentified impacts as I will be able to quickly execute every test designed up to that point(Not to mention way faster than if I manually retested the scenarios). There of course will always be a minor risk though because you are assuming that your testing suite covers everything.
Top

Coming Soon!
Posted: 6/23/2012
      After years of having it on my TODO list and never getting to it I have finally decided it's time to write my online portfolio. That also means that in order to put content up on my portfolio I am going to need to write a tool to populate the database; this is no problem, it actually presents itself as the perfect time to write a couple of other frameworks I have wanted to build since I graduated college and just have not got around to it.

Check back soon for more content and updates!!
Top

v2.0.0.2
Powered by: Great White North Productions© Technologies