Analytics software allows you to instrument your code.  This instrumentation can allow you to see what features are being used, generate timing information, monitor exceptions, and send information.  Homegrown instrumentation solutions can be written quickly and do some of the basics, but they lack the functionality of a commercial product.

A commercial product will provide a clean API, have the ability to send the data over the internet (rather than store it in a log which must be retrieved), and have a wide range of reporting capabilities (which homegrown solutions almost never have).

I have been using EQATEC Analytics for the past few weeks and it has all the features you would expect and more.  The dashboard provides excellent reporting capabilities which let you see, over time, how your features are being used and if you have any timing problems.  In addition, it logs all of your exceptions and allows you to track and close them as you fix the underlying issue.

In addition, since it is an enterprise-level solution it allows you to track multiple products and provide all the developers in your organization with their own access credentials.  You can even partition the products so that developers only have access to the products they care about.

Check it out,
Posted by Chet at 11:20 AM0 Comments

I *hate* that there isn't a "bucket" to store information this control.  Lets say that the CheckBox is associated with a row in a table.  Each row is associated with an entry in the database, and they all have a primary key.

I should be able to stuff this primary key into the CheckBox somehow so that I can retrieve it easily later.
Posted by Chet at 5:23 PM0 Comments

OAuth essentially lets you issue a shared-secret to a client application (even if is written by us).  The shared-secret is tied to a key.  When a request is made, the payload is "signed" by hashing the secret with the payload.  Then the payload, the signature, and the key is sent to the server.

The server looks up the secret in the database using the key.  It then hashs the incoming payload with the secret.  If the signature matches, then you know that the client had the correct secret.

This lets you lock down *what* can access your web services.  Meaning, third party developers can't use are services without our permission, even if they have valid user credentials.

Another aspect is *who* can access the web service.  This is handled by issuing another shared-secret which is dependent on the user AND the client application.  Then the payload is hashed with the user shared-secret and the client shared-secret.

This allows third parties to "log in" as the user, even though the user didn't give the application his password.  We haven't implemented this part yet.
Posted by Chet at 5:59 PM0 Comments

My remote control lanwmower project is pretty much done.  All that is left are some nice-to-have features like remote kill-switch, putting larger caster wheels on the front, mouting the electronics.

I have posted two videos on youtube.  They are scenes of my testing when my wife happened to have the camera, so they are not the most impressive demonstrations.

Trial run of just the frame
Lawn mower installed and cutting some grass

I think it goes 10-15 mph, but that is way to fast to cut the grass.
Posted by Chet at 2:27 PM0 Comments

I have started learning HTML5.  As my first project, I have done a first-pass on converting my XNA clone of Descent.  I call it Descent5.

Obviously there is a huge amount of functionality missing, but I think it is impressive.  I am using the Three.js library.  Right now, because I am using features specific to WebGL, you must use Chrome to view this demo.

Please be patient, it has to download a bunch of texture files and process of the vertices in the map.  It could take a minute before it shows anything.  Use your mouse and (A, W, S, D) to move.
Posted by Chet at 5:36 PM3 Comments

My latest Arduino project is a device that logs into my bank and displays my checking account balance on an analog gauge (like a gas gauge on a car).

Using the WiFi capabilities of the YellowJacket from Async labs, every five minutes it connects a web service running on my web server.  My web service uses screenscraping to log into my bank account and determine the amount.  It converts this value to a range from 0-255 which is sent back to the Arduino.

The Arduino outputs this value on an analog pin which is connected to the gauge.  If my account has $500, it is "full".  If it is $0, it is "empty.

The YellowJacket was $55.  I got the gauge from Skycraft for around $10.  I also bought a nice enclosure box to put everything in, which was $5.  So, all told, the project cost $70.  That being said, the YellowJacket can be used for other projects (like my TwitterSwitch), so it isn't like I spent $70 just on this.
Posted by Chet at 3:50 PM0 Comments

