How can I securely save my app data?

Before we look at encrypting data on a device, you may want to read up on this.

What do you mean I have to be “properly authorized” to use encryption in my apps?

Unity has this very nice feature of being able to easily store data on the device via “PlayerPrefs”. The only problem is that it is stored in plain text. If you don’t really care, then it’s not that big of a deal, but if you are caching information to send back to your web server because the user doesn’t have any internet connectivity at the time, then it could be an issue.  Especially if that data contains information you don’t want tampered with like scores, ranking, etc… We’ll take a look at some encrypting functions we can throw into our code that will make encrypting/decrypting information pretty trivial. I’ve pulled in this code from various places so I can’t take credit for most of it. We’ll be using the Triple DES encryption capabilities that we have access to and once done, this should also make it safe to send via POST to a web server without mangling the data since the final data is encoded to BASE64. I’ll have another post detailing how I setup app-to-web server communications here in a bit. I created a file named Crypt.cs and made all the functions static so that we could call these functions anywhere in our code. We just have to pass in what we want to encrypt and the key we will be using. So from anywhere in the code we can call something like:

// Encrypt the data
string data = "Something to encrypt";
string key = "your_key";
string encryptedData = Crypt.Encrypt(data, key);

// Decrypt the data
data = Crypt.Decrypt(encryptedData, key);

Something that bothered me is having the key all in one place like that. So, you could just have it split up in various places in your app and create a function to put the key back together again and pass that in. So, here is the code I used (for the most part) to do this, just take it and put it in a .cs file.


using UnityEngine;
using System;
using System.Collections;
using System.Security.Cryptography;
using System.Text;

public class Crypt : MonoBehaviour {

/**
 */
 private static string GetMd5Hash(MD5 md5Hash, string input) {
 // Convert the input string to a byte array and compute the hash.
 byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));

 // Remove last 8 bytes to make it 192 bits (24 bytes) and compatible with the DES key property
 byte[] finalData = new byte[12];
 for (int i = 0; i < 12; i++) {
 finalData[i] = data[i];
 }

 // Create a new Stringbuilder to collect the bytes
 // and create a string.
 StringBuilder sBuilder = new StringBuilder();

 // Loop through each byte of the hashed data
 // and format each one as a hexadecimal string.
 for (int i = 0; i < finalData.Length; i++) {
 sBuilder.Append(finalData[i].ToString("x2"));
 }

 // Return the hexadecimal string.
 return (sBuilder.ToString());
 }

/**
 */
 public static string Encrypt(string data, string secret) {
 TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
 MD5 md5 = MD5.Create();

 string key = GetMd5Hash(md5, secret);
 byte[] finalKey = System.Text.Encoding.UTF8.GetBytes(key); 

 des.Mode = CipherMode.ECB;
 des.Key = finalKey;

 des.Padding = PaddingMode.PKCS7;
 ICryptoTransform DESEncrypt = des.CreateEncryptor();
 Byte[] Buffer = ASCIIEncoding.ASCII.GetBytes(data);

 return (Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)));
 } 

 /**
 */
 public static string Decrypt(string data, string secret) {
 TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
 MD5 md5 = MD5.Create();

 string key = GetMd5Hash(md5, secret);
 byte[] finalKey = System.Text.Encoding.UTF8.GetBytes(key); 

 des.Mode = CipherMode.ECB;
 des.Key = finalKey;

 des.Padding = PaddingMode.PKCS7;
 ICryptoTransform DESEncrypt = des.CreateDecryptor();
 Byte[] Buffer = Convert.FromBase64String(data.Replace(" ", "+"));

 return (Encoding.UTF8.GetString(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)));
 }

}

Wrapping up Jumble Attack

