Website may be up and down over next few months. I'm currently doing a complete overhaul of everything. Going back to simple individual .htm pages, new overall site theme, sanitizing and cleaning up html of all pages and blog posts, attempting to implement a new tooling and publishing system etc etc.

If you need to retrieve the default Arial font via code at runtime you can do so using the Resources.GetBuiltInResource method.

var font = Resources.GetBuiltinResource(typeof(Font), "Arial.ttf") as Font;

If you need to stylize your gui you can use the GUISettings class to change, the cursor color, flash speed, the selection color for text fields, as well as double click behavior.

    public class GuiSettingsExample : MonoBehaviour
    {
        public Color cursorColor;     
        public float flashSpeed;      
        public bool doubleClickSelectWord;       
        public Color selectionColor;             
        public bool tripleCLickLine;             
        private string text = "test string";     
        private Vector2 scroll;                  
        public GUISkin skin;                     

        public void OnGUI()
        {
            GUI.skin = this.skin;
            var settings = GUI.skin.settings;
            settings.cursorColor = this.cursorColor;
            settings.cursorFlashSpeed = this.flashSpeed;
            settings.doubleClickSelectsWord = this.doubleClickSelectWord;
            settings.selectionColor = this.selectionColor;
            settings.tripleClickSelectsLine = this.tripleCLickLine;


            this.scroll = GUILayout.BeginScrollView(this.scroll, false, false, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true));
            this.text = GUILayout.TextArea(this.text);
            GUILayout.EndScrollView();
        }
    }

// <copyright>
//   Copyright (c) 2012 Codefarts
//   All rights reserved.
//   contact@codefarts.com
//   http://www.codefarts.com
// </copyright>

namespace Codefarts.ObjectPooling
{
    using System;

    /// <summary>
    /// Provides a generic object pooling manager.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class ObjectPoolManager<T> where T : class
    {
        /// <summary>
        /// Holds a reference to a singleton instance.
        /// </summary>
        private static ObjectPoolManager<T> instance;

        /// <summary>
        /// Used to track the number of items that have been pushed to the pool.
        /// </summary>
        private int count;

        /// <summary>
        /// Holds the pooled item references.
        /// </summary>
        private T[] cachedItems = new T[10000];


        /// <summary>
        /// Gets or sets the creation callback.
        /// </summary>
        public Func<T> CreationCallback { get; set; }

        /// <summary>
        /// Gets the number of items in the pool.
        /// </summary>
        public int Count
        {
            get
            {
                return this.count;
            }
        }

        /// <summary>
        /// Pops a item from the pool.
        /// </summary>
        /// <returns>A pooled object reference.</returns>
        /// <exception cref="System.NullReferenceException">'CreationCallback' property must be set if you try to pop a item and there are no items available.</exception>
        public T Pop()
        {
            // lock here to prevent treading conflicts with array manipulation
            lock (this.cachedItems)
            {
                // check if there are any pooled objects
                if (this.count < 1)
                {
                    // check if creation callback is null
                    if (this.CreationCallback == null)
                    {
                        throw new NullReferenceException("'CreationCallback' property must be set if you try to pop a item and there are no items available.");
                    }

                    // there are no available objects so create a new one.
                    return this.CreationCallback();
                }

                // reduce the count
                this.count--;

                // retrieve the item and return it
                return this.cachedItems[this.count];
            }
        }

        /// <summary>
        /// Pushes the specified value.
        /// </summary>
        /// <param name="value">The value to push into the pool.</param>
        public void Push(T value)
        {
            // lock here to prevent treading conflicts with array manipulation
            lock (this.cachedItems)
            {
                // update the count
                this.count++;

                // if we need more room for storage increase the size of the cache array
                if (this.count > this.cachedItems.Length)
                {
                    Array.Resize(ref this.cachedItems, this.cachedItems.Length * 2);
                }

                // store the value 
                this.cachedItems[this.count - 1] = value;
            }
        }

        /// <summary>
        /// Gets the singleton instance of the class.
        /// </summary>
        public static ObjectPoolManager<T> Instance
        {
            get
            {
                return instance ?? (instance = new ObjectPoolManager<T>());
            }
        }
    }
}

And some unit tests to go along with it.

// <copyright>
//   Copyright (c) 2012 Codefarts
//   All rights reserved.
//   contact@codefarts.com
//   http://www.codefarts.com
// </copyright>

