Helge Klein

Subscribe to Helge Klein feed
Tools for IT Pros
Updated: 2 hours 37 min ago

Bluetooth Audio Quality & aptX on Windows 10

Tue, 01/15/2019 - 19:43

Bluetooth is a flexible standard. It defines various profiles that operate on top of the Bluetooth networking protocol stack and implement specific services, such as hands-free communications. Bluetooth devices each support a small subset of profiles, typically only one or two, according to their designated function.

Bluetooth headphones and speakers implement the advanced audio distribution profile (A2DP). The A2DP profile transports encoded audio streams from one device to another. To guarantee compatibility between devices, any device implementing the A2DP profile needs to offer a common codec, SBC. However, A2DP supports additional codecs that may increase audio quality or reduce latency compared to SBC. One of those optional codecs is aptX. In this article, I am looking at aptX benefits and I am describing how to get aptX on Windows 10.

What is aptX?

aptX is an alternative codec for the Bluetooth A2DP protocol. It comes in multiple flavors:

  • aptX
  • aptX LL (low latency)
  • aptX HD
Is aptX better than SBC?

Qualcomm, who acquired the aptX company CSR in 2015, claims that aptX offers “superior audio”. Figuring out whether that is actually true is harder than expected. Let’s break this quality question down into two different aspects: fidelity and latency.

Audio Fidelity

As this overview shows, the technical specifications of the base aptX code are similar to that of SBC. Specifically, the maximum bitrate of 352 kb/s is not much higher than SBC’s 320-345 kb/s (SBC depending on implementation).

The bitrate by itself does not tell us anything about a codec’s fidelity, however. Different codecs can be very different in encoding efficiency, as are H.264 and its successor H.265 for video (the latter only needs about half as many bits for the same visual quality). Fidelity can only be determined by double-blind listening tests. Unfortunately, nobody seems to have performed such listening tests in a scientific, reproducible manner (at least I could not find any information). Please let me know by commenting below if you know of any publications.

Another aspect influencing fidelity is that implementations do not always use a codec’s maximum bitrate. SBC, for example, comes with three quality modes, low (201 kb/s), middle (229 kb/s) and high (328 kb/s). Devices may select lower-quality modes to favor a stable connection over sound quality (example: these Sony headphones).

Audio Latency

When watching a video, you do not want the audio to lag behind. In other words: the audio latency should ideally be small enough to not be noticeable. Unfortunately, that is often not the case.

Bluetooth audio introduces significant latency, the exact amount of which depends on the codec as well as its implementations in the sending and receiving devices. Most Bluetooth headphone reviews do not include latency measurements, with the notable exception of rtings.com. They even have a list with latencies for all the headphones they ever tested. Plain aptX seems to be slightly better than SBC, but only aptX LL seems to be good enough to not be noticeable.

While, however, the number of devices supporting base aptX is steadily growing, support for aptX LL is still extremely rare (see rtings.com or bluetoothcheck.com).

Audio Quality Summary

There do not seem to be any objective comparisons between the aptX variants and SBC. From my experience it should be safe to say the following:

  • SBC offers pretty good fidelity at maximum bitrate.
  • aptX might be slightly better than SBC at maximum bitrate.
  • Both SBC and aptX introduce significant latency in the range of 150-200 ms.
  • aptX LL drastically reduces latency but is only supported by a handful of devices.
aptX on Windows 10 OS Support

If Microsoft wanted to hide this piece of information, they could not be doing a better job. A single page on microsoft.com mentions aptX. Apparently, Windows 10 has supported the aptX codec since the first release (1507). According to this Reddit thread, Windows 10 aptX support does not require any drivers in addition to what is part of the OS. I am mentioning that because numerous forum posts state you need to install special drivers. That does not seem to be true.

As for aptX HD or aptX LL (low latency): those codecs do not seem to be supported. If you would like to have them in Windows – especially aptX LL would be great when watching video – make sure to vote for this item in Feedback Hub: please add aptX Low Latency codec support to the Bluetooth A2DP driver.

For a list of supported Bluetooth versions and profiles see this page.

External USB Adapter

The Avantree Audicast is a flexible Bluetooth transmitter that can be connected to a PC (via USB) or a TV (via optical input or headphone jack). The Audicast has several neat features:

  • Support for aptX LL (low latency) in addition to regular aptX and, of course, SBC
  • LEDs indicate which codec is being used
  • Two receiving headphones can be connected
  • Small and light
  • No additional power source except for USB required
  • All cables are included

