Freestyle Coding

Programming in the Real World

  Home  |   Contact  |   Syndication    |   Login
  53 Posts | 0 Stories | 39 Comments | 0 Trackbacks

News

Tag Cloud


Archives

Post Categories

Charity

Conferences

Professional

Projects

Social Networks

Wednesday, May 28, 2014 #

As some of you may know, I recently accepted a position to teach an undergraduate course at my alma mater. Yesterday, I had my first day in an academic classroom. I immediately noticed a difference with the interactions between the students. They don't act like students in a professional training or conference talk. I wanted to use this opportunity to enumerate some of those differences.

The immediate thing I noticed was the lack of open environment. This is not to say the class was hostile towards me. I am used to entering the room, bantering with audience, loosening everyone a bit, and flowing into the discussion.

A purely academic audience does not banter. At least, they do not banter on day one.

I think I can attribute this to two factors. This first is a greater perception of authority. In a training or conference environment, I am an equal with the audience. This is true even if I am being a subject matter expert. We're all professionals. We're all there to learn from each other, share our stories, and enjoy the journey. In the academic classroom, there was a distinct class difference. I had forgotten about this distinction; I had the professional familiarity with the staff by the time I completed my masters.

This leads to the other distinction. These was an expectation of performance. At conference and professional training, there is generally no (immediate) grading. This may be a preparation for a certification exam, but I'm not the one responsible for delivering the exam. This was not the case in the academic classroom. These students are battling for points, and I am the sole arbiter. These students are less likely to let the material wash over them, applying the material to their past experiences. They were down taking notes.

I don't want to leave the impression that there was no interact in the classroom. I spent a good deal of time doing problems with the class on the whiteboard. I tried to get the class to help me work out the steps. This opened up a few of them.

After every conference or training class, I always get a few people that will email me afterward to continue the conversation. I am very curious to see if anybody comes to my office hours tomorrow.

However, that is a curiosity that will have to wait until tomorrow.


Friday, May 23, 2014 #

Now that teched has come and gone, I thought I would use this opportunity to do a little post-mortem on The Krewe app. It is one thing to test the app at home. It is a completely different animal to see how it responds in the environment TechEd creates.

At a future time, I will list all the things that I would like to change with the app. At this point, I will find some good way to get community feedback.

I want to break all this down screen by screen. We'll start with the screen I got right. The first of these is the events calendar. This is the one screen that, to you guys, just worked. However, there was an issue here. When I wrote v1 for last year, I was lazy and placed everything in CST. This caused problems with the achievements, which I will explain later. Furthermore, the event locations were not check-in locations. This created another problem with the achievements.

Next, we get to the Twitter page. For what this page does, it works great. For those that don't know, I have an Azure Worker Role that polls Twitter pretty close to the rate limit. I cache these results in my database, and serve them upon request. This gives me great control over the content. I just have to remember to flush past tweets after a period, to save database growth.

The next screen is the check-in screen. This screen has been the bane of my existence since I first created the thing. Last year, I used a background task to check people out of locations after they traveled. This year, I removed the background task in favor of a foursquare model. You are checked out after 3 hours or when you check-in to some other location. This seemed to work well, until those pesky achievements came into the mix. Again, more on this later.

Next, I want to address the Connect and Connections screens together. I wanted to use some of the capabilities of the phone, and NFC seemed a natural choice. From this, I came up with the gamification aspects of the app. Since we are, fundamentally, a networking organization, I wanted to encourage people to actually network. Users could make and share a profile, similar to a virtual business card.

I just had to figure out how to get people to use the feature. Why not just give someone a business card?

Thus, the achievements were born. This was such a good idea. It would have been a great idea, if I have come up with it about two months earlier...

When I came up with these ideas, I had about 2 weeks to implement them. Version 1 of the app was, basically, a pure consumption app. We provided data and centralized it. With version 2, the app became a much more interactive experience. The API was not ready for this change in such a short period of time.

Most of this became apparent when I started implementing the achievements. The achievements based on count and specific person when fairly easy. The problem came with tying them to locations and events. This took some true SQL kung fu. This also showed me the rookie mistake of putting CST, not UTC, in the database.