namespace Codefarts.Tests.ObjectPooling
{
    using System;

    using Codefarts.ObjectPooling;

    using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;

    [TestClass]
    public class ObjectPoolingManagerTests
    {
        ObjectPoolManager<TestObject> manager;

        [TestInitialize]
        public void Setup()
        {
            this.manager = new ObjectPoolManager<TestObject>();
        }

        [TestCleanup]
        public void Cleanup()
        {
            this.manager = null;
        }

        public class TestObject
        {
            public string stringValue;
            public int intValue;
        }

        [TestMethod]
        public void Pop_With_Empty_Pool_NoCallback()
        {
            try
            {
                var item = this.manager.Pop();
                Assert.IsNotNull(item);
            }
            catch (Exception ex)
            {
                Assert.IsTrue(ex is NullReferenceException);
            }
        }

        [TestMethod]
        public void Pop_With_Empty_Pool_WithCallback()
        {
            try
            {
                this.manager.CreationCallback = this.Callback;
                var item = this.manager.Pop();
                Assert.IsNotNull(item);
                Assert.AreEqual(0, item.intValue);
                Assert.AreEqual(null, item.stringValue);
            }
            catch (Exception ex)
            {
                Assert.IsTrue(ex is NullReferenceException);
            }
        }

        private TestObject Callback()
        {
            return new TestObject();
        }

        [TestMethod]
        public void Push_Object()
        {
            try
            {
                Assert.AreEqual(0, this.manager.Count);
                this.manager.Push(new TestObject());
                Assert.AreEqual(1, this.manager.Count);
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.ToString());
            }
        }

        [TestMethod]
        public void Push_Pop_Objects()
        {
            try
            {
                Assert.AreEqual(0, this.manager.Count);
                for (var i = 0; i < 3; i++)
                {
                    this.manager.Push(new TestObject() { stringValue = "Item" + i, intValue = i });
                }

                Assert.AreEqual(3, this.manager.Count);

                for (var i = 3 - 1; i >= 0; i--)
                {
                    var item = this.manager.Pop();
                    Assert.AreEqual(i, item.intValue);
                    Assert.AreEqual("Item" + i, item.stringValue);
                }

                Assert.AreEqual(0, this.manager.Count);
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.ToString());
            }
        }
    }
}

Did you know that the GUI class has a matrix property that you can use to rotate and scale your gui elements.

The sample behavior that is provided below will scale and rotate a gui label in the center of the screen.

public class GuiMatrixDemo : MonoBehaviour
{
    private float rotation;

    /// <summary>
    /// OnGUI is called for rendering and handling GUI events.
    /// </summary>
    public void OnGUI()
    {
        var matrix = GUI.matrix;

        GUI.Label(new Rect(5, 5, 100, 20), "before matrix");

        this.rotation += 15f * Time.deltaTime;
        var scale = Mathf.Clamp((float)Math.Sin(Time.time) + 1 * 2, 1, 3);
        GUI.matrix = Matrix4x4.TRS(new Vector3(Screen.width / 2, Screen.height / 2, 0), Quaternion.Euler(0, 0, this.rotation), Vector3.one * scale);
        var size = GUI.skin.label.CalcSize(new GUIContent("test string"));
        var rect = new Rect((-size.x / 2f), (-size.y / 2f), size.x, size.y);
        GUI.Label(rect, "test string");
        GUI.matrix = matrix;
        GUI.Label(new Rect(5, 25, 100, 20), "after matrix");
    }
}

CMS theory for websites part 1

Published 12/18/2013 by createdbyx in News | Programming
Tags:

NOTE: Originally written in March 2013 I’m only getting around to posting this now. :(

A long sorted history of technological bloat warez …

I have been kicking the following ideas around for a while now and may soon start to implement them. I have become frustrated with the whole slew of content management systems from Wordpress to BlogEngine. They all have a tendency to lock you into there system and there way of doing things not to mention that there is no guarantee that these platforms will exist or still be popular 5, 10, 20+ years from now as technology is constantly changing. The only thing that has remains relatively consistent over the last 20 years has been html markup. in other words the raw data.

I have maintained the content on this personal website of mine for over a decade even before I registered the domain createdbyx.com. And the one thing that has remained consistent is the manual labor involved every time I decided to port the content of this site over to a new platform from straight html pages, to DotNetNuke, to BlogEngine, to a partial port over to asp.net mvc etc. Porting the content over from one platform to the next, and having to adapt and convert the content from one database to another, one theme/skin system to another simply is not going to cut it any longer. As time goes on and as the volume of content continues to grow porting that content over to yet another platform becomes more and more tedious.

I am a long term thinker when it comes to this type of stuff because I fully intend to maintain and update this site for the next 50+ years and beyond. I care about preserving the content & data on my various web sites in a human readable platform independent format.

I began playing around with some ideas on my test server boobietaunt.com using asp.net mvc. My intension was to develop a single page website that had a similar Live Tiles system as the windows 8 start screen. The whole thing would in fact be rendered via jQuery GET requests and dynamically replace content on the page so there would actually be no page loading. But as I discovered search engines like Google frown on this because it’s too difficult for there systems to crawl & index the website content. And it would ultimately obliterate my SEO search rakings. So that approach was not going to work, not to mention the issues with managing history via JavaScript and browser incompatibility issues etc. *sigh* just kill me nao :(

Although I never fully abandon any of my coding work I did stop working on the asp.net mvc implementation of my prototype createdbyx.com website in favor of a even simpler solution. Or so I thought. With Asp.net mvc again I found myself needing to learn new ways of doing things IE: the mvc way of doing things, and not only that I was using the Razor view engine. As much as I applaud the effort of the asp.net mvc team for helping to make asp.net development more easier and cleaner, I decided to stop using it before I devoted too much time going down that rabbit hole.

With asp.net mvc I was locking my self into a system of Razor syntax and Controllers that was again pushing me further and further away and putting more technological layers in between what I was trying to do which was to simply serve up html content. At this point for reasons unknown I got it in my head that I could write a better system then the asp.net mvc team, and in some ways that’s just what I did. And I did it in around 1000 lines of code. I essentially created a simplified MVC clone with Controllers and Views that could be extended upon. A feat I am actually personally proud of considering it has many of the same core features as mvc but does it in just under 1000 lines of code. I wrote it back when mvc 1 was still in beta and just being introduced and then I abandoned it to go work on my various other projects.

The custom built mvc clone I created is (as of this writing) powering my codefarts.com website. After having dusted it off and used it to power my codefarts website I have again come to the conclusion that it is far too complicated a system to use even though it’s hardly any code at all and the compiled assemblies for handling localization, security, settings, blogging, Views, Controllers, and extensions only amount to a combined 175k worth of (debug) dll files.

CodeFartsbinaryfiles

The future going forward …

Trying to think up a ridiculously simple solution for publishing html content is deceptively complex with so many CMS choices out there, but there have been some new ways of doing things as of late that could change all that.

What if you could power a personal website without databases & without using a traditional content management system? What if you could create and update the content on your local machine, have it automatically backed up to the cloud, automatically synchronized across multiple computers, and have it support versioning & branching like a CVS all without even having to log in. You could search for content you have previously written, you could even create or edit content even if you were using someone else's computer, and it could support multiple contributors to your site.

Now what if you could do all of that using just html files and some popular free software. The answer is pretty much YES!

Here is a potential publishing scenario …

  1. Open up notepad or your favorite html editor and write some content
  2. Save to a specific folder on your computer
  3. The system automatically syncs the file to the cloud and all other computers of your choosing (Google Drive, SkyDrive, DropBox, AeroFS etc) providing automatic off site backups.
  4. Automatic syncing your local working copy of your site file to the webserver involves a program like SyncBack that runs at scheduled times via windows scheduler to sync files to the web server.
  5. A program always running in the background could detect the changes and commit the changes to a local git repository. As well as the option to publish the files to a git server to provide yet another secondary off site back up.

These are just some of the scenarios that you could set up to automatically publish your website content to the web server.

The end goal?

The elimination of any and all unnecessary server side code. If I could think of a way to go back to managing a website using pure html pages I would, but there are some key pieces of server side code that still need to be present like site templates, a blogging and page caching system.

From a security standpoint the most secure code you can write is no code at all. The more code you write the more vulnerable you make yourself. So focusing on your absolute core needs is essential.

--------------------------------------

Since I originally wrote this post back in march 2013 I have since written a entirely new (and more simplified) web server back end and have ported the local copy of my codefarts.com website over to it. I’ll be making future posts regarding this new system and the reasons why it is even better then the custom built MVC clone I described earlier in this post.


The funny thing about brain disorders is that they affect the one part of your body that you are unable to perceive as being afflicted with something. Kind of like how crazy people don’t know there crazy.

When trying to come up with a name for this disorder I asked stack exchange and got a number of helpful responses. Everything from Analysis paralysis to having a Rube Goldberg mentality.

No matter what I do, I can't help but overcomplicate almost every piece of code/application I write. My mind automatically jumps to thoughts of 'OK, I'll need to write this, this, this, and this, and I'll need to make sure to use a repository and MVVM patterns, utilize this and that library' etc. An hour of coding later and it's already spiraling out of control with features & settings that don't need to be there.

This last week I have recently been spending some time on my old WowTracks.com website, in particular the data acquisition utilities needed to capture and store the World of Warcraft armory data. I started by thinking about what kind of app I needed and where it was going to be run. I considered writing it in Unity3D first so that I could port the application to multiple platforms, but unity’s GUI system is too much of a hassle when it comes to presenting large amounts of complex data. I also considered a win forms app, Windows store/Metro, WPF, Silverlight, or even a console application.

I ended up starting to write it as a console application thinking that I did not need to do anything fancy just create a app that schedules downloads of armory url’s at specified intervals. Didn’t take long for me to realize that a console app was not going to cut it.

I then started to write it as a win forms app only to discover that the data binding was severely lacking compared to WPF and I would have to do a lot of manual coding. After scrapping the win forms app in favor of a WPF app things were going fine until I ran into a little issue with my PC randomly freezing up for one second at a time then unfreezing for one second and repeating until I restarted my computer. At first it was confusing because even after managing to get visual studio to quit my system seemed fine but when I mouse over a link in a web browser (IE, Firefox, Chrome) would cause the system to start locking up for one second intervals again.

Initially it seemed like a virus or hacker got into my system as it was only affecting browser applications but from doing some internet searches it seems there is a huge bug with .net 4.0 and WPF. Something to do with UI automation and large complicated visual element trees causing WPF to cause a system to lockup and slow down. This did not bode well for writing the application in WPF.

*sigh* back to writing the app in win forms again. /rollseyes

After a week of back and fourth and nothing to really show for it, most of the time I spent and code I wrote got me further and further away from the end goal. Which leads me the title of this post. I have self diagnosed Anal-para-complica-tard-isis syndrome.  In other words I suffer from analysis paralysis complicatardation with acute over engineering retarex.

Definitions:
Complicatardation (n.) "someone who is retardedly over-complicated"
Retarex (adj.) "something that is complex to a retarded degree."
Portmanteau “a combination of two (or more) words or morphemes, and their definitions, into one new word.”

PS: You see what I did thar? :P


Code search woes

Published 11/27/2013 by createdbyx in News
Tags:

As a programmer I am getting a bit frustrated when it comes to repeating my self. 

I have started a few hundred .net projects over the last 10+ years and too often I find myself needing to write a piece of code that I am sure I've written before. As soon as I get a sense of dejavu I stop and think OK where and in what project could that piece of code be located. 

Performing windows explorer searches are useless in this case as you never know what the method name was or if it was a piece of code within a method. Simple text based file contents searches are just not up to the task. And they are painfully slow and can return hundreds of files.

There are similar solutions like Krugle, or Ack etc but many of these are on-line search tools. 

What I am looking for is something for windows that can run on my local machine and parse/understand C# .cs and VB.net .vb code files. 

A visual studio extension would be ideal, but the ones I've found only search the open solution not a entire folder hierarchy containing multiple projects etc.

For example I have written a piece of code that you give a directory path and it will return a list of files from that directory structure even files that are in sub folders. But here is what I know...

  1. It uses GetDirectory or GetFiles but does not use GetDirectories
  2. It's a method that takes at least 1 string parameter
  3. It returns a List<> string[] or some type that implements a IEnumerable interface
  4. It's less then 100 lines of code give or take
  5. It may or may not recursively call it self

Given these points of data search every folder and sub folder for methods within code files that contain the closest match.

If I can't find a utility to do this I'm going to say screw it and write my own. Even though I don't really want to have to.


These last few days have been testing my patience. Three of my devices Razer Naga Epic, Steel Series 7H & Microsoft Surface Pro 2 all failed within the last few days. I’ve always meant to write a review on these devices after having used them for a long while so I am writing the reviews now while I’m still angry!

Razor Naga Epic

Just before writing this post my naga epic mouse just bricked it self on me again. Seems if you are running the mouse wirelessly and the battery dies it will brick itself and become totally unresponsive. The support website says to leave it plugged in for 30 minutes to let the battery charge up a bit and it unplug it then plug it back in and it should just work. With the 5+ times that the battery has died on me this has never ever worked. The only way to get it back to working condition was for me to flash the firmware yet again! Immediately after the firmware finished flashing poof everything works again!

Essentially this mouse is fucking useless as a wireless mouse especially when you are like me and always forget to dock it or plug it back in BEFORE the battery dies. Not to mention the fact that the battery does not hold a charge worth a dam and it never has compared to the three Logitech mice I have owned over the years. I have owned this mouse for only about two years and after the first few weeks of accidentally letting the battery die multiple times I swore up and down I would never use it in wireless mode ever again.

And like a fucking idiot who clearly has not learned his lesson, two days ago I started using it in wireless mode again. Guess what? Battery died while using it and It bricked itself AGAIN!

$100+ dollar “gaming” mouse that bricks itself. Fucking. Awesome. It must have been a value added feature I over looked when purchasing. The Razer Synapse software you use for setting up the buttons doesn't sync worth a dam between multiple computers, and takes up way too much memory for what it does. I guess that is what $100 gets you now a days.

Steel Series 7H Headphones

What looked to be a good set of headphones after reading reviews turned out to be typical plastic bullshit. It only took a month for the glue holding the padding on the top connector bar to start to separating. It never separated more then an inch on one side and was not a real issue but still. They could not chip in for a stronger adhesive?

Within the first three months I had to replace the Mini-usb/audio jack cable due to a line break at the usb end connector. I had to position the wire with a bend in it just to get it working. So I ordered 2 replacement cables “Just in case” it broke again. Over the last year I have been having issues with the contact points where the headphones unclip and disassemble for easier transport. I was having to twist the headphones back and fourth a bit while on my head to get the sound to work.

Then just two days ago the right ear stopped working and the only way to get it working albeit for a fraction of a second is to rotate the right ear muff 90 degrees from the head strap part. Because of this it seamed to me that there was a wire getting pinched so I took the right ear piece apart and repositioned the wire a bit offset to give it more slack but with no success.

I wear the headphones fully extended to fit comfortable around my head and white looking at the top piece with the padding strip on it it appears as though at both ends where the contacts are the plastic is cracked. I guess I must have a huge bobble head.

Again $100+ dollar headphones dead after two years of infrequent use. I prefer using my 5.1 desktop surround sound so I hardly ever used them unless I was traveling or away from home. I bought them because I thought to myself hey they have good reviews and they come apart for easy transportation. Only two years with light use and there basically toast. Waste of fucking money. Went online to look for decent replacement headphones. Prices $80+ Fuck me the prices are ridiculous.

Microsoft Surface Pro 2

So earlier this morning I was mid sentence writing a line of code and poof the screen goes black and the lights were off on the usb mouse and keyboard I had plugged in. I was like “what the hell”? Did the system go into a sleep mode? That can’t be right I was actively coding. I tapped the windows logo at the bottom of the surface screen and it would give vibration feedback indicating that the button was tapped but nothing would happen. I tried Ctrl+Alt+Delete nothing. Windows Key+ L again nothing. The white light on the end of the power cable was on and it was giving vibration feedback when the windows logo was pressed but other then that it was a totally unresponsive black screen.

“What the hell is going on here” I thought. I tapped the power button and still nothing. Then it hit me. What if it tanked and died permanently? For fuck sakes if it did It would mean I have no access to the hard drive because the fucking thing is glued together so there goes any chance of me getting my data off the system. Even if I could get to the hard drive there is no indication that it is a standard laptop ssd that I could just pop into another computer. It could very well be soldiered on to the motherboard. This is why I had a strong hesitation against buying a ultra portable computer. You can’t take it apart easily.

I started looking around on the internet and found a few articles with people having similar black screen issues. I held the power button down for 10 seconds, then held the volume up rocker and the power button for 10 seconds. Finally I managed to get it to reboot.

“What a fucking week, what next!”

I was keeping all my data on a 32gb SD card but then I deleted a code file and a few minutes later wanted to undelete it. Turns out there is no recycle bin for SD cards. Oh fuck no. So I moved my data over to the ssd as it was a bit faster working with files anyway and was going to setup a automated backup from the ssd over to the SD card using SyncBack free.

Then this morning the black screen of paranoia hit me and I realized that only some of my data is backed up to the cloud (SkyDrive). The rest was stored on the ssd, so had the system had a actual meltdown I would have been fucked and lost virtually all my data.

So my thinking was to keep all of my data on the SD card but with no recycle bin this become an serious issue. Storing files on the ssd without a backup solution is equally foolish as you can’t even get access to the physical ssd without destroying the machine. Putting files on the ssd and file backup to the SD card was my only option.

Microsoft SkyDrive

*takes a deep breath. Lets out long drawn out sigh*

How in the fuck can a company like Microsoft fuck up SkyDrive so badly. Ever since I have tried to use it back when Windows 8 first came out SkyDrive has displayed wonky messages, frequently takes up 30% of my CPU cycles and simply has not worked as expected compared to any and all other cloud based storage apps/services.

So one of the things I have foolishly tried to use again this week is SkyDrive to keep a cloud backup of my data. With the Surface Pro 2 I have 25gb plus another 200gb of free storage for two years. Shortly after Windows 8 launched I tried to move a few hundred thousand files from my coding projects over to SkyDrive so I could have them synced across all three of my machines. It took three fucking months to sync 8+ gigs of files. Three fucking months! On a 20mbit internet connection no less.

Since then I had stopped using it, but this week I gave it another try and moved my data from the SD card to the ssd (SkyDrive folder) and again this time I copied just over eight thousand files (about 300Mb) and two days later? Maybe a dozen or two code files had been backed up to the cloud. These are not big files they are code files! They are it’sy bitsy teeny weeny and SkyDrive seems to choke on them when trying to sync.

Google drive, Drop Box start syncing files immediately and work tirelessly to sync your files as soon as possible with little cpu overhead. SkyDrive seems to sit around on it’s ass twiddling it’s thumbs completely oblivious that I just put files into it’s folder. Then it has a heart attack when it realizes that there are files in it’s folder and starts taking 30% of my cpu cycles and after that still fucking seems to do nothing or next to nothing.

I have 225gb of SkyDrive storage and will not be using any of it. I do not ever want to have to think of using SkyDrive as a cloud backup service. 225gb of free online storage and you can’t even get people to use it. That’s how fucking craptacular your service is Microsoft. Zero customer trust. And to think a year ago for a brief moment I actually considered to pay for more SkyDrive space at one point. F that.


Surface Pro 2 Week 1

Published 10/31/2013 by createdbyx in News

So I received my Surface Pro 2 on October 25, 2013 and have been using it as my main machine this last week. Having never owned or even used a tablet before it has only been a slightly interesting experience as I am not one to get excited about such things.

Frankly the most immediate drawback to the tablet was running desktop software that has no touch support IE: Unity3D editor. It is making me realize that as a software developer I need to be making an extra effort thinking about touch integration. I was one of those people who really does not like the new windows 8 metro interface integration. As a developer I understand the reasons for it but even a year later it still has that meh feel to it.

It’s only now that I have been using a tablet this last week that I am actually beginning to conceptually understand the reasons for it moving forward. On the desktop metro does not make sense, when using a tablet the windows desktop does not make any sense. There is this incompatible duality about it, but all in all it kind of works, but it still feels like it could use some more finesse.

But getting back to the Surface Pro 2 I knew what I wanted out of a tablet

  • Pen/stylus for drawing sketches, note taking, making pixel art, sculpting in a 3D app etc
  • Decent battery life
  • Minimum 1080p display resolution
  • Full windows 8 pro experience so I could run all my applications and developer tools etc
  • Reasonable performance
  • Something in my price range IE: $1000+/-
  • It had to be able to at least play games like Skyrim at playable graphics settings
  • Minimum 8gb ram and 256gb ssd
  • Some sort of stand

After having looked around at a number of tablets Microsoft’s Surface Pro 2 was really the only logical choice. It has all the features I was looking for in a tablet aside from a replaceable battery, and no keyboard. I am holding off getting a keyboard until 2014, so that I can get a power cover that will further extend the battery life. Again the power cover keyboard is a ridiculous price at $200.

I do want to mention a few things about the marketing for the surface pro offerings. The way that they talk about the kickstand and the sound it makes like it’s the most coolest thing ever. It does not help the brand it hurts it. It’s a kickstand, so long as it does it’s job there is nothing more to say about it. They should be focusing on how it can be a desktop replacement for a lot of casual pc users. They should be touting it’s battery life etc. and not trying to make something trivial more then what it is. It cheapens the product.

Another thing I like about it is the fact that I no longer have to position it on my lap in such a way so it will not block any fans. Often times the air intake, and exhausts on laptops are poorly placed such that by placing them on your lap your legs block the air intake. The fan noise is not even audible, and even after playing a game the fan noise is still very quiet.

Lenovo has a new Yoga 2 Pro with similar specs but much higher screen resolution and better battery life but at the expense of being a bit heaver. With the 10.6in screen on the surface pro 2 and 1080p resolution individual pixels are just barely visible with 100% scaling. So I really don’t understand the purpose of higher resolution displays being used on small 13in screen sizes and under. More pixels means more processing and that actually hurts battery life, and frankly it really is unnecessary.

A funny thing just happened as I was writing this post, I got a BSOD message with a DPC_WATCHDOG_VIOLATION code. That’s the first time in many years probably since windows xp that I have experienced a bsod error. It happened while I was watching a flash video in internet explorer.

What I don’t like about the surface pro 2

  1. No replaceable battery. My laptop lasted me 7+ years but it’s battery no longer holds a charge. This is my single biggest concern.
  2. No replaceable ssd. With ssd capacities growing and prices getting cheaper being able to upgrade after 5+ years would be nice, 1080p, 2k & 4k video take up a hell of a lot of room
  3. Built in obsolescence aka 12 month release cycles & glued together components etc
  4. Only 8gb of ram is not enough when you are running 4 instance of visual studio, 3 instances of unity, a dozen browser tabs etc. It sounds a bit extreme but my desktop has 3 monitors and I work with multiple related coding projects at the same time
  5. Does not come with a keyboard and the keyboard prices are rather ridiculous
  6. Even with the 2 position kickstand it still does not quite sit at the right viewing angle on your lap
  7. No place to attach the pen when the power is plugged in. A place at the top of the tablet would have been nice, or better yet a hole in the tablet that you could insert the pen into like the Nintendo 3DS
  8. No magnetic lock on the keyboards when closed to prevent them from flapping open unintentionally
  9. The fear that one day I am going to break off the kickstand.
  10. Poor placement of the magnetic power coupling. I wish it were higher up along the side of the device closer to the top. The reason for this is because of the constant bend in the power cable. Over time I think there is a small chance it could wear out and have broken or kinked wires inside.
  11. The front facing camera could be pointed down just a few degrees to get a better head shot. Often my chin gets cropped off and I need to reposition the tablet when being used on my lap or lying back in bed. The alternative is to have a much higher resolution camera with a larger FOV.
  12. You can’t open it up to clean out any dust that has accumulated. As the years go by more and more fine dust will build up internally so my concern is that you may see a performance hit over the years because of poor ventilation. You could use a can of air to spray it out but given the size of the gap I’m concerned any large dust bunnies could get wedged in even further

What I would like to see in future surface pro hardware

  • Dedicated graphics hardware
  • At least 2 usb 3 ports
  • A replaceable battery/ssd
  • Slightly larger screen size offerings still at 1080 resolution
  • 32gb ram to help future proof the hardware and offer space for super speed ram drives
  • More sensors
  • DisplayPort in so you can use your tablet as a extra touch screen monitor
  • Kinect camera integration
  • A AMD based sku
  • Magnetic lock on the keyboard to make it stay securely attached to the screen when closed and used as a screen cover.

I believe with these few extra features (even without kinect camera integration) the surface pro line of tablets could be poised to take a dominant share of the tablet market. They have everything going for them but Microsoft being who they are will probably fail to capitalize on it. Stay tuned for further updates about my experience with the surface pro 2.


I am back from picking Matsutake. It’s supposed to be nice this upcoming week in my area so I may try and take a few trips up near the airport to see if I can find any more.

Also now that I am back I will be continuing my Code snippet and Unity tip series of posts, so watch out for them.


Created by: X

Just another personal website in this crazy online world

Name of author Dean Lunz (aka Created by: X)
Computer programming nerd, and tech geek.
About Me -- Resume