Please note that when connected to a PC, the Audicast does not work as a generic Bluetooth adapter (in which case the OS drivers would be used). Instead, it registers as a USB audio device. No drivers are required.

Which Codec and Bitrate are Being Used?

Amazingly, Windows does not provide any tool or API for monitoring the codec used by A2DP. Whether it is SBC, aptX or something different – users are left completely in the dark. To help change that and encourage Microsoft to provide more visibility, please vote for please let users see what Bluetooth A2DP codec is used.

For the sake of completeness I sent several hours capturing and analysing ETW logs as indicated at the following source, but none of the generated logs seemed to indicate the A2DP codec being used.

The post Bluetooth Audio Quality & aptX on Windows 10 appeared first on Helge Klein.

Saving & Restoring Total Commander Tab Sets

Mon, 01/07/2019 - 17:18

Total Commander’s custom start menu is a great place to quickly launch all kinds of tools and programs that are otherwise hard to get to. However, TC’s start menu is not limited to external tools. It can be used to run internal TC commands, too. In this article, I am using that capability to build a simple solution for saving and restoring sets of Total Commander tabs to and from files.

Why Save and Restore Tab Sets?

The most common use case for multiple tab sets I can think of is people working in different environments or on different projects. Being able to switch the tabs needed at customer A for the tabs needed at customers B, C, or D should be very helpful.

End Result

This is what I am going to build:

The Tabs submenu has entries for loading and saving all tabs from/to a file called %COMPUTERNAME%.tab. This is a simple solution designed as a tab backup. It can easily be extended to a solution that loads and saves multiple different tab sets.

Getting There

Click Start > Change Start Menu… to bring up the dialog that configures Total Commander’s start menu. You might or might not already have entries in your start menu. We are not going to touch them in any way. Instead, we are adding a new section with a Tabs submenu. Instructions:

  1. Navigate to the last of your existing start menu entries.
  2. Add an item with a dash (-) as the title. This creates a dividing horizontal line, separating your existing start menu entries from the new tabs functionality.
  3. Add a submenu with the title Tabs.
  4. In the submenu, add two items.
    • Item 1 title: Load from %COMPUTERNAME%.tab
    • Item 1 command: OPENTABS d:\Data\Total Commander\%COMPUTERNAME%.tab
    • Item 2 title: Save to %COMPUTERNAME%.tab
    • Item 2 command: SAVETABS2L d:\Data\Total Commander\%COMPUTERNAME%.tab

The result should look like this:

Please note:

  • The path used in the commands above must not be enclosed quotes even if it contains spaces.
  • As you can see in the examples, environment variables can be used.
  • The path used above, “d:\Data\Total Commander”, should be adjusted as needed.

That’s it – enjoy!

The post Saving & Restoring Total Commander Tab Sets appeared first on Helge Klein.

Upgrading Ubuntu 16.04 to 18.04 & PHP 7.0 to 7.2 for WordPress

Wed, 12/12/2018 - 00:28

This post describes how I upgraded our webserver running WordPress on Apache from Ubuntu 16.04.5 LTS to 18.04.1 LTS. Please see this article for more information on the server’s installation and configuration.


Before you begin, create a checkpoint (snapshot) in Hyper-V Manager. If anything goes wrong, a checkpoint makes it trivially easy to get back to the last working state.

Installing all Available Updates sudo apt-get update sudo apt-get dist-upgrade sudo apt-get autoremove

Reboot and check Apache’s error log:

sudo shutdown -r now tail /var/log/apache2/error.log Upgrading to Ubuntu 18.04.1 sudo do-release-upgrade

During the upgrade process:

  • When asked whether to install the updated version of /etc/sysctl.conf, select “yes”
  • When asked whether to install the updated version of /etc/apache2/apache2.conf, select “no”
  • When asked whether to install the updated version of /etc/logrotate.d/apache2, select “yes”
  • When asked whether to install the updated version of /etc/ssh/sshd_config, select “keep the local version”
  • When asked whether to install the updated version of security.conf, select “no”
18.04 Upgrade Package Changes Packages no Longer Supported
  • ntp
  • tcpd

You may want to uninstall these packages once the upgrade is finished by running the commands:

sudo apt-get remove ntp sudo apt-get remove tcpd sudo apt-get autoremove Removed Packages
  • curl
  • systemd-shim
  • libapache2-modsecurity
