Cloud Computing

8 Posts authored by: Harry Yang
Share: |

When technology advances, it creates enormous value and benefits to allow the society to run much efficiently. Automation is one of them. From our daily life to manufacture, automation improves our productivity and allow us to do more thing with less time and more accurately. But it also has its side effect. Automation magnifies both positive and negative aspects when it's hard, by design, for humans to intervene.


Hand-SawConsidering the saw. While it takes you lots of time and effort to cut a log using a hand saw, you will feel much easier to use a chainsaw to do the job. Why? Because the chainsaw uses an engine efficiently passing the energy to the cutting chain which runs in a faster speed. The automation in the chainsaw improves the productivity of  anyone who wants to achieve the job of cutting a log. But if you do not properly use it or have an accident, the damage the chainsaw can cause is much bigger than a handsaw can do.Chain-Saw


This is the same in IT operations. Automation makes IT operations more efficient, but mistakes caused by humans and machines can easily cascade to do much more damage. The amazon storm happened in 2011 is a perfect example of this. The automated script for EBS mirroring is a really innocent process but acts as the catalyst for the outage storm. This is the nature of cloud, which is built on top of the massive automation.


How should you react to it? First, you should accept it. It happened in many public cloud providers. Chances are it will happen in your private cloud environment. The important thing you need to do is to quickly spot it and be able to stop the cascading before it causes a big damage. The operations management tool you choose for your automated environment should give you this edge. Using traditional way to monitor every resource supporting your cloud won't cut it. It just gives too much data, to the extend that you won't be able to grasp the true meaning of these data. Look out a tool that can give you the insight of your cloud environment without showing off itself meaninglessly with mass amounts of data that will bury you and your productivity.

Share: |

Last week, we talked about how shared resource pools change the way IT operates the cloud environment. We mentioned that how to avoid false positive and save the maintenance costs by measuring the pool decay. Today, I am going to explain how you can avoid another major challenge in the cloud operations -  outage storm.


The Outage storm typically is caused by cascading error and the lack of mechanism to detect those errors. Chances are you are not unfamiliar with this issue. In April, 2011, Amazon AWS experienced a week-long outage on many of its AWS service offerings. I examined this incident in the article - thunderstorm from Amazon reminded us the importance of weather forecast. In a nutshell, a human error diverted major network traffic to a low bandwidth management channel. This flooded the communication between many EBS nodes. Because of the built-in automation process, these nodes started to unnecessarily replicate themselves and quickly consumed all the storage resources the availability zone. Eventually it brought down not only EBS but all other services relying on it. Almost a year later, Microsoft Azure experienced a day long outage. This time, a software glitch started to trigger unnecessary built-in automation process and brought down the server nodes. You can see the similarity between these two incidents. An error happened and triggered, not intentionally, automation processes that were built for different purpose. The outage storm, without any warning, brings your cloud down.


So how you can detect and stop the cascading as soon as possible? Let's look at these two incidents. The environment seemed normal during the onset. The capacity in the pool seemed good. I/O was normal. The services run from these pools were not impacted. You felt everything was under control since you were monitoring the availability of each of those resources. Suddenly, you started to notice number of events showing up in your screen. While you were trying to make sense on these events, there were more and more events coming in and alerting you the availability of many devices were gone. Not long, the service help desk tickets swamped in. Customers started to complain large number of their services experiencing performance degradation. Everything happened just so fast that you didn't get time to understand the root cause and make necessary adjustment. Sounds a nightmare to you?

How one can prevent that from happening? My suggestion is that you need to two thing. One, you need to measure the pool health. Particularly, in this case, you need to monitor the distribution of health status of its member resources. How many of them are in trouble? Do you see any trend how the trouble is propagated? What's the rate of this propagation? Case in point, the Azure incident could have lasted longer and impacted more customers if Microsoft team hadn't implemented its "human investigate" threshold. But still it lasted more than 12 hours. The main reason was these thresholds rely on the availability monitoring through periodic pings. And it took three timeouts in a row to trigger the threshold of the pool. And this delays the alert. So if you want to detect storm at the onset, the second thing you need to do is to detect the abnormality of behavior for its member resources, not just the ping. Combining these two measurements, the device can reflect their abnormality health status and the pool can detect the changes of the health distribution among its member resources. You, as an IT operation person, can set up rules to alert you when the health distribution changes across a critical threshold.