Once I got all of that cleaned up, I had to find a way to get the achievement system to talk to the phone. I knew I needed to be able to dynamically add achievements. I wouldn't know the precise location of some things until I got to Houston. I wanted the server to approve the achievements. This, unfortunately, required a decent data connection. Some achievements required GPS levels of location accuracy in areas of network triangulation.

All of this became a huge nightmare. My flagship feature was based on some silly assumptions. Still, I managed to get 31 people to get the first achievement (Make 1 Connection.) Quite a few of those managed to get to the higher levels.

Soon, I will post a list of the feature and changes that need to happen to the API. This includes things like proper objects for communication, geo-fencing, and caching. However, that is for another day.


Tuesday, May 20, 2014 #

It appears my good buddies in The Krewe have created The Krewe Summer Blogging Challenge. The challenge is to write at least two blog posts a week for 12 weeks over the summer.

Consider this challenge accepted.

So, what can we expect coming up?

  • I still have the Kinect v2 Alpha kit. Some of you may have seen me use it in talks.
  • I need to make some major API changes in The Krewe WP8 App. Plus, I may have Xamarin on board to help with getting the app to the other platforms.
  • I am determined to learn F#, and I'm taking all of you with me.
  • I am teaching a college course this summer. I want to post some commentary on that side of training.
  • I am sure some biometric stuff will come up.
  • Anything else you guys may want.

I have created tasks on my schedule to get a new blog post up no later than every Tuesday and Friday. We'll see how that goes.

Wish me luck.


Tuesday, May 6, 2014 #

I recently published version 2.0 of The Krewe Windows Phone app. The app is meant to facilitate social interactions at conferences, primarily TechEd North America.

Version 1 of the app, published for last year, was primarily meant as a consumption app. We provided a list of events, a view of a Twitter feed, and the ability to view where other users are located. The location view used a "checkin" mechanism, similar to FourSquare, where people could check into a location. The location would then display the number of currently people checked into the location.

As with any app, version 1 had a few issues. However, the app was functional and, overall, well received. Most of the issue were addressed with a version 1.1 and 1.2 maintenance release.

Slightly before 1.2 was published in mid-April, I came up with the idea to gamify the app. The entire essence of The Krewe is networking and community. I wanted to find a way to embrace and encourage these principles. To this end, I wanted to give people the opportunity to easily swap information.

Currently, the app targets Windows Phone 8(.1). With this current requirement, I knew that almost every device would have NFC capabilities. If our members are connecting, why don't we allow them to REALLY connect?

This gave me the idea to allow users the option to create a personal profile. This profile included a display name, email address, and generic job role. There was also some optional fields for a Twitter handle and a personal message.

Once you have created your profile, you can use NFC to swap your profile with other members. Once you have their profile, I add the date, time, and location you connected. Any time you view their profile, you can see the last place they checked in. This can help you connect with people at a later time.

Now that we have this interactive behavior, I wanted to add some fun to the process. This is where the achievements come into play. The achievements come in 5 basic categories. This first category is "other." This category has no relation to connections. As such, I will stop talking about them.

The easiest set of achievements to acquire are the connection count achievements. As you connect with people, I check the length of your list of connections. As you reach certain thresholds, you will unlock the achievement.

The next set of achievements to acquire are tied to locations and events. Anytime you are at a location or event, you need to check in to the venue. If you are checked into the venue and make a connection, the achievement will unlock. For locations, you just have to be checked into the location. For events, you have to be checked into the location during the event.

If you already have the app, you have not yet seen any of the location achievements. I will create these on Saturday when I get to Houston. These are tied to areas in the convention center. Since I don't know the layout of these locations, such as the Hand-On Lab or TLG, I can't create the achievement.

The final set of achievements are tied to specific people. All you have to do is find the person and connect with them. However, if an achievement is tied to a person, there is generally an ulterior motive. For example, connecting with me will get you an achievement. When you do this, I will ask for feedback on the app.

Some of you may be wondering how I will add these achievements. All the achievements are in the Azure database. The list of achievements are synced at app startup. As such, I can add or modify any achievements on the server.