This app was a particularly fun little project to work on for me. We introduced three new technologies as the main goal of this project was to figure out how to use those three technologies while still making a fun little game we could distribute. There were a lot of assets we were able to reuse from Shape Sprout so it made that part of the project go much more quickly. For our previous app, Shape Sprout, we included ads into our game using AdBuddiz which was relatively painless. For Jumble Attack, we added in-app purchases, data encryption and app-to-web server communication. The in-app purchases I think took the most time as they had to work on three different platforms: Apple App Store, Google Play Store and the Amazon Appstore. Each platform has a different way of allowing you to test those purchases without generating a real monetary transaction. Amazon seems to have given us the most trouble as the 3rd party plug in we were using, SOOMLA, has some issues with Amazon on their most recent update. We just went back to a previous version and all was well in the world. SOOMLA is actually pretty straightforward when integrating with the Unity platform and I have really enjoyed it so far, you can’t complain much for an open source plugin like this.  The setup required to make the in-app transactions happen can become pretty confusing; pretty soon I’ll have three new blogs on how to setup a store in Unity for each of the platforms, how we did the encryption and what we did to make the app-to-web site communications happen…including the extra steps you have to take when you want app-to-web site communications when playing your game through the Unity Web Player.  All very interesting stuff. We are in the last stages of testing Jumble Attack and hope to have it in the app stores very soon. We already know what our next project is going to be, so if you like cards, we know you’ll like Kung Pow Cards!

Why doesn’t my particle system show in front of my sprites??

Particle System Sort LayerThis one had me befuddled for a little while. I could not figure out why my particle system was not showing up in front of my sprites for the life of me. I had the “Layer” set properly but I could not find a place to set the “Sorting Layer”. I came across some other folks who were saying you had to set the sorting layer manually in code so the particle system would show up where it needed to (sorry, I can’t remember the references!). Okay, that seems easy enough, let’s see if we can figure that out. It looks like we can do that via the following code. The “sortingLayerName” is just a string of a sorting layer you have defined in Unity and the “sortingOrder” is an integer that specifies the z-order in that sorting layer. The higher the number, the closer the object “looks” to you.


particleSystem.renderer.sortingLayerName = sortingLayerName;
particleSystem.renderer.sortingOrder = sortingOrder;

So now let’s just make this into a script so we can easily apply it to all particle systems we create.

I put the following code into a file named “ParticleSystemFix.cs” and attached it to any particle systems I create.

using UnityEngine;
using System.Collections;

public class ParticleSystemFix : MonoBehaviour {

public string sortingLayerName;
public int sortingOrder;

/**
 */
void Start() {
    particleSystem.renderer.sortingLayerName = sortingLayerName;
    particleSystem.renderer.sortingOrder = sortingOrder;
    enabled = false;
  }
}

I’ll usually tell a script to disable itself once it is done initializing or if the code in the Update() function starts to be skipped because of a certain condition. I’m sure there has to be a slight performance advantage to doing this…every little bit helps.  Plus it lets me know if something is executing properly when I expect the script to become disabled.

Particle System Sort LayerNow, just attach this script to any particle system; there in the inspector, you can define a “sortingLayerName” and “sortingOrder” on the “ParticleSystemFix”.  I used a large number like 999 as my “sortingOrder” since I want my particle systems to appear on top of all my sprites.

 

 

Particle System Sort LayerMake sure that what you pass into the “sortingLayerName” is defined in Unity!

That is about it, as long as the “sortingLayerName” for your particle system is where it needs to be hierarchically, your particle system should appear on top of the sprites.

 

 

 

 

Okay, I’ve got my game built for the Unity Web Player, now what?

Unity has some pretty cool stuff. It can build your app for a multitude of platforms to which they seem to be constantly adding to. One of the things you are able to do is build your game for the web using the Unity Web Player. When we first started, I was using LibGDX and by using it plus some other tools, I could export my project to WebGL. At that point in time, WebGL was not fully supported on all browser so our game did not have the compatibility that we wanted it to. Unity uses its own plugin and seems to be compatible with all major browsers. I’ve tried it on IE, Chrome, Firefox, Safari and Opera. It seems to work the same on all the browsers. Now, how exactly do we publish said game for others to access? We wanted a presence on Facebook with our games as well as on mobile platforms. Mobile being our primary target of course. I began to do some research into Facebook apps and how exactly they worked. So, I headed on over to https://developers.facebook.com to get started. I believe you have to register with them to become a developer…its been a while since I did that part.

fbCreateAppfbCreateApp2Once you are logged in, the first thing to do is to create a new application, just select “Apps” from the top menu and then “Create New App”. Fill out the info as needed to get the skeleton of your app created.

