ServiceNow – Print/Export a Complex Visual Task Board

ServiceNow has a cool feature called Visual Task Board. It’s an implementation of a Kanban Board and you can read about it here. This makes life so much easier and the Team can pretty much manage the standup / 1:1 meetings. I have such board setup with 7 lanes and several 100 cards. End of the month, I wanted to save the contents of the board to a PDF for posterity. This is where it became a little complicated. The OOTB print function produces an output that wasn’t presentable.

The steps outlined in this document may change with ServiceNow’s implementation in a future release, but you get the idea.

What you need

  • Internet Explorer and it’s Developer Toolbar
  • SnagIt
  • Dual Monitor (for a large Dashboard)
  1. Open Internet Explorer and Navigate to your VTB. Expand it over as many monitors as you need so that you see all the content horizontally. We will work on a fix to get the vertical content in step 2.
  2. Open F12 Developer Tools from the Tools menu or Press F12. Follow these 2 steps to edit the body tag and adjust the height of the div tag as shown below.



3. We now have a window that shows all of the content. Capture the window using SnagIt or any other tool that supports scrolling at this point and capture the page. I then saved it png / pdf formats.

Hope this helps till ServiceNow implements a feature to export this Dashboard in its entirety.


Network Error in Chrome while downloading files

The dev team reported an odd behavior that exhibited only in Chrome. Since MS Excel is a preferred tool to view transactional data for analysis/self-service, we have an Export function within web pages.

Using OpenXMLSDK to stream the data failed with a “Network Error” in chrome. Surprisingly the same functionality worked in Chrome when the website was hosted on IIS 8.5 / .NET 4.5.

I then traced the Request and Response in fiddler. Decoding the response threw the “chunked body did not terminate properly with 0-sized chunk” error. So, I suspected that the Response was being truncated.

Reviewing the .NET code, after writing the memory stream to the HTTP Response object,  we had a Response.Close. It looks like Response.Close drops the last chuck (in IIS prior IIS versions) causing Chrome to throw the network error. It doesn’t explain how Firefox and IE were able to keep the pipe open to receive the last chunk (need to dig into this further using wireshark).

Removed the Response.Close and all good now.

Troubleshooting – Erratic Load Balanced Web Application behavior

Have you ever run into situations where the Customer reports an issue, but the Dev Team is not able to reproduce it. Well, I have had several of these and sometimes one of the Web Server is configured differently than the rest in a Load Balanced environment. Sometimes these behavior also exhibit when we actually deploy a new farm or add new servers to an existing farm.

Recently a customer reported that attachments on a particular customer portal were not being viewable. Sure enough, when we tested this issue initially, it worked for us. We were able to quickly able to use this technique to isolate the server and then add the missing mime type.

The actual issue/behavior can be identified using Fiddler or the Developer Tools. Identifying the server that is causing the erratic user behavior is key to either quickly resolving or removing the server from the farm for offline resolution.

When adding each server to the farm, add a HTTP Response Header that uniquely identifies the server as shown in the screenshot below. Don’t include any sensitive details that might compromise your server.


Shown below is a Network Capture using Firefox / Firebug, but the same steps apply to Fiddler and other Developer Tools. After you have captured enough events to reproduce the issue, sift through the requests to find the offending request, identify the HTTP Response Header and you will be able to locate the server.


Keep in mind that the Developer Tools have limitation to the total number of requests / responses that can be captured without degrading performance. fiddler seems to be a better tool of choice for this particular debugging scenario.

It’s possible to programmatically set the HTTP Response Headers, but that’s a different topic.

Alternate Style Sheets

HTML documents can be themed using Stylesheets as per the W3C Specification. Styles in different files can be grouped together as a single style. This comes in very handy during testing to say the least. Internet Explorer, Firefox and Opera have implemented this. Chrome needs an extension.

<link href="Simple.css" rel="stylesheet" type="text/css" title="Simple">
<link href="Classic.css" rel="alternate stylesheet" type="text/css" title="Classic">
<link href="Casablanca.css" rel="alternate stylesheet" type="text/css" title="Casablanca">

There are 4 pieces for this magic to work.

  • rel Attribute : The value of “stylesheet” denotes the default stylesheet the browser loads. The alternates are identified with “alternate stylesheet”.
  • title : this is mandatory and used to identify and group style sheets. For example, if you are using a bootstrap theme and have stylesheets to override some elements or classes, these can be grouped together using the title. This is how the browser knows to use them as a set.
  • Switching Stylesheets : This is accomplished by using the View | Page Style menu in Firefox and View | Style menu in IE. Firefox does not remember the settings when the page is reloaded, but Internet Explorer seems to remember the preference.screen-shot-2016-10-22-at-7-28-25-pm
  • id : using this property helps locate and change attributes easily.

