Monday, January 14, 2013

Bootstrapping with ASP.NET SignalR

This is a follow up post for ASP.NET SignalR. In my previous post I introduced you to the library and what it is all about. On this one though, I want to quickly take you on a hands-on, step-by-step guide so you can quickly setup your environment and see the power of SignalR working in just a few minutes.

Lets start by creating a new web project in Visual Studio that can take advantage of the SignalR library.

/1. Open VS2012 and create a new empty web project.


/2. Open the NuGet Package Manager (right click on the project references and select “Manage NuGet Packages”).


/3. Search for “Microsoft.AspNet.SignalR” in the online packages area. Make sure you are including pre releases in the search results. Once you find it, just click the “install” button. It will list the packages to be installed, and it will also ask you to accept the license agreement.


Alternatively, you could open the Package Manager Console and type in the following command to install the package:
Install-Package Microsoft.AspNet.SignalR -Pre”



Either method will install the SignalR package and all required dependencies. The package references and scripts will be included in the project.


And you are done. That’s it. Your web app is ready to take full advantage of the SignalR library to provide real-time functionality!

Now, I know what you are thinking! - “Now what?”, right? Don’t worry. Now that you know how simple it is to add the library to your project, lets actually run a sample app so we can see it working.

Running the Stock Ticker Sample App

SignalR provides a good sample application to get started. The app is a web stock ticker that updates in real time. It uses the library and demonstrates how straight forward, fast and robust can this simple library be.

/1. Start by opening Visual Studio 2012 and creating a new ASP.NET empty web application, like we did previously.

/2. Now we need to install the SignalR library package using NuGet, except that this time we will install the sample app package. You can do so by looking for the “Microsoft.AspNet.SignalR.Sample” on the NuGet window, or by executing the following command in the Package Manager Console:
Install-Package Microsoft.AspNet.SignalR.Sample -pre

/3. After installing the package you will notice that apart from the .NET assembly references, and the scripts added, there is a new folder called “SignalR.Sample”, which contains all the sample files required, including the JavaScript files, the C# classes and the HTML and CSS files.


Compile the project and make sure everything is in order. Then, find the StockTicker.html page in the SignalR.Sample project. Right click on it and select “View in Browser”. This will run the project, and will open the browser on that specific page you selected.


Now, lets test it for real. Open several browser windows, ideally using different browsers. Copy the URL on all of them, and arrange them so you can see all of the running. Once you have all windows ready, click on the “Open Market” on any of them to start triggering real-time updates.


Notice how all the windows, no matter what browser they are, will get the updates in real-time. No delay, no lag between them. All clients are getting the updates pushed by the server. Isn’t that really cool?


So, now that you can get a sample app installed, compiled and running, and also know how to bootstrap your own web app with SignalR, is time to go a little further and check out some really helpful links.

Just in case, here is the link to the NuGet package install.

Here is the next step. A tutorial on how to implement a simple chat web application with SignalR that uses the Hubs API to echo and broadcast messages among the connected clients, which do remember the name of the person connected.

So that’s a wrap! Keep playing around with SignalR and stay tuned. I’ll be publishing more samples and prototypes using SignalR soon.

Getting Started with ASP.NET SignalR


If you haven’t heard about ASP.NET SignalR, I must tell you, you should. SignalR is now an official Microsoft product, part of the ASP.NET family, and even better, is an open source library (source code in GIT, released under the Apache 2.0 License), which is, well, mega useful for real-time web applications.

I heard about SignalR early versions last year from a couple of colleagues. However, it was until I attended BUILD 2012 last year, that this bad boy positioned itself as a must-know library for web developers. Greg Glass, a veteran in programming, currently holding the title Chief Scientist at R/GA asked me to dig into the topic and put together a presentation for our global tech team.

This post contains the outcome of my research and experience playing around with SignalR, and hopefully it will help you to get started and push the boundaries of real-time web apps on your own.

I have based most of this post in the original BUILD 2012 presentation, the official web site, documentation and source code, and quite a few prototypes that I have been working on myself, replicating and extending what the creators have made available to the community. So, with that being said, lets jump right into it!


What is SignalR?

SignalR is a new library for adding real-time web functionality to web applications. It provides a simple ASP.NET API for creating server-to-client remote procedure calls (RPC) that call JavaScript functions in client browsers from server-side .NET code.