At this point, we don’t have much, just that we’ve told Facebook we want to create an app and this is what it is going to be called. The next part is we need to figure out how we are going to host our game for Facebook to reference. Facebook doesn’t actually host the game itself, that is up to us in how we do it. There are two ways you can do this. If you have your own web server, you can point Facebook to where the main file resides or if you don’t, you can use Dropbox (or probably any number of other online storage) to host your game. I’ll cover both methods here. First I’ll talk about Dropbox, you’ll need an account if you don’t already have one. Once you have it setup and ready to go, log into your Dropbox account online and create a “Public” folder. You don’t have to have this, but it helps me to keep stuff separated. Inside there create another directory for your game you want to host. Once that is done, move your .unity3d and the .html file into this directory. Right click on your .html file and select “Copy public link”.  This will give you a box with a link that looks something like:

dbLink

 

 

 

Copy this link to use in your Facebook app. Going back over to Facebook, we need to start filling things out. Select your app from the “Apps” menu at the top if you haven’t already and start with the “App Details” from the menu on the left.

fbAppDetailsThere is quite a bit of info here to fill out, but take your time and fill it out as detailed as possible. I usually use a lot of the same descriptions and info I use when I place our apps on iTunes, Google Play or Amazon.

 

 

 

 

 

fbSettingsAfter this, head on over to the “Settings”. This is where you connect your app to Facebook so it knows how to run it.

For the “App Domains” section, use “dl.dropboxusercontent.com”.

Now, click the “Add Platform” button at the bottom and chose “Facebook Canvas” from the selections presented. There are quite a few others here you can use as well.

When the properties for the Facebook Canvas appears, you have a “Canvas URL” and a “Secure Canvas URL”. Remember that link I said to save from Dropbox? Yup, we use it here…with one small addition. Make sure to put a “?” at the end of the URL you get from Dropbox. The Facebook Canvas expects the URL to be “dynamic”, so I guess this appeases what it wants. Use HTTP for the “Canvas URL” and HTTPS for the “Secure Canvas URL”. Click “Save Changes” at the bottom and you are pretty much done! Look at the “Canvas Page” property at the top of the “Facebook Canvas” window there to get the URL of your Facebook app. Copy and paste that into your web browser and you should now have an application on Facebook. This was the simplest way I could see for getting our app on Facebook.

Now, if you have your own web server, the process is very similar to that of Dropbox. Copy your game files to your web server and follow the general directions above and that is pretty much it. I renamed the .html file to “index.html” so I wouldn’t have to specify an .html file and I renamed the .unity3d to something a bit more web server friendly (be sure to change the reference in your .html file). You will need an HTTPS server, however, since the Facebook Canvas operates on HTTPS and the browser will warn you that the connection is not secure if you attempt to just use the HTTP link. The only other change is to be sure the “App Domain” at the top of the settings is your domain and not Dropbox.

If Facebook was our primary target, I’d probably spend a lot more time actually integrating Facebook functions into our game along with using “Open Graph” more. Maybe further down the road we will do this, but for now, this works.

What do you mean I have to be “properly authorized” to use encryption in my apps?

09-08-2014

This took me by surprise. I remember seeing something while submitting previous apps to iTunes asking if I used encryption in my app but I had not noticed it on Google Play or the Amazon App Store (which there is a checkbox for it, it just hadn’t registered with me since I wasn’t using encryption). I hadn’t needed any sort of encryption until now and that got me asking questions about WHY Apple would want to know this. After digging a bit, I discovered that you have to be “properly authorized” by the  Department of Commerce (DOC) Bureau of Industry and Security (BIS) to use encryption in your app. Personally, I think it just needs to be shortened to BS. It’s only my controlled data and it does not contain any personally identifiable information, so why does the government need to be involved? So, anything that uses technology like HTTPS, DES, AES, etc. falls into this category. However, one way hashes like an MD5 don’t appear to fall into this category because it isn’t meant to be decrypted…I need to get verification on that one. So began my journey of trying to figure out what kind of paperwork was needed to get this going so we could be legit and I could use encryption in my app. I had found some resources online but they were a few years old and a lot of the links were broken. I was seeing acronyms like “SNAP-R”, “ERN” and “CCATS” but had no idea what exactly they meant. So I hit Google with the few leads I had and discovered that I needed to start with the “SNAP-R” system. No idea what that acronym meant so I looked it up; it stands for the “Simplified Network Application Process – Redesign” system…yeah, that really cleared things up. So I started there to try and get registered.

https://snapr.bis.doc.gov/registration/Register.do

