Mind Map Software – a Great Tool for Brainstorming

Are you struggling to be creative? Looking for ways to organize your brainstorming sessions? Or maybe you’re just bored? I have found a good solution for when I am stuck in one of these situations. I look to Mind Map Software for help.

What is Mind-Mapping Software? It is software that helps you to keep track of related thoughts on a bubble-laden canvas. It produces a similar drawing to what you would have put on the chalkboard in 5th grade. Remember that? When no idea was a bad idea?

 

The nice thing about good Mind Mapping-Software is that it speeds up the rate at which we can record information while brainstorming. I type faster than I write so if I can brainstorm digitally, then I am less likely to forget a key idea I had before recording it. Additionally, soft-copies are more easily stored (than 50 white-boards) and can be updated later.

I have used a few of these applications and have definitely found them useful but I would like to do it more. I am just looking for the perfect option at a good price. Below are a couple neat options:

Installed Applications

Mind Manager – I understand this to be one of the leaders in the market, and at $349 it better be robust. I downloaded a trial and was impressed with the software. It had many templates for creating different types of documents, like organization charts and process flow charts. It was also very easy to add new nodes (spacebar) and new child nodes (insert), which is my most important feature.

Using Mind Manager reminded me that these Mind Mapping Software applications are also great for capturing flow charts. During times when you are trying to explain how a process works or how different things interact, fire up the software and draft a quick mind map diagram. Sure, you could use Microsoft Visio to do it but since you’re getting familiar with your Mind Mapping tool you might as well use that.

FreeMind – This is the other leader. It is open-source and free. The interface for this application is not nearly as beautiful as that of Mind Manager, but for technically-savvy folks like us, it is just what we need. FreeMind also suggests some other interesting uses for their product here, such as for a task list or meeting notes. I would choose FreeMind if I were going to install a windows application, but that’s not what I really want…

iPhone Applications

It would be extremely helpful to be able to record brainstorming sessions on my mobile platform (iPhone). Usually, when I am sitting in front of my computer, my head is buried in my work, writing code, blog posts, or email messages. I struggle to take a step back and reflect while sitting at my desk, because I tend to act on the first idea I have with my computer so close and accessible. The best broad thoughts I have seem to arise when I am not distracted by my computer: waiting to board a plane, riding a bus, or running on a treadmill. I’d like to capture those thoughts as seamlessly as possible.

iBlueSky – I am still searching for the perfect iPhone Mind Mapping application and this is not it. It is $9.99, seems limited, and only has a 3.5 star rating in the App Store. It is amongst the leaders of iPhone Mind Mapping applications but I think I will pass on it.

iThoughts – I am definitely going to give this a try. It is $7.99 and looks very intuitive. It has a 4 star rating in the App Store. I am excited to use this with my Bluetooth iPhone keyboard.

Google Wonder Wheel

Google Wonder Wheel is in a class of its own. It’s useful and yet many people do not even know it exists. To use, search for a topic in Google around which you are trying to brainstorm. How about “Mind Map iPhone Applications?” The lowest option on the left menu should be “More search tools.” Click that. Then click “Wonder wheel.”

I could not describe this tool any better than GoogleWonderWheel.com:

“Did you say mind mapper? This tool is a built in mind mapper with the intention to sort out search results in a logical way of relevancy creating a visual wheel of terms that can make your searching enjoyable and time effective at the same time.”

Clicking around the wonder wheel reveals related topics to what was originally searched for. It’s how I generated the chalkboard image above. I recommend playing around with it as you never know what it might help you to find.

Advertisements

Surprising Costs of Windows Azure Hosted Services

This summer I had a few days to twiddle my thumbs between quitting my job and starting with my new employer, Unstoppable Software. Creative ideas ran wild inside my head, the time off made me feel like I had an infinite amount of time to make them tangible. I whipped up a few websites and wondered where I could cheaply host them since they were built in ASP.NET MVC. Naturally, the first thing that came to mind was to store them in Windows Azure. After all, my BizSpark benefits included a reasonable amount of free service and I wanted to learn more about how the hosting service worked.

At first, this turned out to be a great idea. I was able to quickly get my site up and running in a Production environment on Windows Azure with a custom domain. Best of all, hosting was free!

