Category Archives: Development

Add an OData Feed to Your App Using Web API

Adding a REST interface to your application using ASP.NET Web API is pretty well documented.  This post describes the creation of an OData feed through the same ASP.NET Web API techniques.  The example below uses an ASP.NET Web Forms application as the base since there are tons of these applications out there.  You can use this same technique in MVC apps as well.  Since everything in this environment is ASP.NET at the core, Web Forms, MVC and Web API can all exist side-by-side.  The only assumption for this post is that the applications utilize .NET 4.5.

One other note, it is relatively easy to combine Entity Frameworks with OData output.  This example describes the use of non-EF datasets.  Why? you ask.  Well, there may be many cases where the data is not coming from an EF source or maybe your data is stored or cached locally.  There are any number of reasons.  Ultimately, this example shows how to output your data in a standardized OData fashion including any part or all of the OData querying capabilities provided to the consumer of the service.

So, we start off with a standard Web Forms application.  Steps 1 and 2 listed here are not absolutely necessary, they are meant to structure the application in a similar form to that of an ASP.NET MVC application.  Doing this will make things it easier to manage.  If you start off with an MVC application, the folders will already exist.

1. Create a sub folder right off the main project and call it “Controllers”

2. Create a second sub folder right off the main project and call it “Models”

The Models folder should contain classes created to shuffle data around the application.  In an MVC application, view models can be held here to support and pass data to the views.  In this example, we will be creating a model that will describe the data provided in the OData interface.  The data here will be a simple list of meetings.  Obviously, it could be any data you want but since we are using OData, it should start with a larger grouping (or groupings) of data.  If your interface will always return a single a single record or object, then the non-OData Web API interfaces are better.  But, if you are starting with a relatively large set of data and then (through queries) trim down the output to a smaller subset or even a single record, OData will work very well.

You should now have something that looks like this:

image

3. Add a class that will manage the meeting data:

SNAGHTML12f21b9e

using System;

namespace FormsWithWebApiAndOData.Models
{
    public class Meeting
    {
        public string Id { get; set; }
        public DateTime MeetingDate { get; set; }
        public string Title { get; set; }
        public string Leader { get; set; }
    }
}

4.  Add the controller that will provide all of the REST access.  Right-click “Models” and add a “Web API Controller”.  You can add this through the normal “Add Item” approach.  You may also have a menu option to add the controller directly. Name the controller “MeetingsController.cs”.  It is important that the name of the controller class ends in “Controller.cs” since ASP.NET MVC and Web API use “Convention over Configuration”.  Naming convention is the way many components are found as the application executes.

image

SNAGHTML130094f2

You will now have a project structure that looks something like this:

image

The application must understand how to process requests that are destined for the OData REST service that we are creating.  To do this, the application must contain the ASP.NET Web API and Odata components (assemblies).  This is easy to do through NuGet.

 

5. Right-click on the project and select “Manage NuGet Packages…”.  When the NuGet dialog appears, enter the following search to make things easier: “ASP.NET Web API OData”.  When the package appears, click “Install”.

SNAGHTML1311ac97

We can now add the OData functionality.  The controller must be modified to provide the OData REST access point to the Meeting data.  We need to add some code to create the data that is used in the example.

 

6. Open MeetingsController.cs and add the following code at the top of the class.  It will then be the source of the OData feed.

image

    private readonly IList<Meeting> _scheduledMeetings;

    public MeetingsController()
    {
        _scheduledMeetings = new List<Meeting>
        {
            new Meeting { Id = "1", Leader = "Mark Nichols", MeetingDate = new DateTime(2013, 1, 17), Title = "Project X Planning" },
            new Meeting { Id = "3", Leader = "Jim Phelps", MeetingDate = new DateTime(2013, 2, 8), Title = "Mission Discussion" },
            new Meeting { Id = "6", Leader = "Barney Collier", MeetingDate = new DateTime(2013, 3, 12), Title = "Advanced Device Technology" },
            new Meeting { Id = "7", Leader = "Willie Armitage", MeetingDate = new DateTime(2013, 5, 28), Title = "Maintaining a Strong Presence" },
            new Meeting { Id = "9", Leader = "Cinnamon Carter", MeetingDate = new DateTime(2013, 2, 15), Title = "Company Fashion" },
            new Meeting { Id = "10", Leader = "Rollin Hand", MeetingDate = new DateTime(2013, 1, 21), Title = "Magic Selling" }
        };
    }

