• How to manually upload VIVE VR screenshots to Steam

    2021-01-02 | 7 min read

    I was playing Half-Life: Alyx and wanted to take some screenshots. To my surprise, standard F12 screenshot button did nothing, so I had to use the screenshotting functionality from the HTC VIVE software. Annoying enough, screenshots made this way do not end up in Steam Screenshot Uploader, so I’ve spent quite some time till I found how can I add them there manually.

    Steam Screenshot Uploader

    Essentially, the process consists of cropping half of VR screenshots, sorting them by setting their modification timestamp attribute and placing them to the right folder.

    Read more
  • Installing Qt without installer

    2020-12-04 | 14 min read

    At some point (beginning of 2020 year) Qt installer started to require users to have Qt Account (again), otherwise you can’t proceed with the installation. More details in the Qt’s official blog post.

    Qt installer, account

    That’s something that already happened before, but back then community got really mad about it, so The Qt Company reverted that, and installer started to work without Qt Account. And now they fucking did it again, and apparently this time community wasn’t that mad (or there is nothing left of that community after all the stunts The Qt Company has been pulling over the past years).

    Anyway, I won’t tolerate such anal-probing, so The Qt Company (or rather its management) can go fuck itself, and I’ll be just building Qt from sources - it’s not that scary as it sounds.

    Read more
  • Finding optimal 7-Zip parameters for creating a ZIP archive

    2020-11-09 | 2 min read

    We were packing our builds into ZIP archives for distribution right in TeamCity using its built-in artifact packaging. But then we decided to try to do that explicitly with 7-Zip as a dedicated build step, and that turned out to be a faster option, providing a better compression ratio too.

    7-Zip packing

    The only question remaining was finding the right balance between compression level and compression time.

    Read more
  • .NET Core Identity with PostgreSQL

    2020-10-17 | 7 min read

    A couple of years ago I wrote a post about setting up Identity in .NET Core MVC application with MySQL. Now I am starting a new project, and this time I want to try using PostgreSQL.

    .NET Core Identity PostgreSQL

    It is also a good timing to prepare for the upcoming .NET 5, which is about to release next month, so I decided to do it with .NET 5.0 RC2 right away.

    Read more
  • matplotlib animation on Mac OS

    2020-09-05 | 4 min read

    I’ve got a weird problem with one of my Python scripts. It creates a chart with animation, and this animation works fine on Windows and Linux, but on Mac OS it just doesn’t show up. Here’s a video demonstration:

    If video doesn’t play in your browser, you can download it here

    Read more
  • Data compression in IIS, Apache and NGINX

    2020-08-12 | 9 min read

    Some of our users are residing in areas with very slow or/and metered internet connection, so the amount of data transferred is very important to them. And since web servers do support data compression, enabling it can certainly improve the situation for such users.

    Web servers compression

    We took IIS, Apache and NGINX and ran some tests to see how compression is configured in each of them and to compare how well do they do it.

    Read more
  • TeamCity Prometheus metrics in Grafana

    2020-07-14 | 5 min read

    Since we added a Grafana instance to our infrastructure, we started visualizing absolutely every single thing with it. So no wonder that eventually we turned our eyes to TeamCity.

    TeamCity metrics in Grafana

    In 2019.2 release TeamCity started exposing its metrics in Prometheus format, and that’s how Grafana can get those, as Prometheus is one of its supported data sources.

    Read more
  • Jupyter Notebook on a subdomain of your website

    2020-05-27 | 10 min read

    Jupyter Notebook is kind of a Python (and some other languages) sandbox, where you can mix text (Markdown) with code blocks and “run” all that in a web-browser. So it’s like running Python interpreter in interactive mode, but more convenient and user-friendly.

    Jupyter Notebook

    So, here’s the plan:

    • install and run a local instance of Jupyter Notebook on Linux server
      • local here means that Jupyter instance itself will be bound to localhost (not available from the internet)
      • also create a systemd service
    • interface it with the internet via NGINX as a reverse proxy
      • using HTTPS, of course, so the existing certificate needs to be extended
    • host it on a subdomain of existing website, so there will be a new DNS record

    Read more
  • Visitors analytics with GoAccess

    2020-05-20 | 7 min read

    Like I already mentioned in my other post about server-side visitors analytics with .NET Core middleware, if you are relying only on Google Analytics, then you are missing a good portion of data about your visitors.

    Recently I discovered one more way to analyze visitors data - by using GoAccess tool (and its nice web-reports):

    GoAccess dashboard

    What’s especially great about this tool is that it analyzes web-server access logs, so it is the most trustworthy and “closest to reality” data about your visitors that you can possibly ever get.

    Read more
  • NuGet and npm packages in Azure DevOps Artifacts for a C++ library

    2020-03-05 | 19 min read

    These days more and more developers are incapable of working with anything else but packages, as manually unpacking a ZIP archive and copying libraries with headers to the right places seems to them an impossible task.

    But apart from said developers, using packages can indeed improve the development experience.

    Azure DevOps packages

    We distribute our C++ based SDK to many other teams, and for quite a some time they were asking us to do it exactly in packages (in particular, with NuGet and npm).

    Read more