Getting a working site in Production ended up being my biggest mistake.

I soon realized that I wanted a second hosting environment so that I could test development changes without affecting the working application in Production. Windows Azure’s easy to use deployment interface suggested the creation of a Staging Environment.

Azure Deployment Interface

 

The Staging site worked great. It allowed me to test with a different URL until I was satisfied with the results, then pushing my code to Production. Unfortunately, deploying to a second environment doubled the rate of consumption of a key cost metric, Compute Hours!

A Compute Hour is an hour of application use multiplied by the number of server instances. This is calculated regardless of the state of deployment (Suspended versus Active) and the environment (Production versus Staging). I was very surprised to discover this when I found a charge (below) for Microsoft Online on my credit card statement. Apparently, other developers found out the hard way as well.

Azure Deployment Cost

 

I expected the Compute Hours to be accumulated only by my Production environment. I certainly did not expect my billed rate to increase simply by following the best practice of using a Staging environment to test my application, especially if it was suspended when I was not testing. Additionally, I had incorrectly assumed that Compute Hours were only calculated when my web application was processing requests (of which I was not receiving many). I had not really thought about the cost since hosting was free at first. My recommendation to Microsoft is to make it more obvious to developers that the cost doubles when using an additional environment. I would also like to see a long-term Azure strategy for hosting low-traffic sites. Luckily, I found out about the increase in cost without running up a huge bill.

Implications of Windows Azure Container Types

In 7 Reasons I Used Windows Azure for Media Storage, I described the download process involved in streaming a large video through a Silverlight applet using the Microsoft cloud offering. My scenario involved the use of public containers to store large files (blobs) for a web application. Public containers are convenient because they can be accessed via a simple GET request. Unfortunately, being that simple begets some negative behavior. By being accessible via a simple URL, any user on the web can link to that file and/or download a copy for personal use.

If you are already using public containers, do not be alarmed as if your storage is entirely exposed. I tested my site by typing a URL in which I removed the file name and the result indicated that the URL could not be found. I immediately breathed a sigh of relief. In other words, even public containers do not act the same way that IIS would if the Directory Browsing setting were enabled.

Example URL: http://{ApplicationName}.blob.core.windows.net/{Container}/

Still, for cases in which public containers are not satisfactory due to their openness, the alternative is to use private containers.

Private containers are similar to public containers and remain fairly simple to use. They require the inclusion of a unique key during the GET request for stored files. This is extremely easy using the Azure SDK sample, which abstracts away the details of what must be included in the request.

Effectively, the container type determines where the request for Azure blobs come from. For public containers, the request comes from the client, because a simple URL fetches the file. In contrast, the request for private containers must come from the server. The server-side code embeds the key in the GET request, receives the blob, and processes it or delivers it to the client accordingly.

The obvious benefit to private containers being accessible only to the server-side code is that security logic can occur in it, thereby restricting who can access blobs to specific users based on rules. It also makes it much more difficult, but still possible, to download files stored in private containers for personal use. The drawback to this solution is that streaming now passes through the server, greatly increasing the bandwidth consumed by the application.

As described above, there are cases to be made for the use of both public and private containers. The best solution comes from weighing security requirements against bandwidth and development costs. Of course, there are ways to reap the benefits of both paradigms, but the above restrictions cover the “out of the box” web application scenario.

 

5 Things I Hate about my Favorite Programming Language: C#

In episode 73 of the StackOverflow podcast , Jeff Atwood mentions one of his favorite questions to ask developers, “What are 5 things that you hate about your favorite programming language?”