So, what is real-time web functionality?

It is the ability to have server-side code push content to connected clients instantly as it becomes available (rather than request-response pattern or long pulling).

How does it work? (in pseudo-code)

if WebSockets then Cool,
if !WebSockets then Server Sent Events,
if !Server Sent Events then Forever Frame,
if !Forever Frame then Long Polling

What’s the story?

It started as a side project from two Microsoft developers, Damian Edwards and David Fowler, who started to build the library on their spare time, and 18 months after, it became a full ASP.NET open source product.

Got it? Lets make sure!

SignalR is a real-time, persistent connection abstraction over HTTP for .NET.

Possible Applications?

Dashboards and Monitoring, Collaborative Anything, User activity feedback, Job Progress, Chat, Gaming, Real-time multiscreen synchronization

What do you get?

Connections API (low-level), which provides you with connect, reconnect and disconnect semantics; ability to broadcast to all clients, groups and individuals; raw data access.

Hubs API (high-level), which is built on top of the Connections API; provides you with remote procedure calls (RPCs) from client-to-server AND server-to-client; provides automatic client proxy generation.

Don’t forget!

SignalR is asynchronous, from the server, all the way to the client!

How does it compare to WebSockets?

Well, WebSockets are great, but in practice, they only work if:

  • Server (OS) and client (Browser) support it
  • Infrastructure and Network are compatible and don’t get in the way
  • Load balancer/reverse proxy supports it
  • Client proxy supports it
  • If you are happy programing Raw sockets
  • If you can scale-out yourself (synchronization between nodes and connected clients)

What about SignalR’s reach?

  • Works everywhere
  • Cross browser
  • Cross platform (early stages)
  • Simple and Powerful API
  • Does everything possible to maintain logical connections up
  • Scale-out to web farms by the library

What are the current clients supporting SignalR?

  • JavaScript (JQuery)
  • .NET 4.0/4.5
  • Silverlight 5
  • Windows Store Apps
  • iOS (community maintained)
  • MonoTouch (community maintained)

Future clients in the works?

  • Windows Phone8
  • MonoTouch (official)
  • MonoDroid (official)
  • iOS (official)
  • .NET Micro Framework
  • Java


Cross-browser: IE / Chrome / Safari / FireFox
Cross-Platform: Windows / iOS (Mono) / Linux (Mono)

What is in the latest version?

  • Complete rewrite of the internals
  • Hub Authorization
  • Hub Pipeline Modules (like action filters) – model binding, traces, etc.
  • Client-side keep alive

What about performance? Give me some numbers!

  • Single Box (100K messages per second)
  • Very low memory overhead
  • Azure (100K to 500K messages per depending on the data load)
  • 100k – 460k concurrent connections on a single box

Can it be optimized?

Out of the box, it will work right away with the standard configuration for around 80% of the cases. However, SignalR is greatly configurable, providing ways to optimize the library for specific use cases and/or specific applications.

Does it scale?

SignalR offers something called the “bus backplane”, which is basically an abstraction to scale real-time web apps using the library across web farms. Basically, it provides a few approaches to sync the different nodes running on a web farm.

SignalR supports three Bus Backplane alternatives:

  • Windows Azure and Windows 2012 Service Bus
  • Redis
  • MS SQL Server

Load Testing?

SignalR offers a Load Test Harness tool that can be compiled, deployed and used on any environment to load test web apps using the library.



ASP.NET SignalR is, without a doubt, the simplest and most robust way to add real-time functionality for .NET web applications. It offers both low-level and high-level APIs, providing a lot of flexibility and customization options. Although is part of the official Microsoft’s ASP.NET family, is a community driven library, which makes it the best of both worlds. It works everywhere, offering graceful degradation to the lowest common denominator supported both by server and client, without you having to worry about it. And on top of all that, you can run it on Apple and Linux environments with Mono.

I’ll be publishing step-by-step articles to help you ramp up and also share any good tutorials and sample apps out there. Feel free to leave your comments and share useful information and experiences.

Saturday, January 12, 2013

WinRT Tip: The Power User Menu

I want to share an amazing Windows Power User tip that will help anyone doing advance stuff on a WinRT machine. This includes Windows 8 Pro and Windows RT.

The tip was shared on Twitter by James Senior (you can also check his blog here), and although I avoid duplicating information on my blog, the tip is far to useful to leave it in Twitter.