Upgrade PHP Package Name Changes

In the upgrade from Ubuntu 16.04 to 18.04 the PHP version is upgraded from 7.0 to 7.2, which is a good thing. What is not so great is that the names of all the PHP packages change from php7.0-* to php7.2-*. Due to that name change, Apache’s PHP configuration is broken after the upgrade and must be fixed manually.

Additionally, the upgrade routine is not clever enough to upgrade any manually installed PHP packages. The 7.0 versions of the following packages are uninstalled instead of replacing them with their 7.2 versions:

  • php7.0-curl
  • php7.0-gd
  • php7.0-json
  • php7.0-mbstring
  • php7.0-mcrypt
  • php7.0-mysql
  • php7.0-opcache
  • php7.0-tidy
  • php7.0-xml
  • php7.0-xmlrpc
  • php7.0-cli
  • php7.0-common
  • php7.0-readline
Migrating from PHP 7.0 to PHP 7.2 Apache Configuration

Enable the PHP 7.2 module:

sudo a2enmod php7.2 sudo service apache2 restart Installing Missing PHP 7.2 Modules sudo apt-get install php7.2-mysql php7.2-curl php7.2-gd php7.2-json php7.2-mbstring php7.2-opcache php7.2-tidy php7.2-xml php7.2-xmlrpc sudo apt-get autoremove sudo service apache2 restart

Note: mcrypt is not available any more with PHP 7.2.

PHP 7.2 Hardening and Optimization

Edit /etc/php/7.2/apache2/php.ini:

Add the following to disable_functions: exec,system,shell_exec,passthrough

Configure PHP’s opcache by setting:

opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=10 opcache.max_accelerated_files=10000

Restart Apache:

sudo service apache2 restart Fixing PHP Errors PHP Warning “Illegal string offset”

Cause: a string variable is used like an array, e.g.:

$var[index] = "value";

Fix it by adding an array check:

// DATE PHP 7.2 compat: added check if $var actually is an array if (is_array ($var)) $var[index] = "value"; Removing Obsolete PHP Directories

Clean up remainders from earlier migrations:

sudo rm -r /etc/php5 sudo rm -r /etc/php/7.0 Adjusting the Logrotate Configuration

Edit /etc/logrotate.d/apache2 so that it says:

rotate 30 dateext Re-enabling the mod_pagespeed Repository

This was disabled during the upgrade.

sudo rm /etc/apt/sources.list.d/mod-pagespeed.list sudo mv /etc/apt/sources.list.d/mod-pagespeed.list.distUpgrade /etc/apt/sources.list.d/mod-pagespeed.list Checking for errors

Check Apache’s error log:

tail /var/log/apache2/error.log

The post Upgrading Ubuntu 16.04 to 18.04 & PHP 7.0 to 7.2 for WordPress appeared first on Helge Klein.

PowerShell Script: Test Chrome, Firefox & IE Browser Performance

Tue, 12/04/2018 - 17:58

There is more than one way to test the performance of web browsers like Chrome, Firefox, or IE, but regardless of how you do it, you need a consistent workload that makes the browsers comparable. Unless you are testing with synthetic benchmarks (which come with a plethora of problems of their own) you need a way to automate browsers opening tabs and loading URLs. This article presents a simple solution to do just that.

Purpose of This Browser Test Script

I have written about various aspects of browser performance and privacy before. For those earlier articles, I manually ran the browsers through a series of tests. This quickly proved to be tedious and error-prone. Obviously, automation is the name of the game.

For this year’s session Web App Performance in a Virtual World which I presented at Citrix Technology Exchange and at community meetups I went ahead and finally automated a large part of the test process, and it paid off immediately. I was able to test more configurations in less time with increased accuracy.

Testing is not enough, of course. You need to measure, too. For that, I have been using our uberAgent user experience and application performance monitoring product. uberAgent measures browser page load duration for all major browsers (which was important here) in addition to providing detailed application usage and performance insights for all installed and running applications – Win32, UWP, Java, App-V, etc.

Tweet source

What the Browser Test Script Does

It is really quite simple. I needed a script that would do the following – mind you, for any number of installed browsers and for a list of URLs supplied through a parameter file:

  • Start the browser
  • Open each URL in a new browser tab, waiting 30 s in between
  • Close the browser (gracefully)
  • Repeat the above three times per browser
Techniques Used in the Browser Test Script