It got me thinking. I definitely like some of the language features of C#, especially when developing within Visual Studio. Some of my favorites are Generics, Intellisense, and Short-Circuited conditionals. However, there are other pains that I encounter repeatedly when it comes to language syntax.

 

  1. In C#, there is the nifty syntax of following a variable with “??” allowing the developer to specify a replacement value in the case of the variable being null. In theory this is a great feature. However, I never end up getting to use this and I imagine that is the case for most developers. I find I usually end up using the “?” and “:” syntax because I typically want to use a member of the null object like “user.Identity.ToString()” but I have to check if “user” is null or I will get an object reference error.
  2. Why do I always have to lookup how to format a DateTime object in code without the minutes?
  3. If “ToString()” is a member of every object, why should I have to explicitly call it when setting the value of a string variable from another non-string variable? As an example, why can’t a string value be inferred from my int variable by just calling “ToString()” when there would otherwise be a type issue?


    int i = 0;

    string j = String.Empty;

    j = i;

  4. The compiler considers the use of “=” valid within an if condition. This can be confusing and often causes accidental issues where “==” is the intended code. As a solution, I use a coding standard of typing the constant value to be compared first because it cannot be assigned to (i.e. “if (0 == count)”).
  5. Nullable types seem like a great idea but they are not always intuitive. In the example below, the code seems like it should work. However, I receive a compiler error on the second line.


    int? i = null;

    i = (sender != null) ? sender.GetHashCode() : null;

 

Most of the above complaints were compiled off the top of my head. If you have found a better way to leverage the C# language so that you do not run into these issues, please share them with me in the comments. Perhaps it is my mis-use of the language features that has caused my agony.

7 Reasons I Used Windows Azure for Media Storage

Windows Azure is one service that Microsoft offers as part of its Cloud Computing platform. Earlier this year, I began leveraging a small piece of the entire platform on my side projects for what is considered “Blob Storage.” Essentially, I am just storing large media files on Microsoft’s servers. Below I outline why I chose this option over storing the large files on my traditional web host.

 

General Reasons for Cloud Storage

  1. Stored Files Are Backed up

  2. Workload Scalability if traffic increases

  3. Cost scalability if traffic increases

 

Benefits of Microsoft’s Windows Azure

  • Easy to Learn for .NET Developers

I am a pretty heavy Microsoft developer so I more easily learned: how to use it, what the resources for learning it were, etc.

  • Azure Cheaper than Competitors

Thirsty Developer: Azure was cheaper than competitors

  • Azure Discounts with Microsoft BizSpark program

Azure is heavily discounted for BizSpark program members (Microsoft’s Startup program that gives free software for a 3 year time frame). BizSpark members get a big discount for 16 months, and a continued benefit for having an MSDN membership for as long as it is current (presumably a minimum of 3 years).

  • Ease of use

Retrieving and creating stored files is extremely easy for public containers. One can just get the blob from a REST URI.

 

How this applied to me

Traditional hosting had a very low threshold for data storage (1GB) above which it was very expensive to add on more storage. The same was true for Bandwidth but the threshold was higher (80GB). Instead, with Azure, the cost is directly proportional to each bit stored and/or delivered, so it is much easier to calculate cost and it will be cheaper once I get over those thresholds.

Using Azure for Storage produces the following Download Process

1. When a user requests a video file, he/she receives the web content and the Silverlight applet from my website.

2. Embedded in the web content is a link to a public video from Windows Azure storage.

3. Silverlight uses the link to stream the video content.

 

The link that my Silverlight applet uses to retrieve the file is a simple HTTP URI, which Silverlight streams to the client as it receives it. This is nice behavior; especially considering the file is downloaded directly to the client browser and does not incur additional bandwidth costs (from my traditional webhost) for every download.

 

What this means in terms of cost

There are several cost-increasing metrics as I scale my use of Windows Azure (see pricing below). Fortunately, Azure is much cheaper than my traditional web site hosting provider.

Under my current plan, costing roughly $10 per month, my hosting provider allows us to use:

80 GB of Bandwidth per Month

1 GB of storage space

For each additional 5GB of bandwidth used per month, a $5 fee is charged

For each additional 500MB of storage on the server above 1GB, the additional fee would be $5.

 

Fees for Windows Azure uploads & downloads can be easily predicted using the metrics below.

Azure Pricing (Effective 02/01/2010)

Compute = $0.12 / hour (Not applicable to this example)

Storage = $0.15 / GB stored / month

Storage transactions = $0.01 / 10K

Data transfers = $0.10 in / $0.15 out / GB

 

An Example

Let’s say that I average 80 GB of Bandwidth Usage per month on a traditional hosting provider. Because I would be using the full allotment from my provider, that would be the cheapest scenario per GB. Let’s assume that half of my $10 payment per month accounts for Bandwidth and the other half accounts for storage. In that case, my cost for Bandwidth Usage would be $5 / 80 GB, or $.06 / GB.