So, on your WinRT machine, press the “Windows” key plus the “X” key. You will get a flat menu on the lower left corner with links to all the useful menus and settings on your computer.


You can get instant access to most Windows admin tools and admin functionality from here. I tested it on my Surface RT tablet, and it also works like a charm. So, remember, “Windows + X” and get on with it!

Thanks James for an amazingly useful tip. I just had to write this down on my blog for sharing and future reference!

Where is the Battery Indicator in Windows RT and Windows 8?

I have read quite a few posts talking about the experience with a Surface RT tablet. In general, the reception has been quite good, and people have said to be quite happy with the whole “play + work” concept.

One thing that I remember reading was about people not finding a quick access to the battery indicator on a Surface RT tablet. Well, it turns out that is right there, easy access and available at all times. This applies for any Windows RT and Windows 8 machine.

To see how much battery left you have, you just need to bring up the charms bar. On a touch-enabled device, you achieve this just by swiping your finger from right border into the screen. Alternatively, and on any non-touch screen, you can just press the “Windows” and “C” keys at the same time, or move your mouse pointer to the upper or lower corner of your screen, and then mouse over the charms bar to activate it.

Screenshot (20)


Windows Screenshots: The New Way

Just wanted to share a quick tip for taking screenshots in the new generation of Windows 8 devices.


As many of you already know, you can now take screenshots in Windows Phone 8 devices. Just press and hold the “power” button and then tap on the “Windows” button on the front of the device. The screen will flicker quickly and you will hear the sound of the screenshot being taken. Screenshots will be saved in a photo album called screenshots in you phone.


Now, you can also use hardware buttons to take screenshots in your Windows RT devices, like the Surface tablet. Just press and hold the “Windows” button in the front of the device, and then, press the “Volume Down” button (which is generally on the side of the device). As in the Windows Phone 8 devices, the screenshots will be stored in your Pictures library, in a folder named “screenshots”.

Screenshot (19)

Even better, taking screenshots on a Windows 8 machine got also a lot easier. Now you can just press and hold the “Windows” key, and then press the “Print Screen” key. You will see the screen flicker quickly indicating that the screenshot  was taken, and as in other devices, it will store the screenshots in the “screenshots” folder, in your Pictures library.

Clearly, when taking about user experience, small details make a difference. Hope it helps!

How to Reset your Nokia Lumia 920

Yesterday I ran into a really annoying issue with my Nokia Lumia 920. It left my phone stuck in the boot screen with the NOKIA logo being displayed, in a completely unresponsive state.


This happened when the phone was downloading an update for an application I had installed (Transfer My Data). Moments later, I noticed that my phone became unresponsive. The lock screen was on, and I could not get the device to respond. No touch, no unlock, nothing!

Not knowing what else to do, I just restarted the phone by holding the “power” button. The phone restarted without displaying the common “slide down to power off” message. Then, to my surprise, the phone got stuck in the boot screen where the NOKIA logo is displayed. I waited, waited, and waited some more, and no luck. The phone continued to display the NOKIA logo and nothing more. I was quite mad, and on the verge to smash my phone against the wall. However, I was patient. Took a deep breath and left it there for a few hours.

As you suspect, after a couple of hours, the phone was displaying the same screen. I knew I had to find a way to restart the phone and see if that could fix it. Fortunately, I manage to do a soft reset, and restart the phone, and that did the trick.

To soft reset, or restart your phone, when the traditional “hold power button” doesn’t work, is to press and hold the “volume down” button, and at the same time, press and hold the “power” button.

Hopefully the phone will restart, you will fill the phone quickly vibrating, and then you should get the phone to perform the normal power sequence: NOKIA Logo Screen, then Windows Phone screen, and then your lock screen. Voila, I was able to continue to use my phone without any more issues. All my information, data, and accounts were still there.


I don’t think that the issue occurred because of the app. I believe it was an unhandled exception during the download process that made my phone unresponsive. I didn’t have enough patience to see if I could get it to respond again, so I did the restart immediately, and that made things worst.  I was also quite lucky to not get my phone bricked, which is a lot worse and harder to fix.

In any case, it is always handy to know how to soft reset your phone when it is not responding, or if like in my case, it gets stuck in the boot sequence. I really hope this helps you if you run into a similar situation. Feel free to leave your comments about your own issues and possible fixes.