Yet another alternative is use client side script to dynamically switch out the Stylesheet and also remember the users preference. In order for us to accomplish this via code, there are 2 options.

The first option is to use only the default theme and not use alternate stylesheets. Add an ID property to each link tag and change the href like so,

<link id="cs1" href="Simple.css" rel="stylesheet" type="text/css" title="Simple">

and switch the style using JavaScript like so,

document.getElementById('cs1').setAttribute('href', 'classic.css');

The above technique does not work when using alternate styleheets, because the browser uses the disabled property to enable and disable stylesheets based on the menu selection. So we declare a function as below

function setActiveStyleSheet(title) {
  var i;
  var lnk = document.getElementsByTagName("link");
  for(i=0; i < lnk.length; i++) {
    if(lnk[i].getAttribute("rel").indexOf("style") != -1) {
      if(lnk[i].getAttribute("title") == title) {
			lnk[i].disabled = false;
	  else {
		lnk[i].disabled = true;

and then call it like so


Privacy & Cookies

Several years ago, while waiting to meet my PCP, I saw an interesting catalog with options to order DVD’s to further ones knowledge about various subjects. Curiosity got the best of me and when I came home, googled to learn more and left it there without registering or purchasing any products. Didn’t think about it until a few weeks later, when I was surprised to see a hard copy of the same catalog delivered by mail to my home address. I had used Google Wallet once before and was always signed into my gmail account. I then made the connection that Googling and being signed into the services was not a good idea and started signing out of my gmail account.I assumed that the Service Provider would honor my request to be signed out and not track me. This was up until I started looking into the web traffic between a popular news site (let’s call it and my machine. What started out as a Training session using the browser debugging tools, ended up as an issue with tracking cookie as outlined below.I had signed out of Facebook as usual, while browsing Looking at the http requests, I noticed a harmless call to requesting for an image that was just 1X1 pixel. When made this request to FB, the cookie as shown below was automatically sent with the request to Facebook. also added some additional details about itself to the URL. Parts of this left over cookie from my previous Facebook sign in left a unique value that was able to identify me and associate my browsing pattern @ You can read more about FB Pixels here
latimes-fb-afteraIf I browse while signed into FB, I should then be able to comment on articles etc which is the expected behavior and understand the essence of being tracked. Tracking someone when signed out wasn’t what I was expecting. A single website using cookie to track state has morphed into multiple websites using the same cookie to track a single user.Private BrowsingMost modern browsers support Private Browsing. You have to read though the documentation to see how it is being implemented before going all in. Understand the difference between New Tab’s vs New Window and see what is shared.The major advantage of using InPrivate Browsing with regard to this article is that the Cookies are deleted after you close the window. So, when requesting content from FB for example, may not have the tracking cookie to make the connection as long as they are on 2 different Private Browsing windows. The downside of using private browsing is it makes it very difficult to manage Downloads, remembered content like Autofill and Passwords etc. I am adjusting to find a balance. Setting the Private Browsing mode permanently threw me off for a few days and is an annoyance. Wish there was an easier way to manage this by blocking cookie leeching while letting CDN’s work. . Be cautious when clicking links to read articles on Facebook. Every time, you click those links, you may be associating your FB or Google account with these sources. As long as you consciously make these decisions, it is ok.If you ever want to starting using Private Browsing, don’t FORGET to Save all the Passwords and then delete all your cookies / Browser data before you start.Here is some information on the EU Cookie Law

Bandwidth Leeching –

I was using Web Inspector to checkout how websites were using Facebook cookies for ad-tracking when I stumbled upon the latimes home page using 14-50MB.

I was surprised to see about 900+ http requests go through in 14 seconds with a total of 20MB of bandwidth usage. All for responsiveness and ad-tracking. The page keeps lazy loading content without any interaction.

Bandwidth leeching

I let the page sit there for about a minute and it ended up downloading about 50MB of junk and redirected me to this page to download a Flash Player that I don’t trust, yikes. Do you think this is a responsible design?

Screen Shot 2016-10-01 at 7.53.44 PM.png



I had the opportunity to work with VML (Vector Markup Language) in the mid 2000 using Microsoft’s VML Editor. We then used these prototypes as libraries in ASP. Endless possibilities, but limited browser support. Welcome to the world of SVG (Scalable Vector Graphics) .

Dmitry’s JavaScript Framework to leverage the SVG / VML spec is a piece of art. The examples listed on this page are amazing. Visit the link below to see for yourself.