Filled out all the information on the page (which wasn’t that much) and submitted it. It then told me that instructions would be sent to the email I specified and I MUST follow them. About 5 minutes later, I got my email and it said they were processing my information and should have it done within 5 business days. Not too horribly bad so far. I still don’t know what “CCATS” is exactly, but it sounds like it’s a more in depth process of getting “properly authorized”. From what I’ve read so far, I should only need to get approved to get into this “SNAP-R” system so I can apply for an “ERN” (Encryption Registration Number) so then I can submit the “ERN” to Apple to prove that we are “properly authorized” by the DOC. My head hurts now, maybe by the time they approve our “SNAP-R” application, I’ll be ready to tackle the next step…whatever that is.

09-09-2014

Woke up this morning to see an email about our “SNAP-R” registration. They sent me an “Applicant ID” in the email and a link I could use to verify my “SNAP-R” user account. Once I clicked on that link, it said I was verified once I entered in some information (don’t forget your password here) and then it then directed me to the following link so I could log in.

https://snapr.bis.doc.gov/snapr/exp/UserLoginLoad

Looking at this page, it asks for a “Login ID”, a “Password” and a “CIN”. It appears that both the “Login ID” AND the “CIN” are the same as the “Applicant ID” you received in the email. I believe at one point there was an older system in which the “Login ID” and the “CIN” were two separating things, it doesn’t appear that way anymore. So once you enter that info and log in, you are able to create a “work item” in this system. So, what does access to this “SNAP-R” system and these “work items” give us? Here is a definition from the site:

An important note in SNAP-R is that the term Work Item is used to refer to any of the BIS work related transactions that can be submitted online. These include: 
  * Export License applications 
  * Re-Export License applications 
  * Commodity Classification requests 
  * Encryption Registrations 
  * Agriculture License Exception notices

It is that “Encryption Registrations” part we need to register for to get an “ERN”. So after clicking on the “Create Work Item” link from the left part of the screen, it asks what we want to create and to give it a reference number. Select “Encryption Registration” from the drop down box and for a reference number, it has to follow the format of AAA9999. Since we are trying to get an “ERN”, I chose to use ERN as the alpha part and a random number for the number part. Then click on create…to fill out more paperwork. Filling out the next page isn’t too bad either, but I did have to find and fill out a “Supplement No. 5 to Part 742“, so off to Google to find out what that was. Clicked on a link I found on www.bis.doc.gov, and was greeted with the following message.

Does this seem ironic?
Does this seem ironic?

So a copy of the document for encryption registration is on an HTTPS server that appears to be self-signed. That just seems rather odd.

 

 

 

 

 

After locating the section we needed, I began filling it out. Again, it wasn’t too bad but it took a little while to do. Now that this paperwork is done, we have to export it in .PDF format and attach it to our work item at the bottom of the form. After giving everything a once over again, I clicked the “Check for Errors” button and it didn’t seem to find any issues. Then I spent the next 30 minutes trying to figure out HOW to submit the form as it wasn’t very clear to me since there was nothing like a visible “Submit” button on the page. When all else fails, start clicking other buttons to see what happens. I discovered you have to click the “Verify Address in Work Item to Submit” button at the bottom of the page right beside the “Check for Errors” button first. Then click the “Preview Work Item to Submit” button on the next page, and finally the “Submit” button shows up at the bottom of the next page. Once you click that button, it asks you to acknowledge that you won’t be able to make any more changes to the document once submitted. Okay, done and done.  When I looked back at my list of work items, the status was already “Accepted” for that particular “work item”. Not sure exactly what that means, I guess I’ll just wait on correspondence on how to get my “ERN”.

10 Minutes Later

Well, that didn’t take too long, only 2 days. Received an email saying I had a message in the “SNAP-R” system waiting for me. So I go to my messages and in there it has my new “ERN”. The process as a whole wasn’t horribly painful, just frustrating in trying to figure out everything that you need while reading all the legalese as I’m not very fluent in that language. Hopefully this is all Apple will need to verify we are now “properly authorized” to export or reexport encryption products. Guess we’ll find out when we are done with our app!

Some final thoughts about “Shape Sprout”

