Posts Tagged‘tool’

PowerPoint Doesn’t Need to Die, Bad Communicators Do.

Ah PowerPoint, the thing that everyone seems to loathe when they walk into a meeting yet still, when it comes time for them to present something, it’s the first tool they look to for getting their idea across. Indeed in my professional career I’ve spent many hours standing in front of a projection screen, the wall behind me illuminated by slide after slide of information I was hoping to convey to my audience, jabbering on about what the words behind me meant. It seems that every year there’s someone calling for the death of the defacto presentation tool with them lamenting its use in many well publicised scandals and failures. However like the poor workman who blames his tools PowerPoint is not responsible for much of the ills aimed at it. That, unfortunately, lies with the people who use it.

Hook_web_slideshow__0000_Death

PowerPoint, like every Microsoft Office product, when put in the hands of the masses ends up being used in ways that it never should have been. This does not necessarily mean the tool is bad, indeed I’d like to see a valid argument for the death of say Word given the grave misuses it has been put to, more that it was likely not the most appropriate medium for the message it was trying to convey or the audience it was presented to. When used in its most appropriate setting, which I contend is as a sort of public prompt card for both the speaker and the audience, PowerPoint works exceptionally well for conveying ideas and concepts. What it’s not great at doing is presenting complex data in a readily digestible format.

But then again there are very few tools that can.

You see many of the grave misgivings that have been attributed to PowerPoint are the result of its users attempting to cram an inordinate amount of information into a single panel, hoping that it somehow all makes its way across to the audience. PowerPoint, on its own, simply does not have the capability to distill information down in that matter and as such relies on the user’s ability to do that. If the user then lacks the ability to do that both coherent and accurately then the result will, obviously, not be usable. There’s no real easy solution to this as creating infographics that convey real information in a digestible format is a world unto itself but blaming the tool for the ills of its users, and thus calling for the banning of its use, seems awfully shortsighted.

Indeed if it was not for PowerPoint then it would be another one of the Microsoft Office suite that would be met with the same derision as they all have the capability to display information in some capacity, just not in the format that most presentations follow. Every time people have lamented PowerPoint to me I’ve asked them to suggest an alternative tool that solves the issues they speak of and every time I have not recieved a satisfactory answer. The fact of the matter is that, as a presentation tool, PowerPoint is one of the top in its class and that’s why so many turn to it. The fact that it’s found at the center of a lot of well publicised problems isn’t because of its problematic use, just that it’s the most popular tool to use.

What really needs to improve is the way in which take intricate and complex data and distill that down to its essence for imparting it on others. This is an incredibly wide and diverse problem space, one that entire companies have founded their business models on. It is not something that we pin on a simple presentation tool, it is a fundamental shift away from thinking that complex ideas can be summed up in a handful words and a couple pretty pictures. Should we want to impart knowledge upon someone else then it is up to us to take them on that journey, crafting an experience that leaves them with enough information for them to be able to impart that idea on someone else. If you’re not capable of doing nor PowerPoint nor any other piece of software will help you.

VMware VIM SDK Gotchas (or Ghost NICs, Why Do You Haunt Me So?).

I always tell people that on the surface VMware’s products are incredibly simple and easy to use and for the most part that’s true. Anyone who’s installed an operating system can easily get a vSphere server up and running in no time at all and have a couple virtual machines up not long after. Of course with any really easy to use product the surface usability comes from an underlying system that’s incredibly complex. Those daring readers who read my last post on modifying ESXi to grant shell access to non-root users got just a taste of how complicated things can be and as you dive deeper and deeper into VMware’s world the more complicated things become.

I had a rather peculiar issue come up with one of the tools that I had developed. This tool wasn’t anything horribly complicated, all it did was change the IP address of some Windows servers and their ESXi hosts whilst switching the network over from the build VLAN to their proper production one. For the most part the tool worked as advertised and never encountered any errors, on its side at least. However people were noticing something strange about the servers that were being configured using my tool, some were coming up with a “Local Area Network 2” and “vmxnet3 Ethernet Adapter #2” as their network connection. This was strange as I wasn’t adding in any new network cards anywhere and it wasn’t happening consistently. Frustrated I dove into my code looking for answers.