There are a few quirks that I should mention. Unlocking achievements only happen when you make a connection. The app will request an unlock when it detects you may qualify. The final decision goes to the server. If some piece of information is missing from the server, such as if you did not have a data connection when you made a previous connection, the server would see the correct count. I'm trying to find a balance between the amount of data sent and keeping things up to date. There may be a maintenance release between now and Tech Ed to ensure you get everything.

Finally, you may be asking why you should bother? We are working hard without sponsors to get some special swag for people. I do not have the full details on this, at this time. All I know is that we want to reward the people that embrace networking and community.

If you have any questions about the app that I have not addressed here, feel free to drop me a line. I created the app to help people get the most out of events. The app is going to grow over time. We are going to help facilitate more events. We are (eventually) going to expand to other devices.

Over the next couple of months, I am going to be making changes to the app and API to facilitate these changes. As I do this, I am going to keep updates posted here on the blog. One of the first major updates will be completely to the API. As I mentioned before, the original app was created for consumption. As the app became more interactive, the previous API design showed it's flaws.

After the API is fixed, I need to update the UI for the app. The pivot control used for the original app was great for the 3 views that were used. As the app expanded, It now is cumbersome to use the pivot control. This is for both me, as a developer, and as a user. I, too, as a user, feel your pain over the number of swipes it takes to get to some of the information.

Finally, the great port to other devices will begin. This part both excites and frightens me. I know the Windows Phone SDK well. However, I have never owned an iPhone. I haven't owned an Android device since Android 2.3.

This project started as a way for me to help the community. I have worked word, on my free time, to provide an app that is completely free for people. My company, T&W Operations, Inc., has graciously allowed me to host the cloud services on our Azure account. I am determined to keep the app free of advertisements and clutter. However, things like licenses to Xamarin and publisher accounts to App Stores cost money. Please be patient with some of the great ideas that will cost me money. I promise I will get to all of these ideas as the means become necessary.

Again, I hope everyone enjoys the updated app. I look forward to meeting all of you next week in Houston.


Wednesday, April 16, 2014 #

I, unfortunately and unwittingly, started a minor Twitter flame war earlier today. Of course, there is only one way that could turn out.

The subject was on the importance of JavaScript. The original tweet was:

“By 2017, JavaScript will be the most in-demand language skill in application development (AD).”

— Forrester Research 2014
I will leave out who provided the tweet. Yes, I will forward them a link to my article. If they post a reply, I will update this post with a link.

Before I begin, let me say a few things. First, I did not read the referenced article. This is because a) I couldn't find it, and b) every report on Forrester's site seems to cost 499USD. Second, I do actually like JavaScript and have been using it for a VERY long time. Finally, as longtime readers will know, I am a proponent of learning your language, not your extension framework.

My response to the comment was "if this comes true, we have failed our customers and users..." This spawned an epic, 3 hour conversation thread that I'm not going to fully recount. I will make sure all of their points are addressed.

My response was fueled by two primary things. The first was a couple "interactions" I've had with Douglas Crockford. The most important of these was the DevLink 2012 closing panel. During this panel, Crockford replied to a question about the longevity of JavaScript with the following response:

God, I hope not. If it turns out that JavaScript is the last programming language, that would be really sad. But unfortunately, because of its dominance in the web, it is now moving into virtually every place else. It has become a tragically important language, and we’re going to be stuck with it for a time...
This has, and still does, mirror my feelings. This took place at about the same time WinJS was starting to come into fashion. At that time, I had some informal numbers telling me that WinJS was not as prevalent as Microsoft was letting on. Unfortunately, I do not have current numbers as Microsoft doesn't publish this type of information.

That leads to my second point. I do NOT like the fact that the quote says "application development." Yes, web apps are apps. However, I am afraid that is not the intent of the statement. I fear that this statement is referring to JavaScript as a golden hammer. There are cases where JavaScript is the right tool for the job. However, JavaScript is not the only tool for the job.

I think back to the early 2000s. Perl was ALL the rage. It was used for everything, including webpages. The problem was that Perl was originally written for a specific purpose. It was written to be a VERY efficient string parser to enable Linux admins automate command line tasks that involved scrubbing log files. To this day, it still's still widely in use doing just that.