That may seem cheap, but remember that this price is capped at 80 GB per month. If my website sees tremendous growth, to say 500 GB per month then I would be in real trouble. For that additional 420 GB, I would have to pay a total of $420 per month. My total monthly bill attributed to Bandwidth Usage of 500 GB would be $425, or $.85 / GB.

In contrast, the Azure storage model is simple and linear. For the low traffic case of downloading 80GB per month, it would actually be more expensive. However, as Bandwidth Usage grows, the rates do not go through the roof. Case in point, my total monthly bill attributed to Bandwidth Usage of 500 GB would be $75 (assuming all outgoing traffic).

I could walk through a similar example for the cost of storage but I think you see the point. In fact, it would likely be even worse. Since my website collects videos, it would be more likely that the amount of storage used would grow faster than the Bandwidth used.

As you can see, Azure storage and bandwidth is much cheaper, especially after scaling over the initial allotment.

Note: Storage transactions are a negligible contributor to cost in comparison.

Why are there no programming books at the bookstore?

This post was written over a year ago based on frustrations of not finding good .NET materials at the bookstore. It is being published as a bonus post now after finally completing it.

A little about me:

– I live in the Midwest
– I like to program at bookstores
– My favorite band is Huey Lewis & the News

I like programming at bookstores. Armed with a laptop and earplugs, I find myself at my most creative and in flow when I am around interesting resources. Browsing a few technical or business books, my mind quickly reaches hyper-active problem solving mode. To play off the ancient proverb, when I find my hammer through reading, I immediately notice all the nails I have to pound.

In the Cincinnati area, Barnes & Noble and Borders are the most predominant bookstores with Joseph Beth coming in a distant 3rd. Bookstores are nice because they are open relatively late (compared to libraries), have coffee bars with Internet, and have seemingly infinite resources on a variety of topics (as compared to Starbucks). At least, they “had” a variety of resources. It seems over the last couple years these large scale bookstores have been phasing out the acquisition of new tech books. It used to be that I could go to the bookstore and utilize the books to do legitimate technical research. Now, it seems that only the heavily mainstream books are on the shelves.

In late 2008, when I should have been seeing books about the Entity Framework or Sync Framework soon after they came out, I did not find anything except on Amazon. The lack of books on new .NET frameworks continued when ASP.NET MVC came out and no physical copies could be found. My strategy used to be to check Amazon to see when new books were about to be released and then to travel to Borders on that day to perform the research I needed. Or sometimes I would browse the books at the store to determine if any were worthy of buying. For those that were, I then bought them on Amazon because they were much cheaper.

Unfortunately, the trend has continued. I am hard pressed to find any interesting books (or those that I have not read already) in the “Computers – Programming” category. And this used to be the key differentiator to me from the coffee shops on every street corner.

I realize that I may not be the ideal customer in the eyes of the bookstore. I have learned not to buy any books from them and commonly use the free Internet provided. However, I at least make a conscious effort to purchase an overpriced beverage every time I abuse the store’s resources.

With the above changes comes my growing disappointment. I miss having a central place to do research, skim random books, surf the Internet, energize myself with caffeine, and watch people. I don’t believe I can get that just from the Internet at home or a coffee shop. Additionally, I prefer to learn through reading books versus through the Internet, mainly because they tend to cover a wider spectrum of knowledge. Usually, a book goes through the basics to the intermediate and then the advanced. Books tend to contain straight-forward walkthroughs, executive summaries, and theoretical concepts. In contrast, the Internet tends to have very specific blog entries that solve a particular problem. When researching this way, I am forced to “jump right in” instead of following a complete tutorial targeting varying experience levels. It can be difficult to find high-level descriptions about a technology and why it is useful.

Is it useful to complain about a problem for which I am not offering a solution? I don’t know. I assume the bookstores are not making very much money by filling their inventory with programming books. Or perhaps authors are no longer producing content in the form of physical page turners. I just hope they know that the technology and programming books were a small part of the overall experience which caused me to buy their coffee. I guess attracting my “type” wasn’t worth it for them.

Perhaps when I win the lottery, I’ll unleash my solution to the dying bookstore industry. More on this in a later post…

I Heart Karnaugh Maps

Have you ever found yourself writing a long Boolean condition in your code like the line below?