I only rarely use PowerShell, my main development work is in C++. Nevertheless, you might find some of the following interesting.

Starting Applications With Their Name Only

Windows has a functionality for starting applications by name without requiring them to be part of the PATH environment variable. This is as useful as it is rarely known. I explained the mechanics in my article How the App Paths Registry Key Makes Windows Both Faster and Safer. The thing to note in this context is that App Paths entries can be leveraged from PowerShell with the Start-Process cmdlet. I used it in the script to start browsers by providing simple names like “chrome” or “firefox”.

Closing an Application’s Window Gracefully

When you start an application with the Start-Process cmdlet, it returns a process object. This object has an extremely useful method, CloseMainWindow(). It is equivalent to clicking on the “X” in the window’s upper right corner.

The Browser Test Script # # One time setup: # # - Open all sites on the list in all browsers # - Log on the test user UXMetricsGuyA (where applicable) # - Switch the browser window to full screen # - Config per site: # - Accept cookie popups # - Do not accept a site's notifications # - Enable "stay signed in" where applicable # - Config per browser: # - Configure browser startup to not open previous tabs # - Configure start page: "about:blank" # - Do not save passwords in the browser # - Disable browser dialogs: # - asking about not being the default # - asking if you want to close all tabs # # Before each test run: # # - Empty each browser's cache # - Do not delete cookies # - Close all browsers # - Restart the machine # - Log on as test user test01 # - Start a PowerShell console # - Wait five minutes # - Start this script # # # Global variables # # How long to wait between open site commands $waitBetweenSitesS = 30; # How long to wait after a browser's last site before closing its window $waitBeforeBrowserClose = 30; # How long to wait between browsers $waitBetweenBrowsers = 30; # Name of the file containing the sites to open $siteUrlFile = ".\URLs.txt"; # Number of iterations $iterations = 3; # Browsers to start $browsers = @("chrome", "firefox", "iexplore") # # Start of the script # # Read the sites file $sites = Get-Content $siteUrlFile; # Iterations for ($i = 1; $i -le $iterations; $i++) { Write-Host "Iteration: " $i # Browsers foreach ($browser in $browsers) { # Sites $siteCount = 0; foreach ($site in $sites) { $siteCount++; if ($siteCount -eq 1) { if ($browser -eq "chrome" -or $browser -eq "firefox") { # Start the browser with an empty tab because the first page load is currently not captured by uberAgent $process = Start-Process -PassThru $browser "about:blank" } else { # Start the browser with the first site $process = Start-Process -PassThru $browser $site } # Store the browser's main process (the first one started) $browserProcess = $process; # Wait for the window to open while ($process.MainWindowHandle -eq 0) { Start-Sleep 1 } if ($browser -eq "chrome" -or $browser -eq "firefox") { # Open the first site in a new tab Start-Process $browser $site } } elseif ($browser -eq "iexplore") { # Additional IE tabs need to be opened differently, or new windows will be created instead $navOpenInNewTab = 0x800; # Get running Internet Explorer instances $app = New-Object -ComObject shell.application; # Grab the last opened tab $ie = $app.Windows() | Select-Object -Last 1; # Open the site in a new tab $ie.navigate($site, $navOpenInNewTab); # Release the COM objects Remove-Variable ie; Remove-Variable app; } else { # Addition tabs in Chrome/Firefox Start-Process $browser $site } Start-Sleep $waitBetweenSitesS; } Start-Sleep $waitBeforeBrowserClose; # Close the browser $browserProcess.CloseMainWindow(); $browserProcess = $null; Start-Sleep $waitBetweenBrowsers; } } The Script’s URL Input File

The URL input file I used with the script in my 2018 tests looked like this:

https://mail.google.com/mail/u/0/#inbox https://docs.google.com/document/d/1hOc4bdEQ1-KJ5wOsiCt4kVQB-xaHuciQY6Y4X_I7dYA/edit https://www.google.com/maps/ https://twitter.com/ https://onedrive.live.com/edit.aspx?cid=740de493111072ca&page=view&resid=740DE493111072CA!108&parId=740DE493111072CA!106&app=PowerPoint https://outlook.live.com/mail/inbox https://www.dropbox.com/h https://www.nytimes.com/ https://www.nbcnews.com/ https://edition.cnn.com/

The post PowerShell Script: Test Chrome, Firefox & IE Browser Performance appeared first on Helge Klein.