“Shape Sprout” is now live on the Amazon Appstore, Google Play StoreApple App Store and on Facebook! We are constantly learning new things every time we work on an app and at the same time, we find more ideas for other apps!  Apple took a little longer to approve our app this go around than it did last time…10 days. Amazon was only a day or two and Google and Facebook were pretty much same day. All in all, I thought the development of this app went exceptionally smooth. Very few bumps in the road from the development side…I just have to get my artistic ability up to par. Practice, practice, practice! And of course having Kari record audio for our games is such a blast; she always makes me laugh. We’ve already started development on the next app; it’s called “Jumble Attack” and is based on the hot air balloon event that happens in “Shape Sprout”. We decided on a bit simpler app this go around because we are changing how we are doing a few things and wanted to focus on getting those ironed out while still making a fun game to play. We’ve decided to go the in-app store route to allow people to purchase an ad-free gaming experience instead of having two versions of our game.  This should make maintenance a whole lot easier. Also, there will be some communications between our app and our web server. This is something we’ll use in later apps and wanted to see if we could find a good way to do that. We decided on doing HTTPS + encrypted data…then realized we have to get an ERN from the government before we could legally make an app available that implemented encryption or even used HTTPS. This was a surprise to us. Curious how to get your ERN? I’ll be posting how I did that very soon. The whole process only took about 2 days which is saying something when the government is involved. Onward and upward!

Huh? I told you to explode over THERE

So no matter how awesome a tool is, it always has some bugs in it. Unity3D doesn’t escape this unfortunate reality. So far I haven’t come across anything that was so bad it made the tool unusable, just delayed development for a little bit while I searched for a solution. One of these bugs reared it’s ugly head during development of Shape Sprout while trying to create a small explosion for when Kari’s “shape bullets” hit Jumble’s target on his balloon. So, I created a particle system, set the parameters to make it look like a little explosion, turned off looping and then created a prefab out of it so I could instantiate it easily when needed in the game. So far so good, the collider was triggering the callback function on the target and I setup up the transform location of the newly created explosion at the point that the “shape bullet” hit the target. Something like this…

GameObject bulletHit = (GameObject) GameObject.Instantiate(bulletHitPrefab);
bulletHit.transform.parent = other.transform.parent;
bulletHit.transform.localPosition = other.transform.localPosition;
bulletHit.particleSystem.Play();
Diagnostic.Logit(other.transform.position);
Diagnostic.Logit(bulletHit.transform.position);

Every once in a while though, the explosion would happen at some random spot on the screen instead of where the “shape bullet” hit the target.

Particle System Positioning Oddity
Um…how’d the explosion get over there?

What in the world? I must have been doing SOMETHING wrong, but the same exact code was running each and every time. Timing maybe? Lets move some code around where things are created and destroyed.  Nothing. Still had the same problems.  Even made a log of the location of both where the explosion should happen and where the explosion supposedly was and they were exactly the same.  So why wasn’t it SHOWING it in the right spot? I started looking around a bit online and found something about the particle system needing to be disabled first before positioning it, then re-enable it.  AND make sure “Play on Awake” wasn’t enabled. Okay, so lets add a little bit into the code here…

GameObject bulletHit = (GameObject) GameObject.Instantiate(bulletHitPrefab);
bulletHit.SetActive(false);
bulletHit.transform.parent = other.transform.parent;
bulletHit.transform.localPosition = other.transform.localPosition;
bulletHit.SetActive(true);
bulletHit.particleSystem.Play();

And lets see what happens…

Particle System Positioning Fixed
That’s more like it

Maybe this is expected “behaviour”. (See what I did there?) Maybe I’m just doing it wrong? All in all I would not trade Unity3D for anything right now. Maybe this will help someone else dealing with this odd particle system positioning bug/issue. As of this writing, I am using Unity version 4.5.2f1.

Wrapping up Shape Sprout

And here is the REAL life “Kari the Shape Fairy” play testing her new game, Shape Sprout! She loves hearing her own voice in the game. We are getting close to wrapping it up, still squashing a few bugs and testing some settings. We hope to have it out soon for Android, iPhone/iPad, and Facebook. Shape Sprout is the second game we’ve developed so far and has been an absolute blast to work on. We have SO many other ideas lined up for games, just need more time…and caffeine!

Play testing Shape Sprout
Play testing Shape Sprout
Play testing Shape Sprout
Play testing Shape Sprout

 

 

 

 

 

 

 

 

 

I’ll never use Algebra or Trigonometry, why do I need to learn it in school?