Web API injects a standard set of methods for HTTP GET, POST, DELETE, and PUT to get you started.  In this example are really only interested in a GET that will allow all necessary OData queries so you can actually delete all of the provided methods.  We’ll add our own GET in the next step.

 

7. Add the following method to the controller right below the constructor code you added in the last step.

    // GET api/Meeting
    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    public IQueryable<Meeting> Get()
    {
        return _scheduledMeetings.AsQueryable();
    }

You will need to add these “using” statements:

using System.Web.Http.OData.Query;
using FormsWithWebApiAndOData.Models;

Notes on the HTTP GET method that we just added:

  • “IQueryable” (part of Linq) is the interface that you must return so that OData can provide the appropriate query and output capabilities.
  • The List that contains all of the meeting data can be made to output its data through the IQueryable interface by using the “AsQueryable()” extension method (also provided by Linq).
  • The attribute “QueryableAttribute” enables querying using the OData syntax.
  • AllowedQueryOptions provides an easy mechanism for limiting the types of queries that are allowed to be processed.  This is especially important when dealing with significant amounts of data.  You can stop queries that would normally spend tons of time processing on your server.  In this example, I’ve opened up all queries so you can try all of the OData options.

 

We’re almost done. Lastly, we need to create a URL path that will send OData requests to the method that we just created.

8. Open Global.asax and in Application_Start add the routing information that will transfer control to the newly created method.

    GlobalConfiguration.Configuration.Routes.MapHttpRoute(
        name: "ODataRestApi",
        routeTemplate: "api/v1/{controller}"
    );

“MapHttpRoute” sets up the URL routing information so that everything can flow through the controller we just created and then into the method.  “name” is arbitrary and has no effect on the routing – it is just for organizational purposes.  “routeTemplate” indicates what URL pattern will be captured.  In this case the URL must start with “api” and then, it must contain “v1”.  The “v1” is an indicator of the version of the API.  Version your API’s and you will always be better off.  “{controller}” acts as a variable and captures the name of the controller that contains the functionality that you want to call.  In our case, the name of the controller is “MeetingsController” but because of convention, only the “Meetings” part must be used, the ASP.NET frameworks take care of the rest of the mapping.

The only thing left to do is run it.  Execute the application and try some of the following queries (port number will vary of course):

http://localhost:14129/api/v1/meetings

http://localhost:14129/api/v1/meetings?$filter=(Leader eq ‘Mark Nichols’)

http://localhost:14129/api/v1/meetings?$top=2

http://localhost:14129/api/v1/meetings?$filter=MeetingDate eq datetime’2013-01-17′

You now have OData query control over pretty much any kind of data you want to pump through your API.  You can use these queries in AJAX calls or even right from your browser.

 

Formatting the Output

This part is not necessary for the operation of the queries BUT you may want to control the data format coming back through the optional OData “format’=” query parameter.  This capability is always there through setting the content headers in the HTTP request but OData gives you another option in the query.  You just have to turn it on:

In my tests, if I used Internet Explorer (I was using V10), all my requests would return JSON data.  If I used Chrome, XML would always come back.  So, I added the some code to give me the option of XML or JSON in the query.

Add the following code in Global.asax right before the call to MapHttpRoute :

    // XML or JSON output selection
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json");
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml");

You will need to add this using statement:

using System.Net.Http.Formatting;  // "AddQueryStringMapping"

Now you should be able to do things like this:

http://localhost:14129/api/v1/meetings?$filter=(Leader eq ‘Mark Nichols’)&$format=xml

image

http://localhost:14129/api/v1/meetings?$top=2&$format=json

image

image

 

References:

OData Developers Reference: http://www.odata.org/developers/

OData in ASP.NET: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

Limiting OData Query Options: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options

OData Security: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-security-guidance

OData is Case Sensitive!

One last thing, the OData query syntax is case sensitive.  So, if you don’t get back what you think you should have with a particular query, check the case of the query commands (usually lower case), filter fields (depends on your data classes), etc.

NuGetter Updated for TFS 2012

image

