]]>I recently had some trouble adding my iCloud account to the Windows 10 Email & app accounts. The reason for that: I had 2-factor security enabled on my iCloud account. It is not possibly to directly connect an iCloud account with the account password to Windows 10 if 2-factor authentication is enabled.

There is, however, an easy (and secure) workaround for that: You can create app-specific passwords for exactly this use-case.

First, log in to your Apple ID on the apple homepage at https://appleid.apple.com/account/manage .
Then scroll down to the ‘Security’ section and click on ‘Edit’.
In the ‘App-Specific Passwords’ section click on ‘Generate Password…’.
Then you are prompted to enter a label for this password. I chose ‘Win10 for [ComputerName]’,
after that hit ‘Create’.

An app-specific password will be generated and displayed to you. Copy that password (this is case-sensitive, so take care when typing it), and use that in the Windows ‘Email & app account’ settings app to connect your iCloud account to Windows 10.

You have full control over the app-specific passwords and if you think something is not okay, you can simply go back to the security settings and revoke these app-specific passwords as you see the need.

Important: If you change your primary Apple ID password, all app-specific passwords will be invalidated at once and you need to regenerate new ones for your devices / apps.

]]>https://gingter.org/2018/02/04/connect-2fa-enabled-icloud-account-windows-10/feed/0796How to run the Babun shell in Cmderhttps://gingter.org/2017/07/29/how-to-run-the-babun-shell-in-cmder/
Sat, 29 Jul 2017 14:52:36 +0000https://gingter.org/?p=747I want to show you how you can the Babun shell in Cmder. From my previous blog posts you know I am a fan of Cmder on Windows. It gives me a powerful shell as a replacement of the normal cmd.exe, and it also lets me run Bash and Zsh in the Windows Subsystem for …

From my previous blog posts you know I am a fan of Cmder on Windows. It gives me a powerful shell as a replacement of the normal cmd.exe, and it also lets me run Bash and Zsh in the Windows Subsystem for Linux (WSL).

That said, Cmder does not provide a full featured *nix shell, but an extended Windows cmd prompt. And while Bash (or Zsh) on the WSL provide with an full featured Linux shell, it has some drawbacks as it really IS a Linux environment. For example, when you install certain Node packages in your project like PhantomJS, they will bring the Linux version and executables, and you can’t run them from your normal Windows environment.

Babun is a tool, that can bridge this gap.

What is Babun?

Babun is a package of different other tools. First it brings you Cygwin, which allows you to compile an run Linux programs in your Windows environment. It then brings a real Bash and also Oh-My-Zsh that runs natively on Windows (not on the WSL). And it comes bundled with a lot of different other Linux shell tools.

Install Babun

Installing Babun is extremely easy. Just go to http://babun.github.io/, download the Zip package, unpack it and run the install.bat file. This will install Babun and all dependencies into the folder ~\.babun in your user profile.

That also makes uninstalling Babun very simple: Just make sure that no Babun windows are open. Then delete the .babun folder from your user profile and it is completely gone.

Configure Babun (& install Powerline fonts)

I already mentioned that Babun comes with Oh-My-Zsh, and a lot of you can configure use Powerline fonts. Powerline fonts are fonts that have some additional glyphs in them to display arrows or branch symbols for more information about the environment. This step is optional, but you’ll miss out a lot of themes when you don’t install the Powerline fonts, like this one:

Powerline in action

To install the Powerline fonts go to https://github.com/powerline/fonts, clone the repository and run the install.ps1 powershell script. Then open the Windows fonts settings, search for fonts that have Powerline in their name and select one.

Then open Babun, and enter nano ~/.minttyrc (or use vi, if you know how to exit it again), and enter the following line:Font={font name of your choice, as displayed in the windows setting}. I chose Space Mono, so my line reads Font=Space Mono for Powerline.

Roundup

We learned that Babun is a Cygwin-based shell that enabled you to run Zsh (or also Bash) directly on Windows, without using the Windows Subsystem for Linux.
After installing Babun, we configured it and also made use of the fancy Powerline fonts that offer us much more information about our current folder like the Git branch.
Finally we configured a Cmder task to open Babun (or, in fact, the contained mintty directly) with Zsh in our console emulator.