Lucky for me I enjoyed math in school, so I never asked this question. Up to this point, Unity3D has handled all the reflective forces on a rigid body so I haven’t had to do any calculations like that…THANK GOODNESS. I might like math, but I’m not quite that crazy…yet. During development of Shape Sprout, I realized that I needed to shoot a “shape bullet” from the tip of her wand out to where the player touched the screen. “Oh, that’s easy…I’ll just use Lerp() or MoveTowards()!”, I thought excitedly. That works great…until the shape bullet stopped at the spot the player touched the screen and didn’t continue on like I wanted it to.  *FACEPALM*  Ya, I really should have known that was going to happen, lack of sleep maybe? Now how do I figure that one out? Hmm…I seem to remember something about slope and  y = mx+b in algebra. No, that was slope intercept form…I need just the slope. Thank goodness for Google, there isn’t anyway I can keep all this stuff in my head. So, its y2 – y1/x2 – x1. Easy enough, we know start x and y position (wand tip) and we know end x and y position (where the player touched the screen), we can get slope! Okay great, that works now and the “shape bullet” is following the path like we want it to! Now…how can I make Kari’s arm rotate in line of where the shape bullet is going?  Trigonometry to the rescue! I already extensively use COS in the movement of Jumble’s hot air balloon, I know there is something that would help. Google to the rescue again! ARCTAN…yup, looks like we just feed it the slope and it gives us back what we need. Or so I thought. Something isn’t quite right, her arm is rotating but it is moving at a different speed than what it should really be rotating. That is when I discovered the value you get from ARCTAN is in radians and not degrees *FACEPALM*, why didn’t I know that? Luckily we have a constant we can use called Mathf.Rad2Deg so I don’t have to figure it out. Now just offset the angle slightly since our arm sprite is at about a 45 degree angle and voilà, it works as intended! Only and Indie Dev would get excited about something like this. I’m pretty sure there is probably an easier way Unity lets you do all this and I just don’t know it yet.  But, don’t say you will never use Algebra or Trigonometry.

Are you more like a Hacker or a Scholar?

Maybe even a little bit of both? I’ve been writing code for some years now and dabbled in all sorts of languages, but my first experience with computers was when I guess I was about 8 or so. My parents came home with a shiny new Apple ][e and you can bet my brother and I were quite excited about the prospect of having a computer in the house. We had no clue how to work it, but it was cool nonetheless.  Sometime later, my brother just happened to be playing with some BASIC code that made text scroll like mad across that beautiful green monochrome monitor.  I still remember it to this day, funny the things that stick in your brain. Anyone remember something like this?

10 PRINT "HELLO WORLD!"
20 GOTO 10

To say the least, I was hooked after seeing that and the rest is history. From that point on, I’ve touched various other languages like Pascal, C/C++, VB, C#, Javascript, ASP, PHP, Java, HTML and Objective C. One thing I’ve noticed is the way you lay out your design and code is pretty much the same no matter what language you use, it’s just all syntax, semantics and features of the languages. I personally think the best developers don’t have a language they ALWAYS go to, they figure out what needs to be done and then pick the best language for the job.  If there happens to be more than one language that will work, then pick the one you want to work with! So what do I mean by Hacker vs Scholar? I really don’t think they are mutually exclusive, you need a bit of both to be a great developer. Hackers get an idea and before they put pen to paper, they are putting their fingers to the keyboard. I call them Cowboys. Code now, ask questions later. “Wait, that sounds bad, I thought you said you need to be a bit of a Hacker to be a good developer?”. Ya, I’m getting to that part. Scholars are very meticulous in the design of their game/program/app.  They spend many hours figuring out the best way to tackle what they want to do by creating design documents, flow charts, case scenarios, etc  to see how every little piece works. Once they have that all worked out, THEN they begin to code. “Okay, now that sounds like the way to go…why would you even want to be a Hacker?”. A full 100% Scholar sounds great in practice, but in reality things rarely go as you plan them to no matter how much time you put into it. Hackers are flexible and can make changes on the fly when needed, this is something Hackers excel at over a full 100% Scholar. Personally, I’m a 75% Scholar / 25% Hacker. The Scholar part of me takes time at the beginning of a project to work out the details as best as possible. During development, if there are any bumps that I didn’t foresee in the design, the Hacker part of me takes over. It allows me to be flexible enough to adapt while the Scholar keeps the Hacker in check so not to deviate too far from the original design or try to put something into the project that just doesn’t fit with the designed architecture. How do you see yourself?