Enabling HTTP/2 in Apache on Ubuntu 18.04

Mon, 11/26/2018 - 02:14

A number of requirements must be met before HTTP/2 can be enabled for a website. This is a compilation of steps I went through to get HTTP/2 working on our Apache web server hosting WordPress sites.

HTTP/2 Requirements Requirement #1: HTTPS

HTTP/2 only works with HTTPS. If you have not switched your site to HTTPS, now is the time to do it. You might be interested in my article Switching a WordPress Site From HTTP to HTTPS.

Requirement #2: Apache 2.4.24

The first version of Apache to support HTTP/2 is 2.4.24. If you are on the LTS branch of Ubuntu, this means you need to upgrade to Ubuntu 18.04. I will describe the upgrade process from 16.04 to 18.04 in another blog post.

Requirement #3: PHP FPM

Short version: if you run PHP in Apache via mod_php, you need to switch to FPM. That is not a bad thing. FPM is newer and faster.

Long version: HTTP/2 is not compatible with Apache’s prefork multi-processing module. However, prefork basically seems to be obsolete so it does not hurt to switch to something more modern, i.e., the event MPM. That, in turn, requires a change in the PHP module from mod_php to php7.x-fpm.

Configuration Changes for HTTP/2 Switching Apache’s PHP Module from MPM Prefork to Event

Run the following commands:

sudo apt-get install php7.2-fpm sudo a2enmod proxy_fcgi sudo a2enconf php7.2-fpm sudo a2dismod php7.2 sudo a2dismod mpm_prefork sudo a2enmod mpm_event sudo service apache2 restart Caveat: W3 Total Cache Shows Apache Modules as Not Detected

W3 Total Cache seems to rely on the function apache_get_modules() to detect Apache modules, which does not work with FPM. According to this support article from Plesk, this issue can be ignored.

Installing and Enabling HTTP/2 in Apache

Enable the module mod_http2:

sudo a2enmod http2 sudo service apache2 restart

Enable the HTTP/2 protocol by adding the following to /etc/apache2/apache2.conf:

Protocols h2 http/1.1 How to Verify that HTTP/2 is Working

Cloudflare put together a comprehensive list of ways you can check a website for HTTP/2 support. The easiest to use are probably Chrome Dev Tools (network view, add the Protocol column) or the online test from KeyCDN.

The post Enabling HTTP/2 in Apache on Ubuntu 18.04 appeared first on Helge Klein.

How to Limit CPU & RAM via the Windows Boot Configuration

Wed, 11/21/2018 - 00:40

Testing the effects of different CPU and memory configurations is easiest when you run the tests on a powerful machine and restrict it to the required number of CPU cores and amount of RAM. Microsoft’s documentation of the relevant command is missing an essential parameter. Here are the commands you need.

Limiting the CPU to N Cores

On an elevated command prompt run:

bcdedit /set {current} numproc NUMBER_OF_CORES

Note: strangely, the numproc parameter is missing from the Microsoft documentation of bcdedit. However, it still works fine on Windows 10 1803.

Limiting the RAM to N MB

On an elevated command prompt run:


This is unnecessarily complicated. Instead of specifying the total RAM you want Windows to see, you specify how much of the installed RAM to remove (in MB).

Removing a Bcdedit Setting

To remove a setting, run the following on an elevated command prompt:

bcdedit /deletevalue {current} SETTING_NAME E.g.: bcdedit /deletevalue {current} numproc

The post How to Limit CPU & RAM via the Windows Boot Configuration appeared first on Helge Klein.

Laudation to E2EVC – Experts to Experts Virtualization Conference

Wed, 10/31/2018 - 22:19

On the eve of my departure for E2EVC Athens I feel it is time for a laudation. Let me explain why.

Athens will be my 22nd E2EVC out of 40 events total. In the past eight years, I attended every single E2EVC event in Europe and the US. There is a reason for that, of course. It is certainly not an overabundance of time on my part or even wanderlust. It is simply the fact that E2EVC’s creator, Alex Cooper, has done the most remarkable thing. He single-handedly established the Citrix community in Europe (and helped along the greater end-user community quite a bit). That is a – very – significant achievement.

He single-handedly established the Citrix community in Europe

How did Alex do that? I am not sure how it started (because I was not around at the time). But I know why E2EVC has been by far the best conference for the past eight years: content and community. You could also rephrase it as “knowledge and networking”.