How does this benefit you? First you can get the alerts once that threshold is crossed even if the overall performance and capacity of the pool seem good. You will then have enough time to respond, for example diverting services to another pool or have the troubled devices quarantined. In addition, you won't be swamped by massive alerts from each affected devices and try to guess which one you should look first. You can execute root cause analyses right from that alert at your pool level.


Cloud is built with the automation as the main mechanism to ensure its elasticity and agility. But occasionally, like what happened in these two incidents, errors can amplify their damages through cascading very quickly through those automation. Because of its inherited nature, the outage storm is more often than you think. If you operate a cloud environment, chances are you will face them pretty soon. You need to find a solution that can detect resource health by learning its behavior and can measure the distribution change of those health status at the pool level. The shared pool changes how you operate your cloud environment. Operation solution needs to  evolve to help you better measure pool decay and detect outage storm. Cloud-wash is not going to cut it.


To see how it works in a real world, you can visit BMC booth (#701) in this year's VMworld. You can see a live demo on how to detect a outsage storm at the onset and get some ideas how you would approach these problems. If you want to discuss this with me, please let the booth staff know.

Share: |

Late last year, we launched the next generation of cloud operations management. Since then, we have gotten great reception from our customers, analyst community, and the market. Today, we are moving one step further. We are extending the cloud performance analytics to almost all the cloud management platforms, BMC Cloud Lifecycle Management, VMware vCloud Director, OpenStack, you name it. This is an important step for our customers. Now no matter what kind of cloud platform they are running, our customers can have better visibility into their cloud performance without worrying about being buried into a huge amount of noise and missing the critical signals for a possible outage. This is critical for our customers to confidently run a production cloud.


In addition to broaden our reach, we also made a few enhancements. We are including a report portal for our customers, particularly service providers, to give their tenants a detail view on the performance of their infrastructure. When you are dealing with a dynamic and scalable environment, the only way for you to scale is to have a good policy management. In this release, we added many tweaks into our central monitoring administration console to make it much easier for administrators to define and manage the monitoring policy centrally.


Since the inception of our cloud operations management solution, we are getting lots of insightful feedback from our customers. Cloud brings great benefits along with new challenges to our customers. We are very aware of these changes. And we have committed to continue our journey along with our customers.

Share: |

Jun 23, 2012 is the 100th birthday of Alan Turing. 76 years ago, Turing, just 24 years old, designed an imaginary machine to solve an important question: are all numbers computable? As a result, he actually designed a simple but the most powerful computing model known to computer scientists. To honor Turing, two scientists,  Jeroen van den Bosand and Davy Landman,  constructed a working Turing's machine .  It is not the first time such a machine is built. The interesting thing this time is that the machine was built totally from a single LEGO Mindstorms NXT set.



The modern brick design of LEGO was developed in 1958. It was a revolutionary concept. The first LEGO brick built 54 years ago still interlocks with those made in the current time to construct toys and even the Turing machine. When you want to build a LEGO toy or machine, you don't need to worry about when and where  the bricks are manufactured. You focus on the thing you are building and what standard shapes and how many of LEGO bricks you need.  And you can get them in any of those LEGO store no matter what you are building.


Sounds familiar? This is very similar to how one would build a cloud service using resources in a shared fabric pool. You don't care which or what clusters or storage arrays these resources are hosted. All you care is types (e.g. 4cpu vs 8cpu VM) and service levels (e.g. platinum vs. gold) these resources need to support. Instead of taking each element devices, such as computer hosts or storage arrays, as key building blocks, IT now needs to focus on the logic layer that provides computing power to everything running inside the cloud - VMs, storage, databases, and application services. This new way to build services changed everything on how to measure, analyze, remediate and optimize resources shared within the fabric pool in the cloud.


To understand why we need to shift our focus to pools and away from element devices, let's talk about another popular toy - puzzle set. Last year, I bought a 3D earth jigsaw puzzle set to my son who was 3 years old at that time. He was very excited as he just took a trip to Shanghai and was expecting a trip to Disney World. He was eager to learn all the places he had been and would be visiting.  So he and I (well, mostly I) built the earth using all those puzzle pieces. The final product was a great sphere constructed with 240 pieces. We have enjoyed it for 2 weeks until one of the pieces was missing. How can you blame a 3 year-old boy who wanted to redo the whole thing by himself? Now here is the problem, unlike those two scientists who used LEGO bricks to build the Turing machine, I can't easily go to a store to just buy that missing piece.  I need to somehow find that missing piece or call the manufacture to send me a replacement. In the IT, it is called incident based management. When all your applications are built using dedicated infrastructure devices, you have a way to customize those devices and the way how they are put together to tailor to the particular needs of that application. If one of those devices has issue, it impacts the overall health of that application. So you file a ticket and operations team will do triage, isolation, and remediation.



In a cloud environment with shared resource pools, things happen differently. Since now the pool is built  with standard blocks and is shared by applications, you have the ability, through cloud management system, to set policy which moves VMs or logical disks around if their underneath infrastructure blocks get hit by issues. So a small percentage of unhealthy infrastructure blocks doesn't necessary need immediate triage and repairing action.  If you monitor only the infrastructure blocks themselves, you will be overwhelmed by alerts that not necessary impact your cloud services. To respond all these alerts immediately increases your maintenance costs without necessary improving your service quality. Google did a study on the failure rate of their storage devices. They found that the AFR (annual failure rate) of those storage device is 8%. Assuming Google has 200,000 storage devices (in reality, it may have more than that), every half hour, you will have a storage alert somewhere in your environment. How expensive is it to have a dedicate team to keep doing triage and fixing those problem?


So how do we know when services hosted in a pool will be impacted? We give a name to this problem  - pool decay. You need to measure the decay state - the combination of  performance behavior of the pool itself and distribution of the unhealthy building blocks underneath it. In this way, you will be able to tell how the pool, as a single unit, performs and how much ability it has to provide the computing power to hosted services. When you go out to look for a solution that can truly understand the cloud, you need to check whether it has such ability to detect the pool decay without giving you excessive false positive. Otherwise, you will just get a solution who is cloudwashing.


Back to my missing piece in the 3D jigsaw set, I finally found it under the sofa. But the lesson learned,  I  now  bought my boy LEGO sets instead.


Next week, we will examine how the resource pool with the automation introduces another well known challenge - outage storm. Stay tuned.

Share: |

I haven't posted a blog since last August. One reason is that I had two great vacations on beautiful Caribbean islands. But most of time, I was working with a team of excellent talents to finish a project that allows IT to run its cloud environment with high confidence. Today, I am very proud to say - we did it.


I have talked about how cloud computing poses new challenges in IT operations and why proactive performance management is even more important now. Today, we launched the next generation of cloud operations management solution to provide a set of capabilities to help IT take on those new challenges. These capabilities range from cloud panorama, showing performance health for every shared fabric resource in your environment, to automated workflow, allowing those resources to be optimized for provisioned workloads.


Actionable Views

A cloud environment is complex. Not only do you have to manage the infrastructure resources, such as storage, network, and compute, but you also need to understand how they collectively power cloud services through shared pools. Many approaches you can find today in the market try to collect and show as much as data possible. We believe this is not efficient and actually prevent you from spotting the real issues and risks in your cloud environment. This new release gives IT operations and administration teams an actionable view - cloud panorama.  Cloud panorama not only summarizes the data organized as you see in the cloud (e.g. pools, containers, etc.) but also allows you act upon on what you can get from those data.

High-precision Root Cause Analyse

The data is important. But the meaning of the data is even more important. What an operations staff wants to understand is what these data really mean to his/her day-to-day job. This is where the analytics comes in. Analytics for performance and capacity data is not a new thing. What unique about the analytics enhanced in this new release is that it is the first time an analytics engine can provide the insight into how shared pools in the cloud power highly-automated cloud services. Lack of this type of insight causes serious problems. Think about last year's Amazon AWS outage and this year's Microsoft Azure disruption. In the coming blogs, I will explain why it matters to you and how you can execute high-precision root cause analyses to prevent this type of outage from happening in your cloud environment.


Intelligent Workflows

When end users asks for a new cloud service, such as new VMs, new database instance, or new storage space, they will get it almost instantly. This is because the provisioning of these services is automated. The challenge to cloud operators is how they can ensure these services run as expected from the get-go. To manually identify, deploy and configure your monitoring agents into these services is not an option. In this new release, we will enable you to automatically deploy and configure your monitoring agents during the provisioning of the service. By doing so, all your cloud services will be instant-on and instant-assured. In addition, when a service is provisioned, the solution tells the provisioning engine how to optimize the workload,  leveraging the workload pattern it  has learned and the capacity supply it knows. Finally, the solution analyzes the data it collects and provides showback reports.


Cloud computing provides IT tremendous advantages to provide automated and elastic services to its end users. But it also creates new challenges that IT operations teams have to face. In the past year, we at BMC worked very hard to understand those new needs. Today, we are excited to announce this new release of cloud operations management solution. Through its actionable views, high-precision root cause analyses, and intelligent workflows, this release enables IT confidently to power the cloud, control the cloud, and take intelligent action to ensure high-quality service delivery. Take a look at the clickable demo my colleague Thad did and check around the product page, particular that 2-minute explainer. We will get into more details in the coming weeks.

Share: |

Part 2 - 6 Capabilities in the New Generation of Cloud Operations Management


In part 1 of this topic, I talked about a paradigm shift in IT from boxes, applications, and ownership in the classic data center to a new cloud model with pools, services, and sharing. Cloud will drive changes to operations and deliver powerful benefits.  In this part, I want to examine six new capabilities that operations management will have to evolve in order to deliver on the promise of the cloud.


1. Operate on the “pools” of compute, storage, memory

Traditionally, operations management solutions have had good coverage for individual servers, storage arrays, or network devices. However, in the cloud, these are all abstracted away, and it becomes imperative to operate at the “pool” level. You have to look beyond what you are monitoring in the individual device level. You need to make sure that you have immediate access to the operational status of the pool. That status could be aggregated workload (current usage) and capacity (past usage and future projection). Perhaps more importantly, it needs to accurately reflect the underlying health  of the pool, even though individual component availability is not the same as the pool availability.


For example, when one ESX host in the pool has a problem, the VMs in that host can be migrated to other hosts in the same pool (through vMotion or Live Migration, etc.) as long as the pool still has the capacity. So despite one host being unavailable, the overall pool still is still functioning properly. The operations management solution you are using should understand the behavior of the pool and report the health status based on it.


2. Monitor elastic service

The Cloud is all about elasticity. That means several things. First of all, you will have services that dynamically expand and retract based on demand. Your operations management solution should adapt to this dynamic nature. For example, if you are monitoring the performance of a service, you need to make sure your monitoring coverage expands or retracts with the service. It should do so  automatically. This means that you can’t expect a manual process to figure out and deploy your monitoring capabilities to the target. Your operations management solution needs to know the configuration of that service and automatically deploy or remove necessary agents.


Another important consideration is coverage for both cloud and non-cloud resources. This is critical for  enterprises that are building a private cloud. Why? Chances are that not every tier of a multi-tier application can be moved to the cloud. There may be static, legacy pieces, such as a database or persistent layer that are still deployed in the physical boxes. If you are in such a situation, you will want to monitor your service no matter where its resources are located, cloud or not. In addition, a management solution should natively understand different behavior in each environment.


Furthermore, when resources are located in both private and public cloud, your operations solution should allow you to monitor your services in each seamlessly. It should also support inter-cloud service migration. At the end of day, you want your service to be monitored no matter where its resources are located. Your operations management solution must know their location and understand their behavior accordingly.


3. Detect the issue before it happens

Compared to workloads in the traditional data center, workloads in the cloud exhibit a wider variety of behavioral issues due to their elastic nature. When service agility is important, relying on reactive alerts or events will not be an option, particularly for service providers, to support a high SLA. You need to detect and resolve issues before they happen.


How do you do that? With a monitoring solution that knows how to learn the behavior of your cloud infrastructure and your cloud services. This is not new technology in the traditional data center. But in the Cloud, the device level behavior evolves more rapidly and in less conformity. Your solution should have the ability to learn the behavior of abstracted resource such as pools, as well as service levels that are based on business KPIs. Based on those metrics, it should give you predictive warning to allow you isolate the problem before it impacts your customer.


Speaking of problems, when you try to pinpoint them, make sure you have done the proper root cause analysis. This becomes an even more critical in the cloud when large numbers of scattered resources are involved. Amazon’s outage that happened earlier this year is a good example. According to the Amazon service dashboard, a network event triggered many EBS nodes in that region to think they lost mirror and the central management policy kicked in to reconfigure them.


As a service provider, if you sit in your monitoring dashboard, you probably see a sea of red alerts suddenly appears. Even though among of them is that network alert, chances are you are not going to notice it. Your operations management solution should intelligently detect the root cause of this and highlight that network event in your dashboard or to the remediation process.


4. Make holistic operations decision

In the cloud, you have to manage more types of constructs in your environment. In addition to servers, OSs, and applications, you will have compute pools, storage pools, network containers, services, and, for service providers, tenants. These new constructs are closely related. You can’t view their performance and capacity data in silos; they have to be managed holistically.


Let’s take the Amazon’s recent outage as an example again. The root cause was from its network. But it affected the storage pool immediately. And that caused the huge impact to its EC2 instances, CloudWatch, and RDS services, as well as many of its customers. If you treat those symptoms separately, you won’t have a solid plan to quickly recover from a similar outage.


You had better know who are your critical customers and their services so you can focus on recovering them in order of priority. You may want to send out alerts to affected customers to proactively let them know there is an issue. Your operations management solution should give you a panoramic view of all these aspects and their relationships. Not only will it let you quickly isolate the problem, but it will also save you money if you know which SLAs cost more to breach.


5. Enable self-service for operations

To give your customer better experience and save on support costs, it’s important to give your customers constant feedback. Traditionally, performance data, in general, is not available to the end user. In the cloud, you have a larger number of users or service requests with a relatively lower ratio of administrators. You want to minimize the “false alarms” or manual routine requests. The best way is to let your end users see the performance and capacity data surrounding to their services.


You can also let your users define KPIs to monitor, the threshold levels they want to set, and some routine remediation processes they want to trigger (such as auto-scaling). Your operations management solution should allow you to easily plug this data into your end user portal.


6. Make cloud services resilient

Resiliency is the ultimate goal of your cloud operations management. If you have a solution which can understand the behavior of your services and proactively pinpoint potential issues, naturally the next step is that you want that solution to automatically isolate and eliminate the problem. While it sounds simple it is more complex than it may appear. First, you need to make sure your solution has accurate behavior learning and analytics capabilities. Second, you still need to put human in control through well-defined policies whether by an automated policy engine or a human interactive process. Lastly, your solution should be able to seamlessly plug into other life cycle management solutions, such as provisioning, change management, service request, etc. Operations management alone can’t make your cloud resilient. You should plan the right architectural design (e.g. designing for failure) to start with and implement a good management process that reflects the paradigm shift to ensure your success.


By no means will these 6 capabilities cover all the aspects of the new generation of cloud operations management. But they are a good start based on what we have heard from our customers and other leading cloud providers. What is the most important shift in your operations management strategy? What are critical capabilities that you think a cloud operations management solution should have? I welcome your thoughts as well.

Share: |

Part 1 – What’s So Unique About the Cloud?


When I speak with customers, I often get asked why operations management in cloud is different than in their existing data center.While his question seems innocent, it’s actually a very important and complex question. In order to answer, we need to examine what is unique about the cloud compared to the traditional data center – which could have both physical and virtualized infrastructure. I like to think of three attributes which define cloud computing.


Cloud Attributs.pngElasticity – Think about pools instead of boxes

Many business buyers look to cloud in order to solve immediate business demands that their traditional data center could not address. Some of those demands could be seasonal peaks, or they could be because of exponential growth that outpaces the data center’s expansion plans.The cloud offers elastic resources that can be scaled up and down to meet these types of dynamic demands.

The economical way to do that from the cloud provider’s point of view, whether an internal or external provider, is to make sure the cloud infrastructure can support a large and varied number of resources. These resources have to be pooled to provide high utilization and high availability. While a typical enterprise data center houses thousands of servers with 20-35% of utilization, a single Cloud could easily have hundreds of thousands of virtual machines and up to 70-80% of utilization.In the traditional data center, you can deal with the box (the physical serveror virtual server). In the Cloud, you have to live with pools of compute units, storages, and network devices. This is a big paradigm shift between the Cloud and the traditional data center that operations must deal with.


Agility – Think about services instead of applications or machines

Business buyers look to cloud to deliver business services.They not only want their service, they want their service to be available immediately and to run reliably.  With thousands or tens of thousands of service requests, the cloud has to ensure services are reliably provisioned, ready to be used by cloud users, and ready to be monitored and operated by the administrators. Manuel processes are not feasible in a cloud environment for any of those steps. The entire on-boarding (and off-boarding) process needs tobe standardized, automated, and self-service.

Service reliability is not a new requirement. It is also a very important measurement in the traditional data center. However, maintaining high levels of reliability becomes even more critical and challenging in the Cloud, due to the dynamic nature of demand, and the wide variety of workloads. This has a huge impact on how operations must be architected in a cloud environment. We will talk about this in more details in part 2 of this series. The bottom line is that along with provisioning, operational tasks and processes also need to be automated.


Efficiency – Think about sharing instead of owning

While many business buyers look to cloud to give them business agility, IT buyers mainly seek a way to reduce the costs. More specifically, they want to reduce their CapEx, or fixed costs. Cloud provides economies of scale that reduce unit costs. Combined with an on-demand model, this translates into lower variable costs that get passed on to cloudusers. It is worth noting that economies of scale do not only translate to savings on CapEx through better utilization of commodity resources, but also to OpEx through automated management process.


Shifting the paradigm from boxes, applications, ownership in traditional data center to pools, services, and sharing in the cloud requires you to adapt your current operations management to a new paradigm – cloud operations management. In part 2 of this series, we will delve deeper into the pieces you should consider when you build out your operations management in the cloud.

Share: |

Today, we at BMC launched cloud operations capabilities to safeguard cloud users. As part of that, we released our latest version of BMC Proactive Performance Management. There are many new things included in this release. But one of them that I am really excited about is its focus on cloud operations.

Behavior learning in the cloud

Cloud, compared to traditional IT infrastructure, has its own uniqueness that requires a different approach on how you manage its day-to-day operations. Its mixed workloads, elastic nature, and service-centric principal dictates any static, reactive, and disparate operations solution won't be able to generate enough power to propel the new cloud engine. That's why I am excited to see that we are focusing on tuning the analytic engine to better understand this new set of behavior of cloud services and resources. For example, the engine can now  support hundreds of VMs provisioned per hour and readjust the behavior learning within minutes. This release is just the first step in that direction. But the team at BMC worked really hard to understand from customers and the market and assessed the current knowledge based on many year's of successful application of the behavior learning engine  in the virtualization environment. There are many we can leverage and some we can't. But that's the point. The cloud is different from anything we have seen so far, virtualization or not. We found out and have learned from the customer that behavior learning capabilities is generating bigger and bigger value in a cloud environment where dynamic rules the world, from the IT process, the service, to the infrastructure resources.

Get your value fast

Cloud market develops rapidly. Our customers who want to compete in this space need to make their offering available fast. So how to make sure the operations solution can be up and running is one of the focus in this release. Now there will be a guided wizard to allow you plan, install, and configure all the necessary cloud management pieces, including lifecycle management and proactive performance management. One of our customers used to take 2 weeks to put the whole cloud management solution up and running in a small environment. Now they have done that in just 2 days with an even more robust solution.

Scalability for cloud deployment

In this release, we also address the scalability difference between a typical service provider cloud environment and an enterprise data center. The solution now is able to provide performance data from 50,000 cloud devices to hundreds concurrent user access. This enables not only the administrator will see and act upon the data but also the cloud end users will get those data, just like what you can get from Amazon CloudWatch.

Public cloud monitoring for enterprise

Speaking of Amazon CloudWatch, many of our customers who deployed their services in to EC2 monitor the data constantly. But they couldn't do is to translate those data into actionable insight automatically. Now, we are providing out-of-the-box capabilities (aka."knowledge module" if you are familiar with our product) to allow enterprises to pull in the performance data from CloudWatch for their instances and feed into our behavior learning engine. You can even build a service that across both your provide and Amazon EC2 and use our solution to measure its availability, impact to your business, and workload by leveraging both our remote and in-guest monitoring capabilities on those public cloud instances. In addition, we also let you monitor Microsoft Azure remotely if you are building applications in its PaaS environment.


Of course, this is just a subset of new features we put in to this release. We will start share more information in the coming weeks. I will be in VMWorld next month, you can meet us and see our demo in BMC booth. I look forward to meeting you there and chatting more about how the cloud operations could be evolved.

Filter Blog

By date:
By tag:
It's amazing what I.T. was meant to be.