NuGetter, which is an extension to the Team Foundation Server build process to build, package and deploy NuGet packages has been updated to work in TFS 2012.

Not only is NuGetter updated to work with TFS 2012, but additional features have been added based on user requests.

Features:

  • Operates through the TFS Build Workflow process
  • Create simple to complex NuGet Packages
  • Can execute PowerShell scripts prior to the packaging phase to organize files and set up packaging
  • Dynamic versioning of the package
  • Supports deployment to web, local drive or network share repositories
  • Uses the NuGet.exe application but does not require installing the application to the build server
  • Remotely store/manage packaging information such as versions, API Keys and NuSpec manifest files
  • Works well with TfsVersioning to version the .NET assemblies during the build process
  • Supports the creation of multiple packages during a single build process (new)
  • Supports semantic versioning (new)

Below is a sample of a build definition that uses NuGetter and TfsVersioning to create and deploy a NuGet package.

image

TfsVersioning 2.0 Updated for TFS 2012

My CodePlex project “TfsVersioning” which automatically versions C#, Visual Basic, F# and managed C++ assemblies has been updated to work on Team Foundation Server 2012 automated build.

The overall features have remained the same as the prior version but the XAML build templates have changed in TFS 2012 so the existing TfsVersioning would not work.  If you’re not familiar with the features, they include:

  • Versioning all assemblies during the TFS build process
  • Handles multiple solution builds
  • Can use a “Version Seed” file that stores and manages the version information across multiple solutions
  • Patterns (macros) can be used to dynamically generate version information during the build process – use dates or build numbers to increment the versions
  • All assembly information (usually stored in the “AssemblyInfo” files) can be updated in the build process
  • Versioned source files can be checked in after the version information is updated keeping the source files completely in sync with the assemblies
  • Works seamlessly with “NuGetter”, my other TFS build project on CodePlex that will build, package and deploy NuGet packages

Below is a sample of the Version Seed file showing several of the assembly version properties being managed in a remote file that is accessed and read during the build.

image

This is the build definition in TFS using the above seed file:

image

Using NuGet in TFS Without Committing Packages to Source Control

And, without modifying your project “*.*proj” files.

And, without storing nuget.exe in your project’s source control.

NuGet 1.6 is out and with it is a new update to Visual Studio that will update your solution and projects with some extra code and even the NuGet.exe application so that your build process will dynamically download the required NuGet packages.  Rightly so, this is in response to the request that NuGet packages not be stored in source control as they just take up space since they are always available via download.

I understand the approach that was taken (including a .targets file as well as the nuget.exe as well as updating the **proj files) however, I think all of that is unnecessary clutter if your build process can handle it alone.

So, I looked at the NuGet commands and updated the standard TFS 2010 build template to manage this additional step automatically.  With this new template, there is no need to update your solution or projects or include NuGet.exe in your project source.

The only thing you really need to change in your project source control is remove the “packages” folder from source control.  That folder will automatically be created during the build.

Even if you already have custom build templates, you should be able to copy the NuGet restore section over since it is all contained in a single sequence.

The one thing this solution does not do is download the packages locally on your dev machine.  So, if you are getting a solution from source control for the first time, you won’t get all of the references you need since the packages folder isn’t in TFS.  That is easily fixed with a simple PowerShell script that you can run locally to set you up.  All of this is provided below.

The solution:

The Template:

Download the “NuGetRestoreTemplate.xaml” template and add it to source control.  This can be anywhere -  it doesn’t need to be part of your Team Project, it just needs to be in a location where your build can access it.

NuGet.exe:

You have 3 options here.

  1. The easiest and least intrusive your build machine is to add NuGet.exe to source control.  Like the template, this does not need to be in your Team Project.  Just put it in a location where your build can access it.  You then tell the build definition where it exists in source control.  This approach makes updating NuGet.exe easy since it’s all done through source control.  You never have to get on the build machine which in some environments is next to impossible.
  2. Put it on your build server and remember the exact file path.  You can tell the build definition exactly where to look for it.
  3. Put it on your build server and add that folder to your PATH environment variable.  If you do this, then you will leave the location blank in the build definition.  It will be found automatically.  One note here: if you do this, you may have to reboot your machine so the build process realizes the right path.

