From Jekyll To Pretzel

Jekyll, Pretzel Comments

Some time ago I told that I converted my blog from CommunityServer to Jekyll on Github Pages. However, I was not satisfied with that solution. Running a static site has one drawback: redirects for moved pages.

When you change the structure of a web site, you don't want old links to reference now invalid URLs. That's would be called link rot. Instead, you want that users following a link to an old location are redirected to the new page automatically.

Actually, there are plugins for Jekyll for redirection, the most popular is jekyll-redirect-from. However, what it does is creating an HTML page at the old location with a HTTP-REFRESH meta tag pointing to the new URL.

I don't like this solution because the status code of the HTTP response is 200, indicating that the old URL is still valid. I guess that Google or other search engines pay attention to the HTTP-REFRESH meta tag, but nevertheless it's a bad idea for SEO reasons.

Instead, a correct implementation would return the status code 302, indicating that the page moved permanently. Unfortunately that's not possible generally for static web sites.

That was the main reason I ditched Github Pages. I didn't want to go back to self-hosting on a virtual server, so I decided to move my site to Azure. Additionally I took the chance and replaced the blog engine too.

Not being a Ruby guy, I searched for a similar blog system but written in .NET. There are a few, but the most appearing to me was the Pretzel. Pretzel is an open source blog system, behaving more or less the same as Jekyll. Additionally it supports several extension points, which I as a developer really like.

I'll write about running Pretzel on Azure and different Pretzel extensions I wrote in some future posts.

TL;DR: I wanted to have more control over my website, therefore I moved from Github Pages to Azure, and from Jekyll to Pretzel.

7Zip4Powershell in PowerShell Gallery

7-zip, Powershell Comments

PowerShell Gallery Logo

A few days ago the Preview suffix was removed from PowerShell Gallery. This gallery is a central repository for PowerShell content such as modules and scripts. You can read the public announcement in the Windows PowerShell Blog. You can find instruction how to take advantage of the gallery on its homepage, and more details on the Get Started page.

Until now I published 7Zip4PowerShell, my PowerShell commands to compress and expand files with 7-Zip, as a plain assembly. However, several users asked for a "real" PowerShell module. I took the public release of the PowerShell gallery as an opportunity to accommondate that demand. The 7Zip4PowerShell module is now available in the gallery, and installing it is as simple as invoking

Install-Module -Name 7Zip4Powershell

I'm very happy that the folks at Microsoft created that gallery, because it makes the discovery of interesting modules so much easier.

Saving bandwidth with Zopfli

Zopfli Comments

Today Jeff Atwood published the article Zopfli Optimization: Literally Free Bandwidth, praising the compression algorithm Zopfli. Zopfli was created by Google and published in 2013:

The Zopfli Compression Algorithm is a new open sourced general purpose data compression library that got its name from a Swiss bread recipe. It is an implementation of the Deflate compression algorithm that creates a smaller output size compared to previous techniques. [...]

The output generated by Zopfli is typically 3–8% smaller compared to zlib at maximum compression, and we believe that Zopfli represents the state of the art in Deflate-compatible compression. Zopfli is written in C for portability. It is a compression-only library; existing software can decompress the data. Zopfli is bit-stream compatible with compression used in gzip, Zip, PNG, HTTP requests, and others.

Jeff gave Zopfli a try and got impressive results:

In my testing, Zopfli reliably produces 3 to 8 percent smaller PNG images than even the mighty PNGout, which is an incredible feat.

However, Zopfli has one drawback. Its awesome compression ratio comes with a speed penalty, it's more than 80 times slower than gzip.

Because of its slowness Zopfli is not the best choice for compression at runtime. But where it really shines is when it's used for pre-compressed data. A very good candidate are PNG encoded images. There's even a Zopfli encoder for that purpose, ZopfliPNG.

So because of the proclaimed reduction of the size of PNGs, I gave ZopfliPNG a try. First I measured the current size of all PNG images of my site with this PowerShell command:

PS> gci *.png -Recurse | Measure-Object -Sum Length

Count    : 110
Average  :
Sum      : 4775284
Maximum  :
Minimum  :
Property : Length

That's about 4.6 MiB of PNGs. Than I let ZopfliPNG re-compress all these files:

gci *.png -Recurse | %{ zopflipng.exe -y --lossy_transparent $_.FullName $_.FullName }

A few minutes and 110 files later the command has finished. 56 files have been changed, i.e. ZopfliPNG was able to produce a smaller size for more than half of all images.

The entire size of all PNGs is now this:

PS> gci *.png -Recurse | Measure-Object -Sum Length

Count    : 110
Average  :
Sum      : 3616048
Maximum  :
Minimum  :
Property : Length

So from the former 4.6 MiB it went down to 3.4 MiB, that's a reduction by 26 percent. Quite impressive for just changing the compression algorithm.

My Journey to Pretzel: First Stop Jekyll

Jekyll, Community Server Comments

As described in my previous post, I decided to replace my CommunityServer setup with a static site generator. Being a vivid GitHub user, the first choice was GitHub Pages. GitHub Pages allows you to commit your site to a repository and let GitHub serve it using Jekyll.

I won't go into detail how to setup Jekyll or GitHub Pages. You'll be able to find enough information in the internet. Phil Haack, a much better story teller than me, wrote an article about his migration from SubText to Jekyll. He also gave advice how to preserve all comments with Disqus.

So my first step was to get the data of my existing site out of CommunityServer and into a format that Jekyll understands. Keyvan Nayyeri wrote once an extension for CommunityServer to download the content as a BlogML document (a standarized XML format for storing blog content).

Then I found BlogMLToMarkdown, a command line tool transforming a BlogML document to markdown documents ready to be consumed by Jekyll.

However, I had to tweak that tool for my needs. Amongst others it

  • downloads all images, attachments, and other files hosted on my old site and changes the referencing links,
  • fixes redirects, and
  • exports all (approved) comments to a disqus.wxr, ready to be imported into Disqus.

If you're interested you can see my fork at Github.

After I transformed my blog and tweaked the style (it's based on Hyde), I committed it to a GitHub repository, where it was happily hosted.

However, this setup had some drawbacks, which I will discuss in another post.