I like encourage you to try out different powerline fonts (change them in ~/.minttyrc) and also different oh-my-zsh themes (change them in ~/.zshrc), and if you end up with a theme you really like, further customize your environment to your individual needs. A customized environment is just so much more empowering and makes you more efficient and happy with your work.

]]>747English keyboard layout hints for German developershttps://gingter.org/2017/07/28/english-keyboard-layout-hints-german-developers/
Fri, 28 Jul 2017 21:06:01 +0000https://gingter.org/?p=751The German keyboard layout is great. It has everything you need, including all of the umlauts, the ß and also the µ. For programming, however, the German keyboard layout is 💩: The normal braces are on 8 and 9 with shift state, just off by one from the English ones at 9 and 0, but the …

]]>The German keyboard layout is great. It has everything you need, including all of the umlauts, the ß and also the µ. For programming, however, the German keyboard layout is : The normal braces are on 8 and 9 with shift state, just off by one from the English ones at 9 and 0, but the square and curly braces are available only on Alt Gr combos left and right from that. Also the forward and backward slashes are Shift and Alt Gr combos. You can imagine that this slows you down.

So, to be more efficient when writing code, I tried and trained myself to use an English keyboard layout. This is, what I learned.

The keyboard brain rewire, or: why the heck do we Germans have umlauts?

Let’s rewind a few weeks. I have not yet settled on a certain English keyboard layout. I mainly used US English and UK English.

Being a German, I still have to write a lot of German text: Emails, documentation, company chat and so on. Now, the thing with the German language is that you can not only create such wonderful words as Rechtsschutsversicherungsgesellschaften (insurance companies that provide legal protection). We also love our umlauts and the s-z ‘über alle maßen’ (above all things measurable).

Beatiful is schön. Wish is wünschen. And Uber is Über.

Now, we Germans also like things uber-complicated. We can replace the umlaut with the normal letter and adding an e to it (ä => ae). Also, the ß can be replaced by a double s. So while “Wir lieben Doener ueber alle massen” (We love doner kebab above all things measurable) would be technically correct, it just feels and looks wrong.

Mainly in our company chat I always struggled with the missing Umlauts. And the alternatives just look soooo wrong. To make up for that, I also installed the German keyboard layout and Alt-Shifted between the English and the German one whenever I needed the special character sets of one.

I can tell you, my brain really did not get used to that. For one, the QWERTY vs. QWERTZ problem made me go crazy: z and y swapped their places all the time. Also the braces always made me struggle, because they hopped one to the left (or right, depending from where you just came). Besides that, especially the different punctuation made switching the layout completely impracticable. I was struggling with the switching all the time, and almost gave up.

English US-International keyboard layout to the rescue

The great thing is: You can choose from several English keyboard layouts. The most common is obviously the US English one. In Europe, however, you will find a lot of UK ones. Up to that point I went through the US standard and the UK one. There is, however, also the US International layout, which you can add as a keyboard option easily:

US International keyboard layout

And now, as I started trying the US international layout, things started to look better.

The US International layout allows you to combine the best of both worlds. Not only does it allow me to get used to a much better bracket placement. This layout also gives me access to my beloved umlauts.

On the US International keyboard, you can start typing the “, and then, instead of a space to actually see the ” on screen, you type a, e or o. And thërë yöü gö älöng with all the glory of our umlauts. The ß is there when you go Alt-Gr + s. And the US International layout also provides the € sign on Alt-Gr + 5.

Summary

The German keyboard layout is nice, but it totally lacks comfort when writing code. Reaching the brackets is hard, and you struggle with a lot of Alt-Gr combos. A normal English layout is better by far for code, but it lacks the ease of language-specific things like umlauts.

As a German developer, my English keyboard layout of choice is the US International, as it allows for my German umlauts as well as providing me the better layout for programming.

If you want (or need) a cheat sheet highlighting the special features of the US International keyboard layout, have a look at this page, provided by the Washington State University.

]]>751A little design update for my bloghttps://gingter.org/2017/07/25/little-design-update-blog/
Tue, 25 Jul 2017 15:57:05 +0000https://gingter.org/?p=744You may notice it, this blog has got a small design update. The old theme was fine, but it was very… white with just a little bit of black. I decided to look out for another theme that adds a little bit of color, but still focuses on readability and cleanness. After checking out a …

The old theme was fine, but it was very… white with just a little bit of black. I decided to look out for another theme that adds a little bit of color, but still focuses on readability and cleanness.