Saturday, January 5, 2013

Coding Fun: Python Lists

As you might know, I recently started to learn Python programming. It all started because of a recent project I worked on as an lean, architect and senior engineer. It involved heavy .NET development on a frontend WPF application controlling a high resolution Canon EOS camera. While I was responsible for executing the .NET app, I had to integrate it with the backend system, which was done in Python. The project was driven by retail installations and events, and I had to travel around the world deploying and supporting the system.

My coding background is mostly in .NET (although I have also programmed with Java, RPG/RPGLE, Perl, PHP, Visual Basic, JavaScript, a bit of iOS and Android and a few others). However, during the installations and events, I had to deal on several occasions with the Python scripts and programs running on the platform. During those times, I started to think about learning Python more seriously. Additionally, several of my colleagues have started to get into it, so I think is a good time to dive in.

Ok, enough of my traditional talking, lets get to the code. So, I have been using a the Khan Academy Windows 8 app for my python lessons. One of the first things I have been playing around is with lists, and let me tell you, they are fun! (by the way, here is a good link to get started with Python 3).

Now according to the documentation, “Lists are mutable sequences, typically used to store collections of homogeneous items (where the precise degree of similarity will vary by application)”. Lists in Python, as in .NET, are zero based structures.

You can create a list by using square brackets or the type constructor. Lets see some examples.

Using Square Brackets:

  1: [1,2,3]
  1: a = [1,2,3]

Using Type Constructor:

  1: #creates a list of literals ['1', '2', '3']
  2: b = list('123')
  1: #creates a list of integers [1,2,3]
  2: c = list((1,2,3))

Now, you can make two variables point to the same list:

  1: # create a new reference to the list 
  2: # 'a' and 'd' point to the same list instance
  3: # if you modify a, then d will be modified too
  4: d = a

Or, create another instance of the list:

  1: # by using the square brackets syntax, you are creating a new
  2: # instance of the list. If you modify 'a', 'e' will remain 
  3: # the same, since it is a different copy of the list
  4: e = a[:]

So, now that we know how to create list instances and references, lets see how we can retrieve and modify specific values.

Retrieving a list value:

  1: # retrieving a value from the list 
  2: # using the element index
  3: # the result will be '2' (list is [1,2,3]) 
  4: a[1] 

Modifying an element of the list:

  1: # use the element index to modify the value
  2: # list was [1,2,3]
  3: a[0] = 0
  4: # now the list is [0,2,3]

Now, we can apply operations over list elements, and this can be quite a lot of fun. Check this out:

  1: # multiplication operand acting over two integers
  2: # result is 6 (3 * 2)
  3: a[2] * 2
  1: # apply a division operation over two integers
  2: # result is 1.0
  3: a[1] / 2
  1: # same operation over a non-divisible value
  2: # result is 0.0
  3: a[0] / 2
  1: # triggering a zero-division error
  2: # will throw a ZeroDivisionError
  3: a[1] / 0

Now, this is expected. However, what happens when you start mixing types in the same list? Lets create a list of integers and literals.

  1: # create a list of integers and literals
  2: # list will be ['zero', 1, 'two', 3]
  3: f = ['zero', 1, 'two', 3]

This is interesting. In .NET you need to specify the type of the elements of the list. The only way you could mix up different types, will be to create a list of “objects”, but then you need to use casting to be able to perform operations over the elements. In Python, this works differently. You are able to throw in elements of different types and then perform operations over them without using casting. Lets take a look using our previous list.

  1: # retrieve element at position 1: 1
  2: # multiply it by 2. The result is 2
  3: f[1] * 2
  1: # retrieve element at 0: 'zero'
  2: # multiply it by 2.
  3: # the result is actually: 'zerozero'
  4: f[0] * 2

Now, that is unexpected. Types are not being enforced, and it seems like an overloaded operator, which understands that multiplying a literal, is actually repeating that literal ‘X’ number of times. However, you can get errors if you perform an invalid operation:

  1: # retrieve element at 0: 'zero'
  2: # divide it between 1
  3: # the operation throws the following error
  4: # TypeError: unsupported operand type(s) for /: 'str' and 'int'
  5: f[0] / 1

The best part of learning a new language is that it makes you think about this that you take for granted in the languages you already know. I can say that playing around with lists on Python made me go back and review what I knew about C# lists.