Soon, however, people said "PERL ALL THE THINGS!" We began to see webpages that were Perl scripts constructing a page in real-time. We began to see command-line apps that were Perl scripts that just automated calls to other command-line apps.

In the long run, Perl had this dirty little secret. It was made to be very easy to use, to be marginally forgiving, and to offer great flexibility. Larry Wall, the father of Perl, described a good programmer as being lazy. In the end, this led to bad habits, unmaintainable code bases, and large amounts of effort (and money) being spent to go back and do it right.

If, when reading that last paragraph, you didn't mentally swap Perl for JavaScript, go back and try again.

During all this talk, people professed the joy of all things JavaScript and how I was categorically WRONG. The biggest, recurring theme was "but what about node.js". Let me sum this up in 3 parts. First, it says .js. Thus, it's just JavaScript on the client. Second, the server side is a WHOLE bunch of C++. Third, It's not like it has a dependency to openssl or anything... (Too soon?)

As a bonus fourth, this argument would have been about Ember last year. Knockout the year before that. jQuery the year before that... If my timeline is wrong on the previous next-big-things, that's because I never used any of them. I wrote JavaScript, using the as is was defined in the ECMAScript spec. Interacting with the DOM in a method that was outlined in the DOM spec. Writing carefully engineered client code to do only want I needed without fragile, outside dependencies.

Guess what, that code had generally worked on all browsers, of all types, without side effects. I say generally because you do have to add CSS into the mix, and no browser universally uses it correctly.

Given all that, I would never dream of writing an application in JavaScript. I consider it a tool that I can exploit in the correct circumstances. People say, “but, it’s ubiquitous. Why not use it?” Of course, their bosses said that two decades ago about Java.

Technology changes faster than we realize. I can’t tell you want language I will be using in 3 years. I can’t tell you want languages will still be around. People still make a fortune maintaining COBOL. What I can tell you is that technology is run by neither merit nor artistry. There is a little of both, but something else. Once the true engineers get a hold of JavaScript and make people do it right, the lemming will find the next easiest path.

My only hope is that this happens sooner, rather than later.


Thursday, April 10, 2014 #

As I was working on updates to The Krewe Windows Phone App, I ran into a very aggravating situation. I needed to blow away my Azure deployment project (more on a later date) and recreate a new one. When I did this, the project was named the ever-so-helpful "TheKreweAPI.Azure2". I know, pure poetry...

After this happened, I took the time to rename everything to something useful. I manually edited solution and project files. I scrubbed output directories. I made everything look pretty.

I my quest for glory, I removed something I didn't mean to remove. When the project was created, VS12 automatically added the project to source control. I had the little + next to the project name. After I renamed everything, my little + went away.

That made me a sad panda.

After a full day of shouting obscenities, I finally fixed it. Here is what I had to do to fix it:

  • Undo the "add" changes.
  • Remove the project from the solution
  • Rename the original directory
  • Manually create the directory in the Source Control Explorer
  • Copy the files into the new, correctly named directory
  • Re-add the project to the solution.
  • Add the files to source control
  • Check everything in
  • Party like it's 1999

I don't know if you realized this, but that's a LOT of steps for a simple rename. Hopefully, this will keep you from the same spew of obscenities that I was forced to use.


Monday, April 7, 2014 #

Greetings. I Have returned from the brink of madness. Of course, by madness, I mean academia...

It's time to kickstart this thing back into full swing. I have tasked myself to keep this thing updated on a semi-regular basis. What does semi-regular mean? Well, I'm hoping to hit at least on post about every 2 weeks.

Of course, the trick to this is that my role at work has significantly changed. I'm still coding and doing research and development. However, I am now in a much larger supervisory role. As such, topics may expand into these areas. Of course, I have always posted some soft skills topics. Those just seem to be the ones that nobody reads.

Any who, it feels good to be posting something into a public forum again. I hope to hear, read, or see you all soon.


Friday, October 25, 2013 #

The time has been flying by this year. It seems like only yesterday that I mentioned the gorillagator, a simple construct of confusion to try to draw attention to my message.

In reality, that message was sent over a month ago. During that time, the hours slipped to days and days to weeks. Many exciting things have happened to myself; I'm sure many exciting things have happened to you. I'm also sure that many terrifying things have happened to children and their families.