if ((policy.Type == PolicyType.AutoInsurance && policy.PolicyHolder.PriorAccidents == 0) || (policyPaidInFull && policy.Type == PolicyType.AutoInsurance || policy.IsPremium) || (policy.Type == PolicyType.AutoInsurance && policy.PolicyHolder.PriorAccidents == 0 && policy.IsPremium))

 

I Heart Karnaugh MapsPerhaps that line of code above is the first and easiest way you thought about all the conditions that have to occur in your application’s business logic. You write that line of code, test it in many different scenarios and it works so you think you have done a good job. Well, there are ways to improve upon that line of code by removing logically equivalent Boolean expressions, not to mention some style improvements that might make it more understandable.

We owe gratitude to our dear friends the Electrical Engineers for developing a clever tool, named Karnaugh Maps, to help with this dilemma, usually for cases of no more than 6 variable conditions. Karnaugh Maps (pronounced “car-no” and often simply called “K-Maps”) are a system for reducing Boolean expressions into a more simplistic form. They originated from the need to reduce electrical wiring gates, or circuit minimization, but they are still useful for the high-level software developer.

 

Benefits of reduced Boolean expressions

  1. Increased program performance
  2. Increased readability of code
  3. Less code results in easier to change code

Reducing our example expression

The 1st step is to let letters represent each of the conditions in our expression. In our case:

  • a :     policy.Type == PolicyType.AutoInsurance
  • b :     policyPaidInFull
  • c :     policy.PolicyHolder.PriorAccidents == 0
  • d :     policy.IsPremium

Then, draw a graphical square like the one pictured below. This represents each possible combination of our Boolean conditions. The boxes are blank because we have not yet entered what Boolean results we want in our resultant expression.

Blank Karnaugh Map

Let’s take the first, simplified condition in parentheses, if (a && c), and put it into the map. The result would look like the below image, because we only need to fill in the boxes where a and c are both 1.

Sample Karnaugh Map

Following this example, we can use the entire Boolean expression to fill out the whole map. The completed Karnaugh Map is pictured below.

Completed Karnaugh Map

Now circle any square or straight line of boxes since they correspond to an expression that differs by only two bits.

Circled Karnaugh Map

Because of the way we have arranged our variables around the outside of the map, we can eliminate variables based on boxes filled with 1s being adjacent to each other. In our example, the vertical “circle” exhibits a scenario where the expression should always be true as long as both the a bit and the b bit are 1, hence the condition ( a && b ). Likewise, the square “circle” exhibits true cases whenever the c bit is 1 and the a bit is 1. Because the b bit and d bit are true no matter if their values are 0 or 1, they can be deleted from the resulting simplified expression, which would be || ( a && c ). We use a similar rule to find the final d condition.

In one sentence, this rule can be summarized as “the circled boxes can be grouped together and the two variables that differ can be discarded.”

The resulting Boolean expression is:

if ( ( a && b ) || ( d ) || ( a && c ) )

which, using Boolean algebra, can be further reduced to:

if ( ( a && ( b || c ) ) || ( d ) )

We were not able to completely remove any variables, but we did simplify the expression quite a bit. The original Boolean conditions can be substituted for our letter variables, and we can rewrite the original expression as below:


bool policyIsAuto = ( PolicyType.AutoInsurance == policy.Type );
bool zeroPriorAccidents = ( 0 == policy.PolicyHolder.PriorAccidents );
if ( policyIsAuto && ( policyPaidInFull || zeroPriorAccidents ) || policy.IsPremium )

Seems easy, right? It is. And I am sorry if my steps went too fast for you. My intention is not to teach how to use Karnaugh Maps for all circumstances but instead to show you how easy and useful it is to simplify your Boolean logic.

For help with different scenarios, find the book Bebop to the Boolean Boogie – an Unconventional Guide to Electronics at your local library, check out this Wikipedia link, or you can even download software to perform the rules for you.

Happy Karnaugh Mapping!

In the mean time, I hope I was able to show you how fun and easy using a system like this can be. Feel free to post questions in the comments.

 

– Karnaugh Map Images taken from Bebop to the Boolean Boogie – an Unconventional Guide to Electronics

– Digital Logic image created by Garrett Crawford