One suggestion for the template and the NuGet.exe location in source control:  Create a general Team Project that will house all of your build goodies such as custom templates, custom activities and support applications.  I generally create a “BuildActivities” project and put everything in there.  You just need to give everyone read access to it.

To follow along with this recommendation, I created a “BuildActivities” Team Project.  In it I have a “BuildProcessTemplates” folder where I keep all of the generally available build templates.  I have a “NuGet” folder where I keep the “NuGet.exe” application.  I also have subfolders in here for previous releases (just in case).  I also have a folder called “Custom Activities” for all of the custom activities that my templates require.  Note: the template I created for the solution I am describing does not require any custom activities.  I just included that suggestion for completeness.

Creating the Build Definition

Creating the build definition is pretty straight forward.

  1. When you get to the Process, click “New…” next to your “Build process file:”.
  2. Click “Select an existing XAML file”
  3. Click “Browse” and navigate to where you placed the template in source control
  4. Click “OK”

image

The “NuGet Restore/Install” section will appear in the build process parameters

image

Enter the location of the NuGet.exe file.  In this example I placed it in source control but you can just as easily enter the full path on the build machine if that’s where you placed it.  Leave this blank if you put NuGet.exe on the build machine and in the “Path”.

Next, you can add the locations of where to look for the NuGet packages during download.  You can enter multiples here – just delimit with a semi-colon “;”.  If you leave this blank, NuGet will attempt to look at “%AppData%\NuGet\NuGet.config” for NuGet repositories.   Keep in mind that if you leave the parameter blank and expect the build machine to look in the config file, that location is account specific.  The ID of the build process will need to have that file available.

In my example, I included a local network share I set up as a gallery as well as the official NuGet Gallery.

The “Additional Install Arguments” is there if you want to include other parameters like “-Prerelease” or “-ExcludeVersion”.  Note: include the “-“ before each parameter.

That’s it.  You can now remove the “packages” folder from source control and do a build.

Of course, and as always, I would recommend testing this first on a sample app within your environment just to see how it works.

When you run the build, you will see in your log file something similar to this:

image

This shows that the build process has dynamically downloaded all of the required NuGet packages.

Resources:

NuGet Restore/Install/Update:

Here’s the templates and PowerShell Script:

The 2nd template I’ve provided will do the same “restore” process but will also update to the latest version of the NuGet packages rather that just the versions listed in the projects.  It is called NuGetRestoreUpdateTemplate.xaml.  Note: it may or may not break your code to use the update template depending on the version of the package that is downloaded.  See the NuGet documentation for more details.  You can include the “-safe” option in the build definition to avoid the breakage.

The PowerShell script will restore all of the NuGet packages locally if you are not storing the “packages” folder in source control:  NuGetRestore.ps1

 

My Other TFS Build Template Projects:

TfsVersioning Automated Assembly Versioning on CodePlex

NuGetter Automated NuGet Package Generation on CodePlex

NuGetter Project “Pick of the Week” on Channel 9

I just found out that Brian Keller mentioned my TFS NuGetter (CodePlex) project that automates the creation, push and publish of NuGet packages through TFS 2010  as his “Pick of the Week” on the August 19th episode of TWC9 (“This Week on Channel 9″).

You can see that episode here:  http://channel9.msdn.com/Shows/This+Week+On+Channel+9/TWC9-August-19-2011

That part was very cool.  The only thing that would’ve made it even more exciting (to me anyway) would have been if he knew who actually created it.  Oh well, it was still cool that it was his pick.  I appreciate the mention Brian!

TfsNugetter-shortened

Kinecting with the Cosmos with Jonathan Fay, Dr. Mark SubbaRao & Michelle Yehling (Part 2)

In this episode (part 2), we complete the interview on location at Adler Planetarium. Mark and his guest cohost sister, Michelle (Nichols) Yehling talk to astronomer Dr. Mark SubbaRao of Adler Planetarium and Principal Software Architect Jonathan Fay of Microsoft Research about the details of developing the Worldwide Telescope, the conversion to Silverlight, Kinect in the WWT and future plans at Adler.,

Play Now


Show Notes

In this episode (part 2), we complete the interview on location at Adler Planetarium.  Mark and his guest cohost sister, Michelle (Nichols) Yehling talk to astronomer Dr. Mark SubbaRao of Adler Planetarium and Principal Software Architect Jonathan Fay of Microsoft Research about the details of developing the Worldwide Telescope, the conversion to Silverlight, Kinect in the WWT and future plans at Adler.