At Christmas time, my wife is always asking me to turn on the lights on the tree.  This means I have to get up, walk over there, reach behind the tree, and plug them in.  Then I have to do the same thing before we go to bed.

Now this will be a thing of the past.

The YellowJacket is an Arduino + WiFi device which I got for Christmas last year.  This allows the Arduino to connect to the internet.

I wrote a web service which checks the latest status of a particular Twitter user.  It then returns a 1 or 0 depending on the status.  "Turn on" is 1, "Turn off" is 0.

The Arduino checks the value of this web service every 30 seconds.  When the value is 1, it turns on a solid state relay.  I have this relay wired like a switch to a power outlet.  I just plug the lights into this power outlet.  The relay is rated up to 25 amps, so technically I could use this to control almost anything no matter what size.

The YellowJacket was a Christmas gift, but it costs around $55.  I got the solid state relay from Skycraft for around $5.  I also bought an A/C outlet from the Home Depot for a few dollars.  I just need to put it all in a box.

Now, when my wife wants to turn on/off the lights, she can just log into Twitter and post the correct command.

In addition, I have my phone set to post to this Twitter account, so I can just send a text and control the lights.  I am very proud of this project.

I build this project several months ago, but I forgot to post and entry on my blog.
Posted by Chet at 5:20 PM0 Comments

I was perusing a book at Barnes and Noble over the weekend.  The book was about software development as an occupation (as opposed to the technical aspects).  Once chapter was about interviewing and some of the non-technical questions that people get from organizations like Google.

These are questions that you are not expected to know the answer to, but are intended to show your thought process.

There was only one question that I really looked at, it was "How many gas stations are in the United States?".  The example for how to come to an answer analyzed the question from the aspects of average number of cars served per hour.  He came up with 33,000.  He also said that to be considered correct, you should be within an order of magnitude (so his answer is close enough if the actual answer was closer to 33,000 than it it was to 330,000).

I gave it some thought the other day while I was driving, and I went about it in a different fashion.

Saint Cloud has a population right around 30,000.  After some thought, I determined that there were 12 gas stations in that city.  So, if I take this as an average city I would say that there is one gas station per 2500 people.  There are 300 million people in the United States, so this yields around 120,000 gas stations.  That would have been my answer.

So, I just thought to check my number.  Turns out, this is suprisingly close.  According to the 2007 census (latest data available), there are exactly 118,756.  I would say that I nailed that. :-)
Posted by Chet at 2:49 PM0 Comments

I just heard John McCain say the dumbest thing about the Reid proposal to raise the debt ceiling.  He said the likes it because it cuts spending by more than it raises the debt limit.

Let's break this down:

It raises the debt ceiling by 2 trillion dollars, enough for it to last until the end of 2012 (just after the elections).  This is a year and a half, which means it raises it by about 1 trillion per year.

It cuts spending by 1 trillion dollars initially, over 10 years.  That means it cuts about 100 billion per year.  It has the ability to cut it by another 1.5 trillion if a committee can agree to the cuts.  This is not going to happen, but let's just say that it does.  That is another 150 billion per year.

So, he says it cuts spending my more than it raises the limit.  Not true, it raises the limit by 1 trillion per year and only cuts an absolute maximum of 250 billion per year.

And it 2012 they are going to have to raise the ceiling again, which diminishes the cut-to-limit ratio even more.
Posted by Chet at 12:22 PM0 Comments

I got a deep frier for Father's Day.  I have always wanted one.

I made some onion petals for Amanda and I other other day to test it, and then I made a big batch of them for Independence Day.  They were a big hit and very easy to make.

My biggest fear is that the machine will be such a pain to clean that I will never use it.
Posted by Chet at 3:03 PM0 Comments

Red-Gate has been warning us that Reflector would become a for-pay product.  Well on May 30th this became true.  Older versions timebombed and you can only get the latest version (7.0) for a $35 fee.