Great speakers almost guarantee great content, which in turn attracts attendees. But that is not all; Alex added a few clever twists. One, the conference is (mostly) on a weekend. This ensures that only the really passionate folks attend. Two, Alex organizes a community night out with food and drinks (often paid for by a sponsor). This brings people together. Three, Alex makes it easy to get a session slot (unlike almost every other conference). Many CTPs and MVPs learned the ropes at E2EVC, including myself.

The result is truly remarkable. I would guess that about 50% of attendees are regulars like myself while the other 50% are newbies or people that “hop on and off the bus”.

Taking a look at the content lined up for the Athens conference, we have sessions about topics and technologies from a broad range of end-user computing, cloud, virtualization and networking topics like the following (a selection):

  • Windows 10 VDI
  • Citrix App Layering automation
  • Windows Server 2019 Software-Defined Datacenter
  • Citrix Cloud on Azure
  • EUC: past, present and future
  • Citrix NetScaler automation
  • Workspace solutions in Azure
  • Web app UX monitoring with uberAgent
  • Containerization with Docker
  • MSIX for Enterprises
  • State of MDM
  • AMD datacenter GPUs for virtualization
  • Microsoft RDMi
  • Graphics acceleration update
  • Amazon AppStream and Amazon WorkSpaces
  • Security for EUC Admins
  • VMware Horizon in AWS
  • RES 2 Ivanti Workspace Manager

In addition to those 45-minute sessions, there are a number of 4-hour masterclasses on topics like:

What else is there to say? That E2EVC moves between cities that are attractive, affordable and easy to reach? That Alex personally operates an airport shuttle for attendees?

I am going to close this article with a big thanks to Alex and his team. Without them, I would not have met so many amazing people, I would not have learned so much, and I would have had far less fun doing so. In short: I would not be where I am today.

The post Laudation to E2EVC – Experts to Experts Virtualization Conference appeared first on Helge Klein.

Splunking the Aspect Ratio Distribution of National Flags

Tue, 10/30/2018 - 21:04

When I tried to align the Union Jack and the flag of Germany on a presentation slide I noticed that I couldn’t – their aspect ratios are different. A quick search led me to this list of aspect ratios of national flags on Wikipedia. Apparently, national flags are far from standardized. A broad range of aspect ratios is being used. I decided to start a little fun project finding out which aspect ratios are most common.

Wikipedia Table to CSV

Wikipedia’s list comes as an HTML table. I would need the data as CSV for any kind of further processing. As it turns out, there is a website for exactly that: Convert Wiki Tables to CSV. You feed it the URL of the Wikipedia page you are interested in and it converts any tables on said page to CSV.

Cleaning up the CSV

Ultimately I wanted to process the CSV data in Splunk because that is the analytics tool I know best. Before I imported the data into Splunk, however, I wanted to clean it up a little. For that, Excel seemed easiest. When you paste CSV into Excel it sadly is not smart enough to offer splitting it into multiple columns. But that is achieved easily enough with the Text to Columns function.

After I had split the comma-separated table fields into columns again, I noticed that the Ratio column had both the fraction and the decimal value, separated by a space, e.g., “2:3 (1.5)”. So I repeated the splitting procedure to move the decimal value into a new column I would then discard along with some other unnecessary columns. I was left with the two columns Country and Ratio.


Once I had saved the resulting data to a new CSV file I turned to Splunk. The easiest way to import a CSV file is the Add Data wizard which guides you through the process. I had the wizard create a new index national_flags for the data I was importing so as to have a dedicated container that would later be easy to identify and ultimately delete.

Once imported, I whipped up a quick SPL search to calculate the percentage of the 10 most common aspect ratios. When you are not totally new to Splunk these kinds of things are almost laughably easy, yet you always have full control over every aspect of the process. Here is what I used:

index=national_flags | top 10 Ratio | stats sum(percent) as Percent by Ratio | sort -Percent Explanation of the Search
Selects all data from the specified index
top 10 Ratio
Selects the 10 most common values of the field Ratio and adds a new field percent to every row
stats sum(percent) as Percent by Ratio
Groups percent (renamed to Percent) by Ratio. This is not strictly necessary but makes the visualization easier.
sort -Percent
Sort by the field Percent (descending)

The only thing left to do was to click Visualization for Splunk to generate the following chart:

Popular Aspect Ratios

