VS Offline Installer Cleanup

I’ve been using the VS 2017 Offline installer for a while after reading about it here.  It works pretty well and I’ve dutifully run the layout command many times when VS has had a new update.  After a while though this folder layout grows to a significant size, especially since I also follow the layout approach on the VS preview.

After researching a bit I found the clean argument for Visual Studio setup, which can remove an older catalog.  The list of older catalogs are in the archive sub-folder of the layout folder.

So with a little experimentation, I came up with the Powershell script below.  This took my layout folder usage from 372 GB down to a mere 100 GB total for both VS and VS Preview combined.

# Cleanup.ps1
Function Clear-VSOfflineLayout

Get-ChildItem -Directory $layoutpath\Archive `
| Sort-Object CreationTime `
| ForEach-Object `
$fn = "$layoutpath\Archive\" + $_.Name + "\Catalog.json"
Write-Host $_.CreationTime.ToString() $fn
if (Test-Path $fn -PathType Leaf)
$arg = "--layout $layoutpath --clean " + $fn + " --passive"
Start-Process "$exepath" -ArgumentList $arg -Wait
Write-Host "Catalog already removed: " $fn

To run the script, pass the path of your layout folder and the path to vs_setup.exe to the powershell function

PS D:\layout>. .\cleanup.ps1
PS D:\layout> Clear-VSOfflineLayout -layoutpath "D:\Layout\Vs2017_preview_offline" -exepath "D:\layout\vs_professional_preview.exe"




I decided to update my TypeScript brush plugin for TypeScript 3.0 and also to specify it works with latest WordPress 4.9.8.  The plugin page on WordPress.org is located here – https://wordpress.org/plugins/syntax-highlighter-evolved-typescript/changelog/

Samples (from here and here)

let foo: unknown = 10;

// Since `foo` has type `unknown`, TypeScript
// errors on each of these locations.
new foo();
foo `hello world!`;

function upperCase(x: string) {
return x.toUpperCase();

// TODO (billg): 5 overloads should *probably* be enough for anybody?
function call<T1, T2, T3, T4, R>(fn: (param1: T1, param2: T2, param3: T3, param4: T4) => R, param1: T1, param2: T2, param3: T3, param4: T4): R
function call<T1, T2, T3, R>(fn: (param1: T1, param2: T2, param3: T3) => R, param1: T1, param2: T2, param3: T3): R
function call<T1, T2, R>(fn: (param1: T1, param2: T2) => R, param1: T1, param2: T2): R
function call<T1, R>(fn: (param1: T1) => R, param1: T1): R;
function call<R>(fn: () => R, param1: T1): R;
function call(fn: (...args: any[]) => any, ...args: any[]) {
return fn(...args);

export interface Props { name?: string }
export class Greet extends React.Component<Props> {
render() {
const { name } = this.props;

// Notice the `!` ------v
return <div>Hello ${name!.toUpperCase()}!</div>;
static defaultProps = { name: "world"}

function loudlyGreet(name = "world") {
// Thanks to the default initializer, `name` will always have type `string` internally.
// We don't have to check for `undefined` here.
console.log("HELLO", name.toUpperCase());

// Externally, `name` is optional, and we can potentially pass `undefined` or omit it entirely.

// Some non-TypeScript JSX file

import * as React from "react";
import * as ReactDOM from "react-dom";

export class Greet extends React.Component {
render() {
const { name } = this.props;
return <div>Hello ${name.toUpperCase()}!</div>;

static defaultProps = {
name: "world",

// Notice no `name` attribute was specified!
// vvvvvvvvv
const result = ReactDOM.renderToString(<Greet />);

import * as _foo from "foo";

export async function bar() {
let foo: typeof _foo = await import("foo");

function useKey<T, K extends Extract<keyof T, string>>(obj: T, k: K) {
let propName: string = k;
// ...

Hyper-V encountered an error trying to access object on computer

Just repeating in one spot the two solutions for this problem, since I spent a bit of time being stymied by this on two separate occasions now.  The first thing to try from the command line is:

MOFCOMP %SYSTEMROOT%\System32\WindowsVirtualization.V2.mof

If that doesn’t work, are any of your VM’s non-startable? For example do you have an old VM you didn’t plan to use anymore so you stopped it and deleted the VHD but left the entry?  If so you may encounter the error in the title when trying to add a new VM or similar.  If so delete the entry that is no longer needed.

If that doesn’t work, drop down to powershell and run

Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V

This will disable/remove the Hyper V feature.  Reboot and the re-install with

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

The last solution was required when I switched to a new router on my network, afterward Hyper-V core showed only one NIC (there are two physical on the machine) but everything else ran fine.  Until I tried to add a new VM a few weeks later,  then I got the message at the top.   You will have to setup new virtual switches and reconfigure your VM’s to use them in this case.


Reference : https://serverfault.com/questions/859019/hyper-v-encountered-an-error-trying-to-access-object-on-computer




LG UD4379 control via RS232 using C#

Recently I decided to upgrade my primary home computer monitor.  It had been 10 years since I bought my last monitor, a 24″ DELL, and its predecessor which is a 19″, that served as a secondary was bought a few years before that.   I went for what is one of the larger ones currently on the market, the LG 43UD79 .  This monitor has six inputs, four HDMI, one Display Port, one USB-C.

There are also eight ways you can configure the inputs.

  • Single input uses entire monitor
  • Singe input with PIP in either upper right, upper left, lower right or lower left (4 options total). PIP has a transparency setting to boot.
  • One input top half, one bottom
  • One input left half, one right half
  • Quad mode, with an input in each corner

You also get to choose which input sends sound to the built in speakers.

Taken all together, that is a lot of possibilities.  Furthermore, you can use the joystick at the bottom of the monitor to change inputs/arrangements, or use the remote control.  Now the remote control is useful, but it is still a bit of work.  Switching from a 4 input quad mode, to single input with PIP in the upper right, audio coming from the PIP source?  Lots of keypresses on the remote.

Luckily the LG UD4379 comes with an RS232 port, and I can write code.  So long story short I wrote a small C# program to handle switching from mode to mode.  I call the program from a set of shortcuts in a folder on my desktop, each named by what they do.

Main caveats so far :

  • Sound input can’t be changed via RS232 as far as I can tell, keep the remote handy.
  • Best to have another dedicated monitor to run the program as switching away will make the program inaccessible (you can’t see it).  Wasn’t an issue for me since I made my old main monitor the new secondary, dedicated to the PC that has the program installed.
  • Can’t change PIP transparency via RS232, but at least the monitor seems to remember it.

The code and hardware used can be found here on GitHub

Quad mode

Single input with PIP





Today I was writing a stored procedure and had the need to create a dynamic PIVOT query in T-SQL and put the results in a temporary table. Not being a regular PIVOT user I figured this was a well known and solved issue.

Surprisingly, my first google hits provided no relief. Some posts I found mentioned OPENQUERY or OPENROWSET or using global temp tables. There were posts about dynamic pivots, but the temp table issue was unresolved. sp_executesql opens another session, temp tables created within it fall out of scope, you can’t create the temp table in advance because you don’t know all the columns, etc.

I thought about it for a while and realized the solution, just create the temp table with one column, and then dynamically alter it. A working example is below.

This example will be all temp tables so its easy to run, but a true real world example would have the sales and manufacturer info in persistent tables, primary keys, foreign keys, indexes etc. etc.

First lets create two tables to report on. Most PIVOT examples use some arbitrary piece of data like a name or date text as the column names. Not a fan of this myself. The source of my data will be three simple tables, #Manufacturers, #Years and #Sales

Note: Apparently the T-SQL syntax highlighter I use doesn’t like NVARCHAR(MAX), sp_executesql, or QUOTENAME(), hence the lame coloring for now.

First Manufacturers:

CREATE TABLE #Manufacturers
	ManufacturerID INT PRIMARY KEY,
	Name VARCHAR(128)
INSERT INTO #Manufacturers (ManufacturerID, Name)
VALUES (1,'Dell')
INSERT INTO #Manufacturers (ManufacturerID, Name)
VALUES (2,'Lenovo')
INSERT INTO #Manufacturers (ManufacturerID, Name)

Next #Years. Now Year is actually one of those names that actually works ok as a column name if you are doing a single pivot. 2014 or 2015 as the column name is self explanatory and easy to deal with programatically. However, I will use the #Years table to show how to rename the column header dynamically.

(YearID INT, Description VARCHAR(128))

INSERT INTO #Years (YearID, Description) VALUES (1, '2014')
INSERT INTO #Years (YearID, Description) VALUES (2, '2015')

Finally #Sales. Note the revenue figures, these are semi-made up but I believe to be in the ballpark range. Yes it is a lot of money! Here is our #Sales table

(ManufacturerID INT, YearID INT,Revenue MONEY)

INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,2,59000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,2,46000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,2,111500000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(1,1,55000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(2,1,42000000000)
INSERT INTO #Sales (ManufacturerID, YearID, Revenue) VALUES(3,1,101500000000)

Next we need to build some strings for the columns to be used in our dynamic SQL statements

--get delimited column names for various SQL statements below
	-- column names for pivot
	@PivotColumnName= ISNULL(@PivotColumnName + N',',N'') + QUOTENAME(CONVERT(NVARCHAR(10),YearID)),
	-- column names for insert into temp table
	@TempTableColumnName = ISNULL(@TempTableColumnName + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)),
	-- column names for alteration of temp table
	@AlterTempTable = ISNULL(@AlterTempTable + N',',N'') + QUOTENAME('Y' + CONVERT(NVARCHAR(10),YearID)) + ' MONEY' 

I probably could use a single string rather than three, and do some string replacements in every usage, but I figured the above is the clearest. In this case I prefix the YearID with a ‘Y’.

Next, create our Pivot temp table

	 ManufacturerID INT

-- Thats it! Because the following step will flesh it out.

SET @SQL = 'ALTER TABLE #Pivot ADD ' + @AlterTempTable
EXEC sp_executesql @SQL

Note: If for some reason you did not know any field names in advance, you could create the temp table with a IDENTITY column that you just ignore, like

     IgnoreMe INT IDENTITY(1,1)

Now we can just execute the dynamic PIVOT

--execute the dynamic PIVOT query into the temp table 
SET @SQL =  N'
	INSERT INTO #Pivot (ManufacturerID, ' + @TempTableColumnName + ')
	SELECT ManufacturerID, ' + @PivotColumnName + '
	FROM #Sales S
	  FOR S.YearID IN (' + @PivotColumnName + ')) AS PivotTable'
EXEC sp_executesql @SQL

Now we can return our results like so

SELECT M.Name, P.*
FROM #Manufacturers M
INNER JOIN #Pivot P ON M.ManufacturerID = P.ManufacturerID

This results in

Finally, placing the a leading character in the column name may seem like an unnecessary step, but if you had two dynamic pivots in your stored procedure, say one has CategoryID as the column header and another had RegionID, or another key field in the database as the header, how to tell them apart if you returned as a single joined result? A clash is a possibility if CategoryID=1 exists and you also have RegionID =1. Using a C and R prefix in that case will prevent clashes when joining the temp tables.

ASP.NET Core 1.0

Since my last post the name has been changed to ASP.NET Core 1.0.

Starting over to use the latest & greatest I uninstalled the previous packages in Ubuntu

I then Installed the Debian package from


I downloaded the latest samples from David Fowler


Currently the HelloWeb code isn’t restoring for me (Unable to restore Microsoft.AspNetCore.Server.Kestrel), I assume this is because of as this moment the Ubuntu code isn’t building according to the CLI page above.

Instead, if I use my previous simple console app from here, and change the project.json to

    "version": "1.0.0-*",
    "compilationOptions": {
        "emitEntryPoint": true
    "dependencies": {
        "NETStandard.Library": "1.0.0-*"
    "frameworks": {
        "dnxcore50": { }

And then change to the project directory and restore using the latest bits

dotnet restore -s https://myget.org/f/dotnet-core

It will build and run.

Ubuntu : Recovering from /etc/fstab mistake

I wasted a bit of time on this today, so I decided to post the situation and a fix if it comes up for others.

I am running Ubuntu on a VM in HyperV. I edited the mount entry for a Windows share in /etc/fstab but made a mistake on the password.

Afterward, Ubuntu would not boot all the way though, it would get stuck on the boot screen with the message “Press S to skip mounting or M for manual recovery”. Well there is some issue here because at least in the hyperv machine connection, the M and S keys had no effect [note: key order intentionally reversed in last sentence to avoid unintended SEO 😉 ].

looking for solutions, I came up with some that recommended using fdisk etc. but I think those solutions are dated. The solution for me was:

1) In HyperV settings, Load Ubuntu Desktop ISO into DVD drive, in firmware set to boot first.
2) When the ISO image loads, it will offer an option to try Ubuntu without installing, select this.
3) Once the desktop is loaded, run terminal by pressing Ctrl-Alt-T

4) then run:

sudo gparted

if gparted isn’t installed, run the command

sudo apt-get install gparted

5) Inspect the drives listed in the GUI, just from what I knew about the drive sizes, I was able to determine the OS drive was ‘/dev/sda3’ and the file system type was listed as ‘ext4’

I then mounted this

sudo mount -t ext4 /dev/sda3 /mnt

Afterward I edited the /etc/fstab file, fixed the issue and then rebooted

sudo gedit /mnt/etc/fstab

Also, I added the “nobootwait” and “nofail” options to the fstab entry, and will add to future similar entries, so as not to have this issue again


nofail and nobootwait mount options in fstab prevent boot problems : http://techmonks.net/nofail-and-nobootwait-mount-options-in-fstab-prevent-boot-problems/

Ubuntu : Increasing screen resolution in VM

Quick tip for boosting resolution in a Ubuntu VM in HyperV

from terminal

sudo gedit /etc/default/grub

Edit or add the the assignment to RUB_CMDLINE_LINUX_DEFAULT

RUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920x1080"

I chose 1920×1080 as this is the current maximum that the Hyper-V machine connection will support and it is less than what my monitor supports, change this to a value that makes sense for you.

After saving run:

sudo update-grub

And then reboot your virtual machine

ASP.NET 5 Pre-RC 2 On Linux – Part III

The next step is to try and run a web app.

There are samples under David Fowler’s (ASP.NET team member) github repository.


I downloaded the .zip file, copied it to the Code folder from my previous post and extracted it.

I then switched to the HelloWeb sample folder in terminal

cd ~/Documents/Code/dotnetcli-aspnet5-master/HelloWeb

dotnet restore

(downloads 121 packages)

dotnet run

We get the following error

Screen Shot 2016-01-06 at 12.13.43 AM

So libuv needs to be installed as it is not present

install libuv per instructions

sudo apt-get install make automake libtool curl
curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/src
cd /usr/local/src/libuv-1.4.2
sudo sh autogen.sh
sudo ./configure
sudo make
sudo make install
sudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/
sudo ldconfig

Now we try again and success!

Screen Shot 2016-01-06 at 12.21.54 AM

Note that there looks like is a newer streamlined process for installing on Ubuntu here, but that doesn’t work for me, I reported it.

ASP.NET 5 Pre-RC 2 On Linux – Part II

So now it is time to improve my development experience on this fresh Ubuntu VM. First step is to get a better code editor, and I select Visual Studio Code (VSCode) for the job.

To get VSCode visit:


I downloaded the .zip and then created a new folder under ‘Home’ called ‘Apps’

Using file explorer (Nautilus) I moved the zip from Downloads to Apps and extracted it.


Then per the instructions, I created a link using the command

sudo ln -s ~/Apps/VSCode-linux-x64/Code /usr/local/bin/code

This allows us to start VSCode in the current folder by typing

code . 

in terminal.

Also, to create the UI shortcuts I browsed to the Code executable using Nautilus, right clicked Code, selected ‘make link’ and dragged it to the desktop and rename it to VSCode.


I started code by clicking the shortcut and since it will be commonly used,
I right clicked the icon on Ubuntu’s side toolbar (Launcher) and selected “Lock To Launcher”.

All seemed fine but then I noticed a message in the lower right corner of VSCode, ‘failed to start OmniSharp’. Clicking on that reveals the message


VSCode uses Omnisharp for intellisense so this is a problem.

In the end the solution for me was to install the latest development version of Mono (4.2.1), using the command

sudo apt-get install mono-devel

Just another WordPress site