I will continue to dig deeper into the different structures and operations, and how Python treats them. For now, I’ll conclude with just a few more examples of operations you can use over lists.

  1: # adding an element at the end of the list
  2: # in this case, adding int 4 to the 'a' list
  3: a.append(4)
  1: # clears all elements from the list
  2: # result is []
  3: a.clear()
  1: # recreate the list
  2: a = [0,2,3,4]
  3: # insert a new element on a given position
  4: # result is [0, 1, 2, 3, 4]
  5: a.insert(1,1)
  1: # return (and remove) last element of the list
  2: # result is 4
  3: a.pop()

You also have functions like copy, count, sort, extend, index, remove and reverse. Go ahead and play with them to see what you can get.

Ok, that’s that for now. I’m just starting to play around with Python and the different data structures. Please feel free to leave any comments, corrections, lessons, or whatever you want to share in the comments sections. I’d really appreciate your time to share them.

Windows 8 Tip: Boot Directly to the Desktop

I just got a really nice tip from Paul Thurrott over Twitter about how to get Windows 8 to directly booth to the traditional desktop UI using a free tool called Skip Metro Suite.

While I urge people to learn the new Windows Modern UI patterns, controls and short cuts, I know that skipping the modern interface completely and booting to the desktop is required under certain conditions.

One case is when you have an application that must run in Kiosk Mode, where the computer is required to boot directly into the desktop, run and remove the ability to switch to the Modern interface. I have developed many interactive apps for Windows falling into this category, so I know this will be quite handy when running on Windows 8 environments.

So, if you missed Paul’s twit of his article, here you have it (and I’ll have it for reference later on). Hope it helps, and thanks to Paul for sharing.

Music & Technology–The Beauty of Intersections

Intersections between different disciplines have been always part of my life. I can say I have performed at the intersections between technology, music, dramatic arts, writing, business, culture, painting and design.

Working at the intersection of disciplines gives you not only a different perspective, but also an advantage compared to people that are focused only on one thing. You could see it as a true think-out-of-the-box practice. You can take a step back, change and merge different context, ideas and meaning moving through the intersection. Furthermore, intersections are the areas where true innovation comes up, and I’m not only talking about tech innovation, I mean innovation in all areas, all disciplines.

Technology and computing is becoming ubiquitous. Technology is becoming an intrinsic part of almost everything we do. Music, filming, photography, design, writing and so many other disciplines can use technology to have wider distribution, have a more efficient production, and overall be better thanks to the tools, techniques and channels technology provides. At the same time, technology can become better by integrating art and other discipline’s techniques into it. The outcome? innovation. New ways of thinking, new ways of creating, new ways of reaching, new ways of building…you get the idea.


Starting this new year, one of my goals is to work a lot more on my music and my bass playing. I want to explore more paths to music and bass line creation. Thinking about it, I realized that I started playing bass at the same time I started studying computer sciences at the University of Costa Rica, more than a decade ago.

Music and Technology are one of the intersections I have been performing for quite a few years. However, over the years I did kept both a bit separated. Lately, I have been working to bring all disciplines (tech, music, writing, painting, design, business) a lot closer, so I can work on the intersections and produce more creative and innovative content.

I have been producing more content for my art blogs (art hobbies and writing), and trying to mix them up to facilitate the intersections I want to work on a lot more. A good example of this, is how my knowledge about technology, computers and in particular Windows 8, helped me to quickly put together a semi professional home recording studio to record and produce my bass lines. Actually, the intersection between technology and music allowed me to help my former band, Tercer Mono, to prepare for recording our first studio album. Another example was when I performed as an actor and narrator for a short documentary showcasing Costa Rica’s technology industry, which was produced by PROCOMER and showcased at Intel’s Innovation Centre.

The most recent example of work I have been creating on an intersection, is a series of bass samples featuring a multi-track bass line. I have been using Windows 8, Ableton and Saffire software/hardware to record and produce improvised samples, and then use the cloud to host and share the content. Here, technology has helped me to increase the productivity and reach of my music work. If you want to check out the outcome, listen to the samples in SoundCloud here.

I invite you to try it yourself. Just try to bring your profession and hobbies together. Maybe you have some old hobby or a side interest that might be a good fit with your current profession. Try to find ways to bring them together and create work out of it. I bet you will be surprise of what comes out of it!

