Output of Zero-forcing equalizer doesn't match theoretical calculations
It seems like there might be something weird going on with that blog, but I only quickly looked. Here is the idea for the ZF equalizer:


Figure out the convolution matrix.


convMatrix = convmtx(h, length(x));

This will be a $9 \times 7$ matrix because the input vector $\mathbf{x}$ is length 7 and the output convolution will be of length $7+3-1=9$. It is not a square matrix but we can still get an inverse by computing the Moore-Penrose inverse (https://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_inverse), which in MATLAB can be done by calling:

invConvMatrix = pinv(convMatrix);. 


Choose your delay. invConvMatrix is a $7 \times 9$ matrix and we are multiplying with an all zero vector except for a single one at some delay $\mathbf{\delta}$. Lets choose the delay to be 5, so we have:
$\mathbf{\delta}=[0, 0, 0, 0, 1, 0, 0, 0, 0]^T$.
Compute the ZF equalizer:


 zfEqualizer = invConvMatrix * d;


Generate the received signal, and generate signal after equalization


 y = conv(h, x);
  z = conv(zfEqualizer, y);

Now lets take a look at the resulting signals, and specifically notice where the equalized signal starts, right at the delay of 5 that we choose earlier. I hope this helps.