After checking out a lot of themes, testing them and navigating around to get a gasp of the overall look & feel of different themes, I found one that pleases me and hopefully you, too: I decided to go with the official WordPress Twenty Seventeen theme and just give the color scheme a little personal touch.

If you are in the mood, please leave some feedback on how you like my new design.

]]>744My conference season 2017https://gingter.org/2017/07/24/conference-season-2017/
Mon, 24 Jul 2017 11:00:29 +0000https://gingter.org/?p=719It is, again, the time of the year where the schedule for the conference season comes together nicely. So, without further adue, these are the conferences I will be giving talks on this year. The conference season 2017 Foren-Tage 2017, Hamburg, Sept. 23rd The Foren-Tage (Forum days) are an event driven by the three big …

]]>719Using VSTS Wildcards for .NET Core projectshttps://gingter.org/2017/07/21/using-vsts-wildcards/
Fri, 21 Jul 2017 11:13:26 +0000https://gingter.org/?p=708On our Thinktecture Research Retreat I had the chance to have a deeper look at the Visual Studio Team System (VSTS), especially in regards to VSTS and its Build / CI System. Right on the first steps with it I ran into an issue with the VSTS wildcards for .NET Core projects. The Issue with …

]]>On our Thinktecture Research Retreat I had the chance to have a deeper look at the Visual Studio Team System (VSTS), especially in regards to VSTS and its Build / CI System. Right on the first steps with it I ran into an issue with the VSTS wildcards for .NET Core projects.

The Issue with VSTS Wildcards

I wanted to build and publish NuGet packages for a .NET Core library project after all unit tests passed. So for the VSTS build I chose the .NET Core template, that comes with the tasks to call the dotnet CLI with restore, build, test and publish the project.