Out of the 257 national flags in Wikipedia’s list by far the two most popular aspect ratios are 2:3 (~42%) and 1:2 (~33%). The third most popular aspect ratio, 3:5, is already as low as ~8%.

Data Table

For those interested, below is a table of the aspect ratio distribution. I created it by running the following Splunk search, exporting the results to CSV and converting it to HTML here.

index=national_flags | top 200 Ratio Aspect Ratio Distribution Table Ratio count percent 2:3 107 41.634241 1:2 84 32.684825 3:5 21 8.171206 5:8 6 2.334630 3:4 5 1.945525 10:19 4 1.556420 8:11 3 1.167315 7:10 2 0.778210 5:7 2 0.778210 4:7 2 0.778210 1:1 2 0.778210 ~1.618 1 0.389105 7:11 1 0.389105 6:7 1 0.389105 4:5 1 0.389105 28:37 1 0.389105 22:41 1 0.389105 2.6625:4 1 0.389105 2.338:3.608 1 0.389105 19:36 1 0.389105 18:25 1 0.389105 189:335 1 0.389105 17:26 1 0.389105 16:25 1 0.389105 15:22 1 0.389105 13:15 1 0.389105 11:28 1 0.389105 11:20 1 0.389105 11:18 1 0.389105 0.82 1 0.389105

The post Splunking the Aspect Ratio Distribution of National Flags appeared first on Helge Klein.

Creating an Application Crash Dump

Wed, 10/24/2018 - 09:27
How to Create User Mode Crash Dump Files

If you experience application crashes you may be asked by support to create a crash dump file. Crash dumps are created automatically by Windows if the following registry key is present:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps

In order to help support troubleshoot your problem please do the following:

  1. Create the registry key LocalDumps if it is not present already.
  2. Reproduce the problem (i.e. make the application crash).
  3. Locate the crash dump file in %LOCALAPPDATA%\CrashDumps. Note that if the crashing application runs under the System account, that resolves to C:\Windows\System32\config\systemprofile\AppData\Local\CrashDumps.
  4. Send the crash dump file to support.

This works on all versions of Windows beginning with Vista and Server 2008 (including Windows 7, Windows 10, Server 2016, Server 2019, etc.).

More information: Collecting User-Mode Dumps in Dev Center

The post Creating an Application Crash Dump appeared first on Helge Klein.

Standard Notes: a Note-Taking App with Client-Side Encryption

Thu, 10/11/2018 - 00:26

Note-taking is one of those topics that appear to have been solved long ago, yet offer plenty of opportunity for new contestants. There are multiple reasons for that, but for me the number one is encryption. The major players, Microsoft OneNote, Evernote, and Google Keep, store your thoughts and ideas in plain text on any synchronized device as well as their cloud servers. In the age of hacks, leaks, and exploits it does not take much to conjure up scenarios where those thoughts become public knowledge all of a sudden.

If that creates an uncomfortable feeling: you are not alone. Luckily, others had it before. And at least one of them was a talented software developer. Thus came about Standard Notes. The following is a summary of my experiences with it. But let’s start with a quick recap.

Why Look for an Alternative Note-Taking App? Client-Side, Zero-Knowledge Encryption

I already mentioned this, but it cannot be stressed enough. Client-side means that the encryption happens on the client – unencrypted plain-text never leaves your device. Zero-knowledge means that the app vendor does not have access to the encryption key.

What Else is Missing from OneNote, Evernote and Keep?

Microsoft OneNote used to be a full-fledged member of the Office suite. That stopped with OneNote 2016, which is the last version of the full-capability desktop app Microsoft is going to release. Going forward, only the UWP app available on the Windows Store remains.

Evernote I have never used personally, so I cannot say much about it.

Google Keep is a little too simplistic for more than the simplest of requirements.

Important Standard Notes Features

This is a quick summary of what I believe are the most important features of Standard Notes:

  • Client-side encryption
  • Automatic (encrypted) backups, e.g. to Google Drive. A JavaScript-based decryption tool is saved along with the backup so the content is still accessible even if the vendor has gone out of business. This requires the Extended subscription.
  • 2FA: two-factor authentication via TOTP (e.g. Google Authenticator, Authy). This requires the Extended subscription.
  • Tagging system similar to the labels in Gmail. This is much more efficient for organizing (and finding) notes than a system where a note is stored in a folder hierarchy.
  • Built for longevity
  • Clients are available for all relevant platforms: Windows, macOS, Linux, Web, Android, iOS