However, they relented somewhat for existing users.  Here you go: if you have an older version you can "update" to version 6.8 for free.  This version will never expire.  However, you need to register it before August 2011.  When you register you get a serial number that can be used on up to 5 machines.

I highly suggest you download this while you still can.  The free version works for most purposes.
Posted by Chet at 2:09 PM0 Comments

When in HTML (or Markup) view, pressing F7 will send you to the code behind.  This is very helpful because that is a common need.

However, there is no shortcut to take you from the code behind back to the markup.  This means that you have to find the file in the Solution Explorer and double click it (or find it in the open files bucket at the top).

I recently discovered that there is a command which will allow you to go back: View.ToggleDesigner.

To set it up go to Tools -> Options -> Keyboard.  In "Show commands containing" enter View.ToggleDesigner, and then press F7 in the "Press shortcut keys".

You can remove the existing shortcut for F7 (View.ViewCode) since this does the same thing.

This is going to save me a lot of time in the course of a day.
Posted by Chet at 3:25 PM2 Comments

This might be useful to someone.  SetFSB doesn't seem to support it, but maybe in the future.  My Dell Optiplex 760 uses the SLG8XP519T for its phase lock loop chip.
Posted by Chet at 4:36 PM2 Comments

We went to Blue Springs State Park over the weekend.  We rented a cabin and stayed the night.

Robbie did not like the cold water at all.  If he was distracted he was ok, but when we were just standing there he literally climbed up me trying to stay out.

I swam deeper into the boil than I ever have, probably about 25 feet.

We bought Robbie a little camping chair, we have a picture of he and I sitting in our chairs watching the charcoal grill.

There is a burn ban in effect in Volusia County, so we couldn't have a fire, which was too bad.

As a side note, if the park is full you can still get in if you are a camper.  Sweet!
Posted by Chet at 2:16 PM0 Comments

Very simple, calling Add will not replace an existing object, it simply returns the object that has the same key.  Calling Insert will replace the object.

I will also point out that when you modify an object retrieved from the cache, you are changing the cache.  You do not need to re-insert it into the cache after you make changes.
Posted by Chet at 4:12 PM1 Comment

Robbie got his first real haircut on Sunday.  We took him to Hair Cuttery in St. Cloud and he patiently sat while the lady cut his hair.  I am always amazed at how relaxed he is.  The "worst" he did was turn his head to look at her.

His hair is very wavly/curly and he has a bunch of cowlicks.  This means that even his cut hair looks strange.  In some ways he actually looks like his younger self.  In other ways he looks more like a little boy and not a baby.
Posted by Chet at 3:45 PM0 Comments

You can configure TFS to do backup if you install the TFS Power Tools.  One configuration is to backup the transaction log every 15 minutes.  The problem is that the backup does not truncate the log file and therefore you end up taking a backup of the hundreds of megs of transaction log every 15 minutes.

The SQL that is executed to do a transaction log backup is something like:

BACKUP LOG [Tfs_DefaultCollection] TO DISK = N'\\TFSDB\TFSBackup\Tfs_DefaultCollection_20101202142822L.trn' WITH NO_TRUNCATE , DESCRIPTION = N'Tfs_DefaultCollection database - Log Backup', RETAINDAYS = 7, NOFORMAT, NOINIT, NAME = N'Tfs_DefaultCollection database Backup', NOSKIP, REWIND, NOUNLOAD, STATS = 10

Notice the WITH NO_TRUNCATE predicate.  This needs to be removed in order to backup properly.

I dug into the assemblies with Reflector and ildasm and a slight tweak to the "Microsoft.TeamFoundation.PowerTools.Admin.dll" assembly (version 10.0.30831.0) will let you remove NO_TRUNCATE. The file is located in C:\Program Files\Microsoft Team Foundation Server 2010 Power Tools\Team Foundation Server Backup Plan\