Resources

Who is:

Jonathan Fay: Principal Software Architect on Microsoft Research’s Worldwide Telescope project in the Next Media Research group at Microsoft. He has been at Microsoft for over 16 years and his area of expertise is the visualization of data over remote networks. He lead the development of several Microsoft projects such as: Microsoft Image Composer, Microsoft Home Advisor, Microsoft bCentral Site Manage, and MSN AdExpert. He is also an avid “amateur” astronomer who even built his own personal domed observatory.
Dr. Mark SubbaRao: Astronomer and Director of the Space Visualization Laboratory at the Adler Planetarium. He is also a senior research associate at the University of Chicago. His area of research is cosmology, particularly the large-scale structure of galaxies, their clustering properties and evolution. He was a builder of the Sloan Digital Sky Survey, working as a developer of their spectroscopic software that measured redshifts, hence providing 3D positions for nearly one million galaxies and quasars. In the Space Visualization Laboratory, Dr. SubbaRao supervises the development of scientific visualizations utilizing cutting edge stereoscopic and ultra-high resolution displays.
Michelle (Nichols) Yehling: Besides being Mark’s sister, Michelle is Master Educator for NASA Forum Programs at the Adler Planetarium in Chicago. She is currently working on several projects with NASA – one of which is Education and Public Outreach for the Interstellar Boundary Explorer spacecraft.
Special note: Great thanks go to Jonathan, Dr. SubbaRao and Michelle for spending so much time with me in recording this podcast. They are an inspiration with the passion they demonstrate in their work and their desire to pass on their knowledge to others.

Sponsors

ThatConference is a brand new conference coming to the Kalahari Resort in the Wisconsin Dells on August 13th, 14th, 15th of 2012. This is a conference is founded by Developers who want to create the conference they’ve always want to go to and for a price that’s easy to justify to your boss. First and foremost this is a developer’s conference. 3 days of any technology and nothing but code. You can find more at ThatConference.com.
WebSite Hosting is provided by Applied Innovations.

Music

Get Started with Windows Azure – Training and Resources

I’ve been gathering up a bunch of resources around doing development on Azure and decided to post them where anyone, including me, can find them.

 

Windows Azure Site

 

Project Templates

 

Lightswitch

 

Development / SDK’s

 

Information, blogs, videos, etc.

 

Training

Last count there was 70+ examples here showing you how to get started with Azure. From the beginning with “Hello World” through SQL Azure, WCF, Silverlight, ASP.Net, LINQ, Storage, Workflow, etc. In VS08/VS10 – C# & VB.NET.

There is a lot of code out here…

 

Planning

Microsoft Assessment and Planning Toolkit 6.0

  • Catalog all of the applications in your environment
  • Estimate the needed capacity to run your applications on the Windows Azure platform
  • Evaluate applications based on migration difficulty
  • Stack rank applications in terms of migration suitability
  • Obtain a TCO-ROI analysis for the application

 

Management

SQL Azure Management REST API Reference

Installing the Windows Identity Foundation (WIF) SDK

WIF gives you the ability to develop claims-based applications and separate or externalize the authentication of users from your application.  It is a better separation of concerns for the application and gives you more capability for creating a secure application that accesses local or web (cloud) services.

Features you can add to your app using WIF

  • Authentication
  • Personalization
  • Federation
  • Identity Delegation
  • Single Sign On (SSO)

Supported OS Bases

  • Windows 2008 Server SP2
  • Windows 2008 Server R2
  • Windows 7
  • Windows Server 2003 SP2
  • Windows Vista

Development Framework Versions

  • .NET 3.5 SP1
  • .NET 4.0

Installation (Step 1)

To develop using the WIF SDK you will first need the Windows Identity Foundation run-time installed on your machine.  Obviously, this suggests that you will need to install this runtime on any machine that is providing WIF-based services.  You will also need IIS as well.

When I went to do the installs I realized that they were in separate places and have different requirements based on the OS that you are using.  Hopefully, the information I have below will organize that a little better so you can just go get what you need and not have to weed through a bunch of “use this here” and “use that there” statements across multiple pages.