After a while I figured the only place that the error could be originating from was when I was changing the server over from the build VLAN to the production one. Here’s the code, which I got from performing the same action in the VIClient proxied through Onyx, that I used to make the change:

            NameValueCollection Filter = new NameValueCollection();
            Filter.Add("name", "^" + ServerName);
            VirtualMachine Guest = (VirtualMachine)Client.FindEntityView(typeof(VirtualMachine), null, Filter, null);
            VirtualMachineConfigInfo Info = Guest.Config;
            VirtualDevice NetworkCard = new VirtualDevice();
            int DeviceKey = 4000;
            foreach (VirtualDevice Device in Info.Hardware.Device)
            {
                String Identifier = Device.ToString();
                if (Identifier == "VMware.Vim.VirtualVmxnet3")
                {
                    DeviceKey = Device.Key;
                    NetworkCard = Device;
                    Console.WriteLine("INFO - Device key for network card found, ID: " + DeviceKey);
                }
            }
            VirtualVmxnet3 Card = (VirtualVmxnet3)NetworkCard;
            VirtualMachineConfigSpec Spec = new VirtualMachineConfigSpec();
            Spec.DeviceChange = new VirtualDeviceConfigSpec[1];
            Spec.DeviceChange[0] = new VirtualDeviceConfigSpec();
            Spec.DeviceChange[0].Operation = VirtualDeviceConfigSpecOperation.edit;
            Spec.DeviceChange[0].Device.Key = DeviceKey;
            Spec.DeviceChange[0].Device.DeviceInfo = new VMware.Vim.Description();
            Spec.DeviceChange[0].Device.DeviceInfo.Label = Card.DeviceInfo.Label;
            Spec.DeviceChange[0].Device.DeviceInfo.Summary = "Build";
            Spec.DeviceChange[0].Device.Backing = new VMware.Vim.VirtualEthernetCardNetworkBackingInfo();
            ((VirtualEthernetCardNetworkBackingInfo)Spec.DeviceChange[0].Device.Backing).DeviceName = "Production";
            ((VirtualEthernetCardNetworkBackingInfo)Spec.DeviceChange[0].Device.Backing).UseAutoDetect = false;
            ((VirtualEthernetCardNetworkBackingInfo)Spec.DeviceChange[0].Device.Backing).InPassthroughMode = false;
            Spec.DeviceChange[0].Device.Connectable = new VMware.Vim.VirtualDeviceConnectInfo();
            Spec.DeviceChange[0].Device.Connectable.StartConnected = Card.Connectable.StartConnected;
            Spec.DeviceChange[0].Device.Connectable.AllowGuestControl = Card.Connectable.AllowGuestControl;
            Spec.DeviceChange[0].Device.Connectable.Connected = Card.Connectable.Connected;
            Spec.DeviceChange[0].Device.Connectable.Status = Card.Connectable.Status;
            Spec.DeviceChange[0].Device.ControllerKey = NetworkCard.ControllerKey;
            Spec.DeviceChange[0].Device.UnitNumber = NetworkCard.UnitNumber;
            ((VirtualVmxnet3)Spec.DeviceChange[0].Device).AddressType = Card.AddressType;
            ((VirtualVmxnet3)Spec.DeviceChange[0].Device).MacAddress = Card.MacAddress;
            ((VirtualVmxnet3)Spec.DeviceChange[0].Device).WakeOnLanEnabled = Card.WakeOnLanEnabled;
            Guest.ReconfigVM_Task(Spec);

My first inclination was that I was getting the DeviceKey wrong which is why you see me iterating through all the devices to try and find it. After running this tool many times over though it seems that my initial idea of just using 4000 would work since they all had that same device key anyway (thanks to all being built in the same way). Now according to the VMware API documentation on this function nearly all of those parameters you see up there are optional and earlier revisions of the code included only enough to change the DeviceName to Production without the API throwing an error at me. Frustrated I added in all the required parameters only to be greeted by the dreaded #2 NIC upon reboot.

It wasn’t going well for me, I can tell you that.

After digging around in the API documentation for hours and fruitlessly searching the forums for someone who had had the same issue as me I went back to tweaking the code to see what I could come up with. I was basically passing all the information that I could back to it but the problem still persisted with certain virtual machines. It then occurred to me that I could in fact pass the network card back as a parameter and then only change the parts I wanted to. Additionally I found out where to get the current ChangeVersion of the VM’s configuration and when both of these combined I was able to change the network VLAN successfully without generating another NIC. The resultant code is below.

            VirtualVmxnet3 Card = (VirtualVmxnet3)NetworkCard;
            VirtualMachineConfigSpec Spec = new VirtualMachineConfigSpec();
            Spec.DeviceChange = new VirtualDeviceConfigSpec[1];
            Spec.ChangeVersion = Guest.Config.ChangeVersion;
            Spec.DeviceChange[0] = new VirtualDeviceConfigSpec();
            Spec.DeviceChange[0].Operation = VirtualDeviceConfigSpecOperation.edit;
            Spec.DeviceChange[0].Device = Card;
            ((VirtualEthernetCardNetworkBackingInfo)Spec.DeviceChange[0].Device.Backing).DeviceName = "Production";
            Guest.ReconfigVM_Task(Spec);