Since I wanted to create and push NuGet packages instead of creating a project with the dotnet publish command I changed the publish task to call dotnet pack instead. The problem with that was that the default project search pattern for the .NET Core CLI commands is **/*.csproj. With that pattern, the build created (and pushed) a NuGet package for all projects. Including my test project, which is something you usually don’t want to do, because who wants to install a test project with NuGet?

Since that pattern seemed like a normal globbing pattern, I tried to simply exclude my test project from that, but sadly the next build did not pick up any of my projects for packing. Since I worked quite a bit with gulp tasks previously and usually know my way around globs, I found that a bit irritating. I tried several different syntaxes, but none of them worked out.

The journey

First I tried to to find some official documentation from Microsoft on the VSTS task wildcards. Sadly I wasn’t able to find one, which was quite discouraging. So I asked Google for some more ideas. In a blog post from Léon Bouqiet he explains the TFS 2015 build task wildcard format. Since VSTS and TFS are very similar (in fact, TFS is a version of VSTS you can install on premises), I hoped this would help.

Update 2017-07-22: I now know why I wasn’t able to find the official documentation during my searches. There is quite a disconnect between the terms used on the VSTS UI (“Projects”, “Paths”, “Wildcards”) and the terms used in the documentation (“File matching patterns reference”). I just didn’t come up with the correct search terms, as they were nowhere on the UI.

Strangely enough, also none of his search patterns worked. The syntax described in his post reminded me a bit of the file patterns used in JetBrains TeamCity server. Since I know my way around TeamCity build configs quite well, I tried multiple variations of each scheme, with and without variables for the full patch. I tried them separated by semi-colons or by new lines, with different orders etc., but none of them yielded the expected result. Every version I tried led to one of two possible results: Either no or all projects were packaged.

At this stage I was quite a bit frustrated. Luckily my boss knows someone who knows someone and so we could direct that question to some people who know quite a bit more about VSTS than what was available on online resources.

Already the first answer that came back was a big hint in the correct direction.

The rabbit hole

This response hinted me to the fact, that the VSTS tasks are open source on GitHub. Which, by the way, is awesomesauce. He linked me to the repository of the .NET Core CLI tasks. There I searched my way through the dependencies of that project where the actual file matching is implemented. Working through the code I found the correct way of how the pattern should look like.

Using VSTS Wildcards for .NET Core projects

First and foremost, there are currently at least two different versions in VSTS for wildcard file matching. The one explained in the aforementioned blog post is the ‘legacy’ version and no longer widely supported. Besides that any task is a custom extension, so it is possible that other tasks use different globbing libraries and bring their own pattern matching variation with them.

To give the answer away, this is the pattern that includes the projects, but excludes all test projects:

*.csproj
!*Tests*.csproj

Despite what other sites may say, for the .NET CLI Tasks the patterns need to be separated by new lines and not be semi-colons. Also, the exclusion operator is the exclamation mark and not the -: operator.

Conclusion

Astonishingly this is a very simple, straightforward pattern. However given previous experience with other globbing syntax and pretty much all online references pointing to the ‘legacy’ patterns that is similar to TeamCity´s this really isn’t the intuitive way.

Getting used to VSTS Wildcards in build tasks, especially for .NET Core projects, takes a bit of time when you are used to other globbing syntaxes. It would have helped a lot when the VSTS UI would have provided a link to the most recent documentation. However, having the source code of the VSTS Wildcards search pattern evaluation in the build tasks at hand is an invaluable resource.

By the way, after I figured all that out another response to our question turned up with a link to the official documentation. That verified my findings were correct. It seems my google foo wasn’t so strong in the first place.

Update 2017-07-22:

The team at Microsoft got in touch with me after this post, which is pretty awesome! Indeed they want to add a link to the official documentation page right from the info box. This will help a lot, because it removes the need to search for help on the patterns in the first place.

]]>708How to: Deep link into an Angular SPA on IIShttps://gingter.org/2017/03/20/deep-link-angular-spa-iis/
Mon, 20 Mar 2017 18:43:23 +0000https://gingter.org/?p=678When you create a single page application (SPA) with Angular (or other SPA-frameworks, for the matter), you might want to leverage the power of the web and allow a deep link directly to a certain route within your application. For most, the easy way is to address routes in your application using the so called …

]]>When you create a single page application (SPA) with Angular (or other SPA-frameworks, for the matter), you might want to leverage the power of the web and allow a deep link directly to a certain route within your application.

For most, the easy way is to address routes in your application using the so called hash location strategy. This means the URL within your app is separated by a hash and will look like this: https://your.domain/app#route/to/component. However, the hash in the URL actually has a different meaning and should position the browser to a specific anchor (or fragment, as it is called in Angular) on the currently shown page.

Fragment in routing links

In the optimal case we mostly would like to use an semantically more correct URL like this https://your.domain/app/route/to/component#fragment.

This, however, brings up a different issue.

Why do we need the # for a deep link in the first place?

Now, why do we need to resort to the hash in the url at all?

The reason is, that the part in front of the hash is treated as the path to the actual page, and the browser will request exactly that. Our example URL would request the file app/route/to/component from the web server, and this will usually be answered with a HTTP 404 (Not found) status code: the web server does not have a file at this location to deliver. In fact, this route only exists within our client-side application, which is not yet available.

For the application to be available, the browser first needs to load the entry point of our SPA (the index.html), then load the required JavaScript and other required resources, start up the application and finally evaluate the URL to show the correct component to the user.

The solution for an easy deep link

The solution to this is actually pretty simple: We tell the web server to deliver the actual application entry point (our index.html) to the web browser.

The first idea is sending a redirect to the index.html file (using HTTP 301 or 302 responses). This would, however, a) require a second round trip and b) actually change the URL in the browser. If we did this, the SPA would not know of the route in the URL anymore, and we would miss our goal.

Instead, we tell our web server to directly deliver the contents of the index.html file instead of a 404.

Configure IIS to make it so

In our case we host the static files of our SPA on an IIS (Internet Information Server). We need to configure our IIS to deliver the index.html whenever it receives a request it cannot serve otherwise.

For this to happen, we install the URL Rewrite 2.0 extension into IIS. Follow the link and download the installer. It will use the Web Platform Installer to download and install the module into IIS.

Create the basic rule

Now, we need to configure the URL rewrite module to do what we want. In IIS Manager, go to the web site where the SPA is served from and double click on URL rewrite.

We want to ‘Add Rule(s)…’ and create a new rule for the redirect. I called mine ‘redirect all requests’, but you can use whatever name you like to.

In the ‘Match URL’ box, we want to redirect to the index.html whenever we hit any URL. So the ‘Requested URL’ should be set to ‘Matches the Pattern’ and we want to use regular expressions. The pattern we want to use is ^(.*)$, which just means: Match anything from the beginning to the end. We also check the ‘Ignore case’ checkbox.

Match URL box

For the moment we skip the ‘Conditions’ and ‘Server Variables’ box and go right to the end to the ‘Action’ box.

We set the ‘Action type’ to ‘Rewrite’ and the ‘Rewrite URL’ to /index.html. We also check the box ‘Append query string’ to preserve the rest of the URL and then check the box ‘Stop processing of subsequent rules’ to prevent the IIS from doing too much work.

Action box

Tweak the rule for real work usage

Now, this configuration will simply rewrite all requests to our web application and will deliver the contents of our ‘index.html’ file every time. This is not what we want though, as the index.html file will reference some other JavaScript files, images, CSS files etc. from our web server, and we should at least deliver these files

For that, we go back to the ‘Conditions’ box.

Conditions box

First, we ‘Add’ a new condition.

The ‘Condition input’ should be set to {REQUEST_FILENAME}, which is a IIS variable and points to the actual requested file. We set the ‘Check if input string’ drop down to ‘Is Not a File’ and save this condition.

File exclusion

This will prevent IIS from rewriting a URL that points to an existing file, which is exactly what we want: Deliver the existing file instead of the index.html.

Exclude certain paths

In my special case I configured a sub-application in my web site to serve the backend API from the folder ‘/api’. So I do not want the IIS to rewrite requests to the ‘/api’ folder, too.

For that, I added another condition rule that says if the ‘Condition input’ {REQUEST_URI} ‘Does Not Match the Pattern’ /api(.*)$ (with ignore case). This will prevent all requests that start with ‘/api’ from being rewritten.

API exclusion

Since I now have multiple rules, I set the ‘Logical grouping’ in the ‘Conditions’ box to ‘Match all’.

Make the rules deployable

We do not want to configure this every time we add a new web site. Also, ISS is a nice player and writes all rules into the ‘web.config’ file. Therefore my use case ended up resulting in this little file of elegant IIS rewrite magic:

Finally we can leverage this to simply make this web.config file a part of our Angular web application. My Angular application uses the angular-cli tooling, and so I just added the ‘web.config’ file to my .angular-cli.json file in the app.assets array.

Conclusion

If you want to deep link into your Angular SPA, you can avoid using the hash location strategy. By configuring your web server to deliver the application entry point file instead of a 404 Not found it is possible to bootstrap your application at any route within your application.

This post shows how to achieve that using the URL rewrite module in IIS, but the same concept applies to other web servers capable of rewriting urls.

]]>652Running Windows 10 Ubuntu Bash in Cmderhttps://gingter.org/2016/11/16/running-windows-10-ubuntu-bash-in-cmder/
https://gingter.org/2016/11/16/running-windows-10-ubuntu-bash-in-cmder/#commentsWed, 16 Nov 2016 12:51:12 +0000https://gingter.org/?p=624“Can you run Bash in Cmder?” – In the comments of my last post (install and run (Oh-my-) zsh on Bash on Ubuntu on Windows), I was asked whether it would be possible to run the Bash (or Zsh) also in Cmder. First I thought it was not possible, but then I got curious. After …

]]>“Can you run Bash in Cmder?” – In the comments of my last post (install and run (Oh-my-) zsh on Bash on Ubuntu on Windows), I was asked whether it would be possible to run the Bash (or Zsh) also in Cmder. First I thought it was not possible, but then I got curious. After digging in a bit more it turned out that it IS, in fact, possible. And it’s not difficult too.

So, since I figured out how it works, I also want to show you how you can run the Windows 10 Ubuntu Bash (and/or Zsh) in Cmder.

What is Cmder?

Cmder is a console emulator for Windows. It is my preferred way to use the Windows console (cmd.exe) for the last years, as it allows me to use *NIX commands like ls, less, grep and the like. For me, Cmder is a much nicer overall experience on the command line in Windows, and it makes me much more productive.

Cmder

Cmder allows me to open multiple tabs and multiple shells at once. I can open a normal cmd.exe shell, a second one that also executed the VsDevCmd.bat file to provide access to msbuild, csc etc., a third one with powershell and, if set up correctly, also one with Bash and/or Zsh.

Prerequisites

Actually, you just need Bash on Ubuntu on Windows enabled and, of course Cmder. If you don’t have that, you can simply follow these instructions:

Set up Bash in Cmder

First, in Cmder, you press Win + Alt + T to open up the settings dialog for Tasks. Alternatively you can open up the hamburger menu on the bottom right of the window and navigate to Settings -> Startup -> Tasks.

Step 1: You create a new Task by clicking on the ‘+‘ Button at the bottom and enter the details.

Steps for setting up Bash in Cmder

Step 2: The first input field of the dialog is the task name. I named it ‘bash::ubuntu‘ but the naming is completely up to you. You can use double colons for grouping, so this would be the ‘Ubuntu‘ task in the ‘Bash‘ group. Cmder already comes with a ‘Bash‘ group containing entries for Bash on mintty (using Cygwin) and another one based on on git-for-windows. To distinguish between the other Bashes and the ‘real’ Ubuntu thing, I simply chose to also opt into this naming scheme.

Step 3: In the “Task parameters” input you can configure an icon (I just picked the Ubuntu Bash icon): /icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"

Step 4: In the “Commands” input field, you enter the command that this task should start. This is the actual call to Bash: %windir%\system32\bash.exe ~ -cur_console:p

This will start bash.exe in the current user directory (~), and also sets the cursor console mode of ConEmu, which works behind the scenes in Cmder, to allow for correct cursor movement with the arrow keys.

This task now will start the Bash on Ubuntu on Windows within Cmder, with all the settings you did in your .bashrc file.

Set up Zsh in Cmder

If you did not set up your Bash to automatically launch Zsh from your .bashrc file like I showed in the other blog post, you can add another task for this.

I called this new task ‘zsh::ubuntu’, but again the naming is up to you. I used the same task parameters as for the Bash task and just added -c zsh to the command entry. This will cause Bash.exe to start Zsh automatically.

]]>https://gingter.org/2016/11/16/running-windows-10-ubuntu-bash-in-cmder/feed/5624How to install and run (Oh-My-) zsh on Windowshttps://gingter.org/2016/08/17/install-and-run-zsh-on-windows/
https://gingter.org/2016/08/17/install-and-run-zsh-on-windows/#commentsWed, 17 Aug 2016 19:43:01 +0000https://gingter.org/?p=607I run zsh on Windows. But why? Some time ago, when I was still using a Mac, one of my colleagues suggested to use zsh instead of bash. Since then I switched to a Surface Book which I happily preferred over OS X mac OS and mainly use cmdr as my shell. Now the Windows …

]]>I run zsh on Windows. But why? Some time ago, when I was still using a Mac, one of my colleagues suggested to use zsh instead of bash.

Since then I switched to a Surface Book which I happily preferred over OS X mac OS and mainly use cmdr as my shell. Now the Windows 10 Anniversary update is out, and it comes with “Bash on Ubuntu on Windows“.

Now, while having bash on my fingertips again, my colleagues’ suggestion came back to my mind, and I tried to use zsh again.

Installation of zsh on Windows

Installation of zsh on Bash on Ubuntu on Windows is as easy as installing it on plain Ubuntu. You start bash and issue the following command:

sudo apt-get install zsh

This will use the default package manager apt of the Ubuntu that runs on the Linux Subsystem on Windows to install the zsh package.

You can directly try it out by simply calling zsh from your shell to open a new zsh from Bash.

Making zsh on Windows your default shell

I wanted zsh to start directly when I open Bash on Ubuntu on Windows, because I am too lazy to always launch it manually. To do so, I added the following little snippet at the very beginning of the ~/.bashrc file:

When Bash starts up, it will check if it has a terminal attached to stdout (the test -t 1 part) and then it executes zsh. You should try it out directly by quitting Bash and restarting Bash on Ubuntu on Windows and see how it launches zsh directly.

Customization

A plain zsh is quite boring, and there are a ton of useful things for zsh to leverage, so customization is key. A well-known repository of zsh customizations with nice defaults is Oh-My-Zsh, and it brings a cornucopia of themes, plugins and features with it. Installation is fairly easy, again. From your freshly installed and started zsh, you just issue the command that is shown at the oh-my-zsh website:

After that, you can configure your plugins (I use git and ubuntu) and themes (I use this custom one).

Update 2016/11/16: Be aware that this theme also requires ‘git’ to be installed to display branch information, so you should do a sudo apt-get install git if you did not already.

Zsh is a bit theme-happy, so you will find more than 100 of them in the default installation. To help a bit, there are some screenshots shown in the zsh wiki. Please be aware that unicode characters in zsh in Bash on Ubuntu on Windows aren’t really supported by now, so some themes may not be for you.

So, after a bit of customization, you can start to enjoy the features of zsh.