One side note.  The reason I started down this path is that I wanted to work with some sample code that a colleague gave me using WIF.  In the application there in a reference to “Microsoft.IdentityModel.dll”.  My search for that assembly led me here.  So, if you’re looking for that assembly, you’ve now found it.

WIF Runtime Installation Downloads

OS Look here for installation download
Vista / W2K8 Server Windows6.0-KB974405-x64 or x86.msu
Windows 7 / W2K8 R2 Windows6.1-KB974405-x64 or x86.msu
W2K3 Server SP2 Windows5.2-KB974405-x64 or x86.exe

WIF SDK Downloads

Runtime Installation

 

It will call this installation the “Update for Windows (KB974405)”

image

Accept the license terms to continue…

image

It will then do the installation…

image

And complete…It only took about a minute on my x64 laptop.

image

SDK Installation

image

Slightly different license acceptance screen…

image

Where do you want the files…

image

Are you sure…

image

Install…

image

Done.  This install took significantly longer than the runtime – around 5 minutes.

image

TfsVersioning 1.5 – Automated Build Extension Released

TfsVersioning

Download from CodePlex: http://tfsversioning.codeplex.com/

The goal of this project is to create a way to modify the automated build process of TFS 2010 so that versioning is automatic while giving the user the flexibility that they need given the project’s process requirements. I’ve done this in the past using the angle-bracket programming paradigm of MSBuild – powerful but hard. This time I took advantage of the WF capabilities of TFS Build.

Version 1.5.0.0 Features:

  • Control over assembly attributes has been extended to include:
    • AssemblyTitle
    • AssemblyDescription
    • AssemblyConfiguration
    • AssemblyCompany
    • AssemblyProduct
    • AssemblyCopyright
    • AssemblyTrademark
    • AssemblyCulture
    • AssemblyInformationalVersion
  • Use “Replacement Patterns” to include dynamic (build-time) information in the attribute values
  • Control over AssemblyVersion and AssemblyFileVersion exists as in the previous versions
  • New (Version 1.5.0.0) custom activity assembly is backward compatible so you can replace the assembly and you do not have to change any existing build definitions
  • New Build Process Template is included to provide build definition access to the additional assembly attributes: VersioningBuildTemplate15.xaml


Example:
The Build Definition screen when using the updated build process template:
image


Example
: Properties dialog from within Windows Explorer showing the attributes generated dynamically in the build process.

image

 

Previous and Related Posts to TfsVersioning:

Application Security with Glenn Leifheit

In this episode, we talk to Glenn Leifheit, a Senior Information Security Consultant at FICO in Minneapolis-St. Paul, Minnesota about security – what to think about, where to start, approaches and best practices.,

Play Now


Show Notes

In this episode, we talk to Glenn Leifheit, a Senior Information Security Consultant (Application Security Program Leader) at FICO in Minneapolis-St. Paul, Minnesota about security – what to think about, where to start, how to approach it and best practices.
We talk about things like initial areas for concern (input validation, encoding output, whether to trust internal or external data, etc.), how Glenn goes about reviewing application security, threat modeling, static and dynamic analysis, trust boundaries, best practices and then provides some resources to help you get started.

whois Glenn Leifheit

Glenn Leifheit, CISSP, CSSLP is a Senior Security Architect at FICO. He has worked in developing, managing, architecting and securing large scale applications for over 15 years. His day is spent rolling out an Enterprise secure software development lifecycle and managing PCI requirements as well as secure software reviews. Glenn is active in the Technology community as the Co-Chair of (ISC)2 Application Security Advisory Board, President of TechMasters Twin Cities, as an active member of IASA (International Association of Software Architects) and OWASP (Open Web Application Security Project) as well as a regional speaker evangelizing secure software. Glenn’s blog is located at www.glennleifheit.com.

Resources

Sponsors

ThatConference is a brand new conference coming to the Kalahari Resort in the Wisconsin Dells on August 13th, 14th, 15th of 2012. This is a conference is founded by Developers who want to create the conference they’ve always want to go to and for a price that’s easy to justify to your boss. First and foremost this is a developer’s conference. 3 days of any technology and nothing but code. You can find more at ThatConference.com.
WebSite Hosting is provided by Applied Innovations.

Music