Using a hex editor (like XVI32), goto position 0x9709 from a 17 to an 18.  This has the effect of changing the LogTruncation value from NoTruncate to Truncate, which will remove the "NO_TRUNCATE" part of the SQL command.

In the process, your strongly named assembly will no longer validate properly.  This is fine for the TfsConfigPT executable because the modified assembly is in its AppBase path.  In this case, strong name validation is bypassed automatically.

When you load the TFS Management Console, it will not be able to load the modified assembly and you will no longer be able to administer the backup configuration.  This is not good.  In order to get the management console to bypass the validation, you need to copy the Microsoft.TeamFoundation.PowerTools.Admin.dll file into the C:\Program Files\Microsoft Team Foundation Server 2010\Tools directory.  In addtion, you need to make a small change to the registry to change where the management console looks.  Just modify the path in HKLM\SOFTWARE\Microsoft\TeamFoundationServer\10.0\Plugins\Backup\Binary.

This may sound like a lot, but it will only take 5 minutes, and it will save a huge amount of harddrive space.
Posted by Chet at 12:39 PM0 Comments

If you are a .NET programmer be aware that .NET Reflector will no longer be free after this month.  I suggest that you save a copy in case you need it again in the future.

If you are a .NET programmer and you don't know what I am talking about, then go here and get Reflector and try it out.  It is a must have utility.
Posted by Chet at 10:47 AM0 Comments

Robbie has been diagnosed with hypotonia.  Basically, it is low muscle tone.  It isn't a strength issue per se, it means that at rest his muscles aren't as "tense" as they should be.

This causes issues because it makes it harder for him to crawl, stand, walk, jump, and run.  It also affects his oral motor abilities and is probably contributing to his lazy eye.  His condition appears to be a relatively mild version.

If left unattended he would develop unhealthy ways to compensate.  Fortunately we have caught it early (very early by some things I have read) and he is now in physical and speech therapy.

The physical therapy has helped enormously.  Whereas a few months ago he wouldn't bear weight on his legs and roll over immediately when placed on his belly, now he is crawling like crazy and standing with support.  We are now working on getting him to cruise (walking with support).  Robbie is actually a very quick study, in less that one week since we started teaching him he is moving the distance of the couch.

The speech therapy is actually feeding therapy and is going to help us deal with his eating issues.  For one, since he has low muscle tone in the mouth muscles, he doesn't work food around in his mouth.  If he can (if the food is soft enough) he just swallows it immediately.  This means that he cannot eat solid foods because he gags on them (because doesn't chew them).  In addition, the epiglottis does not close tight enough when he drinks thin liquids (like water and juice) and so he aspirates.  With time this could cause pneumonia and other respiratory tract infections.  We recently had a swallow study done and they were able to detect this.  Now we are adding xanthan gum to his drinks to thicken them.  This has helped a lot.

In addition, the weak muscles in his mouth make it more difficult for him to practice talking (although he does jabber quite a bit).

Other than these gross motor issues Robbie is doing great.  His doctors and therapists continually comment on how social he is and he seems to be quite intelligent.  His fine motor skills are also good.
Posted by Chet at 10:22 AM0 Comments

When using the table designer in SQL Server Management Studio 2008 SP2 against a SQL Server 2005 database I get the following error: Invalid column name "lock_escalation_desc".

After using the SQL Profiler to see what is being queried by SSMS, I see that the problem is that 2008 expects the sys.tables table to contain a column called lock_escalation_desc.  The problem is that this column wasn't added until SQL 2008.  It doesn't exist in SQL 2005.

Pre-SP2, the SSMS queried the table properly -- that is, it took into account that this is a 2005 database and didn't include that column in the query.  After installing SP2 it stopped working.

Uninstalling Microsoft Sql Server 2008 SP2 resolved the issue.
Posted by Anonymous at 1:10 PM0 Comments

© 2016 Chet Zema π