62 children enter treatment at a Children's Miracle Network Hospital every minute. That's nearly 60,000 children since I sent the last email. To put that number in perspective, that is more than the population of Greenland. If we expand that to the past year, they have been nearly 550,000 children treated. That is almost the population of Huntsville, Decatur, and all their suburbs combined.

Over the past 4 years, I have raised a little more than $3,000 for Children's Hospital of Alabama. As a result, I received a call from the organizers of Extra Life thanking me for my dedicated work and informing me that I was the top supporters for Children's Hospital of Alabama ... with my measly three grand.

We can do much better than that.

It may sound like I'm trying to have fun by playing games for 24 hours. It is more than that. It is me using my time and body as a catalyst. It is me putting my passion to work for a cause. It is me turning my love into something tangible.

I have been campaigning and fighting to give these children a chance for years. I have been asking you to help me support these children and families. I've been putting in countless hours of talking to people, impassioned emails, and carefully constructed tweets. I have been fighting with cutting edge, and sometimes expensive, technology to try to provide live streams of my marathons. I yearly put my body through 24 (and, this year, 25) hours of no sleep.

I do this to represent the countless hours these families sit awake at their children's side.

All I ask is a few minutes on a website and a few dollars. These few minutes and few dollars go a long way help people that are experiencing circumstances that only occur in our nightmares.

I also ask that you take one extra step. Forward this plea to those that you know. I can only reach a small fraction of a percentage of the people that may be able to help. Together, we can reach the world. I raise money for Children's Hospital of Alabama. As this message branches out, people may wish to support a hospital closer to their area. I have included a link to the list of people that have dedicated their time and have received no donations. Find someone on the list supporting your local hospital and give them a donation. Let them know that their time and effort are appreciated.

Together, we can do something great.

Together, we can make a difference.

Together, we all stand tall.

Thank you.

You can get more information at http://www.extra-life.org and http://childrensmiraclenetworkhospitals.org/"

My donation page is http://www.extra-life.org/participant/cgardner

The list of participants without donations is http://www.extra-life.org/index.cfm?fuseaction=donorDrive.eventParticipantList&page=629&eventID=512


Saturday, September 14, 2013 #

As many of you know, I participate in a 24-hour gaming marathon every year to raise money for a charity named Extra Life. All the money I raise goes directly to Children's Hospital of Alabama through the Children's Miracle Network. To date, I've raised $2,799.28 to help make sick children's lives a little better.

This year, the marathon will be on November 2nd. Yes, that is the day the clock falls back. Yes, that means this year will be a 25-hour gaming marathon. I'll be pushing myself even harder to help those that are pushing hard every day.

Unfortunately, there is one area in which I have been slacking a bit. This is the area of fundraising / solicitation. I raised my personal goal to a new time high of $1,200, but I've waited the longest I've ever waited to start my fundraising campaign.

I'm not happy about this.

Neither is the feral platypus.

The feral platypus called me the other day to remind me of this. The feral platypus said he's sending over an enforcer to get me in gear and keep my straight. I thought he was just trying to use his old scare tactics to get me in line. Then, I got a knock at the door.

It was the gorillagator. The gorillagator was not happy, either. The gorillagator informed me that I will get back in gear for these kids. The gorillagator reminded me that I don't have a choice because these children don't have a choice. Finally, the gorillagator reminded me that he is an official agent of the feral platypus, and that, well, I probably shouldn't repeat the rest of what he said in a post to help children...

A few bucks out of your own pocket is not too much to ask. Every donation you make is 100% tax deductible. You'll even get a nifty receipt you can print out to keep the feds off your back. Most importantly, you'll get the peace of mind knowing that you eating leftovers for lunch one day turned into a slight improvement in the quality of life for a child in a dire situation.

You'll also get the gorillagator off my back.


Friday, June 21, 2013 #

Everyone seems to be putting their 0.00237 cents into the wishing well over Microsoft's recent decision to reverse the DRM policy on the Xbox One. However, there have been a few issues that nobody has touched. As such, I have decided to dig 0.00237 cents out of my pocket.