What’s Missing from Standard Notes

Currently there are no keyboard shortcuts for navigating the app (the editors do have keyboard shortcuts). Support is planned, though.

Usage Tips for Standard Notes Choose Your Editor Wisely

The free version comes with a plain text editor only. Rich text and Markdown editors are reserved for the Extended subscription.

Once on the Extended subscription, there are several Markdown editors to choose from. The Advanced Markdown Editor partially formats Markdown code in-place and provides easy access to formatting options by way of an icon bar and keyboard shortcuts. Alternatively, if you want to be able to switch between plain Markdown code and a preview of the formatted result try to the Simple Markdown Editor.

The rich text Plus Editor works similar to Gmail. When used in the web app version of Standard Notes, it overrides Chrome’s CTRL+number keyboard shortcuts, though, which can be irritating (instead of navigation to the first tab CTRL+1 now formats the current line as a headline). This is not an issue with the standalone app, of course.

You may want to select your preferred type of editor early on: even though switching between editors is easy, the formatting is not converted between Markdown and rich text.

Useful Extensions

The Folders extension lets you nest tags (create a hierarchy of tags as you can do with Gmail labels). the Quick Tags extension lets you choose from existing tags when adding tags to a note.

Smart Tags

Smart tags create virtual tags that display notes matching certain criteria (documentation). This requires the Folders extension. The following example creates a tag that only lists notes without associated tags:

`!["Untagged", "tags.length", "=", 0]` Sharing Notes Privately

Standard Notes comes with Listed, a publishing service. After installing Listed you will find the menu item Publish to Private Link in the Actions menu. Private publishing basically decrypts your note, uploads it to Listed and publishes it under a cryptic link like https://listed.standardnotes.org/6tGUB6WrPw. It is important to note that private publishing does not give others access to your note directly. Instead, it makes a read-only copy of your note. Therefore, private publishing can be used to share information with anyone who has the link, but it does not allow for collaboration.

Importing to and Exporting from Standard Notes Exporting a Markdown Note as HTML

To export a note formatted in Markdown as HTML (e.g. for reuse in a blog post) switch to the Fancy Markdown editor. It lets you switch to HTML next to the Preview button in the upper right corner.

Exporting a Rich Text Note as HTML

To export a note formatted in rich text as HTML (e.g. for reuse in a blog post), click the code view button in the Plus Editor’s toolbar. You may want to beautify the resulting HTML code with one of the many online HTML beautifiers out there.

Importing Notes from OneNote

If you have been using OneNote before, like me, you would probably like to transfer your existing data over, preferably without losing too much of the formatting.

The bad news: OneNote is not very good at exporting to formats that are useful for migrating to other services. The other bad news: nobody seems to have filled that gap with a script or tool.

Here are some ways I found to get existing content from OneNote to Standard Notes.

OneNote to Standard Notes HTML

This is easy. The downside is that you have to migrate each page individually. Instructions:

  • In OneNote press CTRL+A followed by CTRL+C to copy all the page contents
  • Navigate to Standard Notes
  • Switch the editor to Plus Editor
  • Press CTRL+V to paste the copied page

In my tests, this resulted in a pretty faithful representation of the original OneNote page. Of course, you are limited to page contents Standard Notes supports.

OneNote to Standard Notes Markdown

The following only brings a rough approximation of the original formatting across from OneNote to Standard Notes. If you have a better workflow please let us know in a comment.

  • In OneNote press CTRL+A followed by CTRL+C to copy all the page contents
  • Open Notepad++
  • Select Edit -> Paste Special -> Paste HTML Content
  • Select the text within the body tag and press CTRL+C to copy
  • Navigate to Standard Notes
  • Switch the editor to any markdown editor
  • Press CTRL+V to paste the copied page
The Standard Notes Android App

Standard Notes’ Android app is superbly rated. It is basically the same as the web app with UI adjustments to the smaller mobile device. Everything is synchronized very quickly, including the choice of editor. This makes it impossible to switch to an editor with good preview on mobile while leaving your PC’s app settings unaffectecd.

One thing I do not quite “get” is navigation. When I click a note it opens the note’s configured editor. When I press the Back button, however, I get a Compose screen and need to press Back a second time before I am really back in the list of notes.

Standard Notes Online Demo

A fully-featured demo of Standard Notes is available online.

The post Standard Notes: a Note-Taking App with Client-Side Encryption appeared first on Helge Klein.