What gets me about this whole thing is that the VMware API says that all the other parameters are optional when its clear that there’s some unexpected behavior when they’re not supplied. Strange thing is if you check the network cards right after making this change they will appear to be fine, its only after reboot (and only on Windows hosts, I haven’t tested Linux) that these issues occur. Whether this is a fault of VMware, Microsoft or somewhere between the keyboard and chair is an exercise I’ll leave up to the reader but it does feel like there’s an issue with the VIM API. I’ll be bringing this up with our Technical Account Manager at our next meeting and I’ll post an update should I find anything out.

Letting the Tool Misuse You.

Technological innovations, you know those things that are supposed to make our lives easier, usually end up becoming the bane of our existence not too long after they’ve lost their novelty. I can’t tell you how many times people have said that they’ve lost control of their email inbox or how they’re constantly distracted by people trying to contact them over the phone, damning the technology for allowing people to interrupt whatever the heck it was they were doing. What amuses me though is I use many of the same technologies that they do yet I don’t feel the same level of pressure that they do, leading me to wonder what the heck they’re complaining about.

Now I’m not saying that email, IM, Twitter et. al. are not distracting, indeed our techno-centric culture is increasingly skewed towards being a distracted one by a veritable tsunami communications tools. I myself struggled with Twitter not too long ago when I attempted to use it the “proper” way over a weekend, seeing my productivity hit the floor as I struggled to strike a balance between my level of engagement and the amount of work I got done. However I soon realised that using said service in the proper way meant that I just ended up as distracted as everyone else, with almost 0 benefit to me other than the small bit of self satisfaction that I was totally doing this social media thing right for a change.

In essence I feel that the reason people get so distracted by these tools is that they feel obligated to respond to them immediately, rather than at a time which suits them best. Thus the tool which is meant to help your productivity becomes a burden, interrupting you at the worst possible time and breaking you out of the flow of the work you were in. If you find yourself in this position you need to set up strict rules for interacting with that particular technology that suit you rather than what suits everyone else. How you go about this is left as an exercise for the reader, but the most effective tool (I’ve found, at least) is to only check your email/Twitter/whatever at certain times during the day and ignoring it at all other times.

The retort I usually get for advocating this kind of stance is “What if something important happens in the interim?”. Thinking really hard about it I can’t think of anything really important that’s come to me via the medium of email, IM, Twitter that didn’t first reach me through some more direct means (like my phone). If you’re relying on these distinctly one way, no way to verify if the person has actually received your message platforms then the message you’re sending can’t really be all that important and can wait a few hours before being responded to. If it can’t then use some more direct means of communicating otherwise you’re just forcing people into the same technological hell that you yourself feel trapped in, continuing the vicious cycle that just doesn’t need to exist.

However sometimes people are just looking for a scapegoat for their situation and it’s far easier to blame a faceless technology than it is to look internally and work out why they’re so distracted. I can kind of sort of understand people getting caught up with communications clients, especially when it’s part of your job, but when you think something like RSS is too distracting (you know, where you choose to subscribe to a site because you’re interested in it) then the problem isn’t the technology it’s your lack of ability to recognize that you’re wasting time. I get literally hundreds of items in my RSS reader every day but do I read them all? Heck no, at most I’ll skim the titles and if I recognize a story I’ve already read then I won’t go back and read it again.

Just seems like common sense to me.

It’s also not helped by the fact that many of us now carry our distractions with us. My phone has all the distraction capability of a modern PC and if it weren’t for my strict rules about only checking things at certain times I’m sure I’d be in the same distraction hell that everyone else is. Of course even though the platform may be different the same rules apply, it’s the feeling of obligation that drives us to distraction when realistically the obligation doesn’t exist, and we’re just slotting into a social norm that ends up wrecking havoc.

Thus all I’m advocating is taking back control of the technology rather than letting it control us. All of these distractions are tools to be used to our advantage and the second they stop being helpful we need to step back and question our use of them to see if we should change the way we use them. Otherwise we just end up being misused by the tools we wish to use and end up blaming them for the problems we in fact caused ourselves.