First, let me be clear about this point. I do not support the decision to reverse the DRM policy on the Xbox One. I wanted that point to be expressed first and unambiguously. I will say it again. I do not support the decision to reverse the DRM policy on the Xbox One.

Now that I have that out of the way, let me go into my rationale. This decision removes most of the cool features that enticed me to pre-order the console. No, I didn't cancel my pre-order. There is still five months before the release of the console, and there is still a plethora of information that we, as consumers, do not have. With that, it should be noted that much of the talk in this post is speculation and rhetoric. I do not have any insider information that you do not possess.

The persistent connection would have allowed the console to do many of the functions for which we have been begging. That demo where someone was playing Ryse, seamlessly accepted a multiplayer challenge in Killer Instinct, played the match (and a rematch,) and then jumped back into Ryse. That's gone, if you bought the game on disc. The new, DRM free system will require the disc in the system to play a game.

That bullet point where one Xbox Live account could have up to 10 slave accounts so families could play together, no matter where they were located. That's gone as well.

The promise of huge, expansive, dynamically changing worlds that was brought to us with the power of cloud computing. Well, "the people" didn't want there to be a forced, persistent connection. As such, developers can't rely on a connection and, as such, that feature is gone. This is akin to the removal of the hard drive on the Xbox 360.

The list continues, but the enthusiast press has enumerated the list far better than I wish. All of this is because the Xbox team saw the HUGE success of Steam and decided to borrow a few ideas. Yes, Steam. The service that everyone hated for the first six months (for the same reasons the Xbox One is getting flack.) There was an initial growing pain. However, it is now lauded as the way games distribution should be handled.

Unless you are Microsoft.

I do find it curious that many of the features were originally announced for the PS4 during its unveiling. However, much of that was left strangely absent for Sony's E3 press conference. Instead, we received a single, static slide that basically said the exact opposite of Microsoft's plans. It is not farfetched to believe that slide came into existence during the approximately seven hours between the two media briefings.

The thing that majorly annoys me over this whole kerfuffle is that the single thing that caused the call to arms is, really, not an issue. Microsoft never said they were going to block used sales. They said it was up to the publisher to make that decision. This would have allowed publishers to reclaim some of the costs of development in subsequent sales of the product. If you sell your game to GameStop for 7 USD, GameStop is going to sell it for 55 USD. That is 48 USD pure profit for them.

Some publishers asked GameStop for a small cut. Was this a huge, money grubbing scheme? Well, yes, but the idea was that they have to handle server infrastructure for dormant accounts, etc. Of course, GameStop flatly refused, and the Online Pass was born. Fortunately, this trend didn’t last, and most publishers have stopped the practice.

The ability to sell "licenses" has already begun to be challenged. Are you living in the EU? If so, companies must allow you to sell digital property. With this precedent in place, it's only a matter of time before other areas follow suit. If GameStop were smart, they should have immediately contacted every publisher out there to get the rights to become a clearing house for these licenses. Then, they keep their business model and could reduce their brick and mortar footprint.

The digital landscape is changing. We need to not block this process. As Seth MacFarlane best said "Some issues are so important that you should drag people kicking and screaming." I believe this was said on an episode of Real Time with Bill Maher about the issue of Gay Marriages. Much like the original source, this is an issue that we need to drag people to the correct, progressive position. Microsoft, as a company, actually has the resources to weather the transition period. They have a great pool of first and second party developers that can leverage this new framework to prove the validity. Over time, the third party developers will get excited to use these tools.

As an old C++ guy, I resisted C# for years. Now, I think it's one of the best languages I've ever used. I have a server room and a Co-Lo full of servers, so I originally didn't see the value in Azure. Now, I wish I could move every one of my projects into the cloud. I still LOVE getting physical packaging, which my music and games collection will proudly attest. However, I have started to see the value in pure digital, and have found ways to integrate this into the ways I consume those products.

I can, honestly, understand how some parts of the population would be very apprehensive about this new landscape. There were valid arguments about people with no internet access. There are ways to combat these problems. These methods do not require us to throw the baby out with the bathwater.

However, the number of people in the computer industry that I have seen cry foul is truly appalling. We are the forward looking people that help show how technology can improve people's lives. If we can't see the value of the brief pain involved with an exciting new ecosystem, than who will?