Feel free to share your thoughts and experience here or leave your comments if you feel like it.

Wednesday, January 2, 2013

Get on board with Responsive Web Design

Responsive web design is a web development set of techniques that started disseminating a couple of years ago when Ethan Marcotte published his Responsive Web Design article on A List Apart. Responsive web design (RWD) aims to tackle the never ending issue of having a website running on different devices, with different screen sizes and resolutions.


When I was starting my career as a software engineer, I remember that for web development, the standard resolution was 800 x 600, and most websites were designed to work for that resolution, because common computing screen was that size. Windows and Internet Explorer (even if web developers now hate IE) made computers ubiquitous. From there, web developers only needed to account for the standard resolution increase, as computer monitors became better.

Then Nokia started to popularize mobile handsets, laptops started flood the markets and computers started to take all sort of forms and sizes, along with their screens. Finally, Apple brought the iPhone, and it was so successful that it changed the industry for good. Now, entire companies, industries and economies are shifting. Mobile Internet access is huge, and smartphones are coming in every direction. Even Windows 8 changed the whole operating system to favour these new connectivity and usability patterns.

Nowadays, we are seeing all screen sizes we can image around us all the time. From the small phone screens, small interactive gadgets, and watches, to laptops, ultrabooks, tablets, mini tablets, and then the full range of massive computer screens and televisions. The list will only keep growing!

Anyway, I’m not the most knowledgeable person on responsive web design. My background is mainly on interactive application development, which I have done mostly with .NET. Truth to be told, I have always felt a bit sceptical about web development. When I was in University, we did websites just for fun or as side assignments, but the real deal was on native application development. Serious programming as we used to joke. That’s where you found real programming challenges. So when I graduated, working on web development was kind of throwing all my education away, or at least, kind of undermining all the efforts to get my bachelor degree in Computer Sciences. That, plus the fact that most of the people I knew that did websites were not engineers.

However, things have changed since then. The world wide web is becoming better, more powerful, and more democratic. The possibilities and potential are increasing, and more and more, native apps rely on Internet connectivity to work, just as a web application does. Web technologies have achieve a similar power than previous proprietary plugins, like Flash and Silverlight. Then, for mobile devices, including smartphones and tablets, web apps are getting closer to what the ideal experience is supposed to be.

Don’t get me wrong, I still love working on hardcore interactive native applications. Web apps will never be at the cutting edge of technology, because the web, by nature is way more democratic and requires a lot more consensus from the community. But, I must say, I’m becoming a lot more curious about web development, and I have been playing and learning more and more about it. I have done a few websites in my career, and a lot of prototypes playing around with HTML, CSS and JavaScript. I have done quite a lot of web development with ASP.NET building custom content management systems and the like. I’m knowledgeable about different web technologies, patterns (like MVC) and such. But, as a solutions architect, I have to work on web projects, define architectures and integration with online and native systems, so it is in my nature, the nature of my job, and my responsibility to understand responsive web design in a better, more hands on way.

That being said, I’m making 2013 my year to learn RWD and Web Stack technologies as a priority in my agenda!

If you face a similar situation, or are curious, or even the opposite, you are a master of web development and RWD, you might want to stick around and share some RWD thoughts around here.

I’ll leave this here as an introduction for what this year will be in regards to web stack technologies and techniques as RWD. I urge you to get on-board, and if you like, share some thoughts and comments here!

Keep Blogging!

I just wanted to share a quick post, the first one of the 2013 in fact, to join the blogging crowd to say: KEEP BLOGGING! and if you don’t have a blog, the message is: START BLOGGING!

Blogging is really important. It gives you a voice that can be shared, searched, learned, contacted, you get the point. Twitter and Facebook are great to write small messages, status or keeping up to date with family, friends and colleagues. But blogging is way more than that. It will help you, and will help others.

Some colleagues and friends seem scared about blogging. What would I write about? I’m not good enough to blog! I don’t have anything useful to share! All these arguments are quite mistaken. The truth is, that blogging is simply like giving your opinion and experience about a topic you might, or not, know about. You might be mistaken, you might not have all the information, but that doesn’t mean that your opinion is not valid. So, trust me, it is worth it. The more I blog, the more I realize how important it is.

So, once again, Happy New Year, and KEEP BLOGGING!