NanoDano's blog

How to Create Java Runtime Images with jlink

Before Java 9 and Project Jigsaw, you would have to package the entire monolithic Java Runtime Environment (JRE) to distribute your application with an embedded JRE runtime. This took up a lot of space. Now, you can generate your own custom runtime with only the modules you want to keep the size of the final package smaller.

You can think of a runtime image as another name for a Java runtime environment (JRE). When you create a custom runtime, you are generating a new JRE that only includes the modules you want. You can exclude core java modules that you don't need and you can include custom modules that you wrote. They will all be "baked in" to the runtime.

If you are familiar with Python Virtual Environments, it is similar to that. It is a directory that contains an isolated Java environment with only the specific dependencies needed that will not conflict with other isolated runtimes.

After following this guide, you will understand how to use jlink to create runtime images with only the modules you want. You should also know how to add custom modules including third-party modules like JavaFX.

Create custom launcher in Windows for custom file extensions

In Windows, you can associate any custom command with a file extension. For example, if you want Windows to automatically run Java .jar files using the command java -jar. These examples will walk through the steps necessary to do this:

  • Update the PATHEXT environment variable
  • Associate the file extension to a file type
  • Specify a command to run when that file type is executed

This example will focus on using java to run a .jar file, but this example works just as good for any custom application, or creating script runners for Python and Ruby.

Schedule a shutdown in Windows (sleep timer)

I enjoy listening to audio books and sometimes I want to listen a little bit before going to sleep. Audible has a sleep timer built-in to the app, but I wanted my entire computer to shut down.

You can use the built-in shutdown command in Windows to schedule a shutdown. These examples will show how to schedule a shutdown and how to cancel a scheduled shutdown from the command-line.

curl Tutorial

curl ( is an incredibly useful and powerful command-line tool and library. The latest version at the time of this writing is 7.68.0 released January 8, 2020. You can download it from and the source code is available at

It's primary purpose is transferring data over network protocols like HTTP and HTTPS. It supports a large number of other protocols including: FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP. It also supports SSL/TLS encryption, cookies, authentication, and proxies.

You can use it as a command-line tool by calling curl or you can use it as a library inside C, C++, or other applications. We will look at several things in this tutorial including:

  • Basic curl usage for making HTTP requests
  • Downloading files
  • Compiling from source
  • Using curl in a C++ application

Compiling SQLite3 with C++

If you want to write a C++ program that utilizes Sqlite3 you will need to take an extra step in the compile and link process in order to compile Sqlite3 with the C compiler (gcc), and then your C++ program with the C++ compiler (g++) If you try to compile Sqlite3 with g++ it will error.

For this example, I am using g++ and gcc to compile. I tested this in Windows 10 with MinGW64, but it should also work in Linux and Mac.

If you want to learn more about using SQLite3, check out my other tutorials:

Bob Martin's Open Letter to the Linux Foundation

There was recently an incident with the Linux Foundation where a member was booted from the organization following a public Tweet "outing" him as a Trump supporter. The Linux Foundation apparently reviewed this request and deemed the person in question was violating the Linux Foundation code of conduct. This decision was met with controversy. Many people do not understand the decision and believe it was made purely based on his political affiliation and not any action he has taken.

United Airlines Wi-Fi is Limited

Recently I took a nice long 12-hour flight with United Airlines from the US to Tel Aviv, Israel. I was excited when I learned I could purchase wi-fi during the long flight. What would I do to kill the time? Probably the same things I normally waste my time on like browsing Reddit and chatting on Discord.

Well, too bad you can't do either of those because they are blocked. I thought maybe I could get around it by installing OpenVPN from the Google Play Store and connecting to one of my remote servers. Nope, you can't access the Google Play Store either. So I can't install any games or other apps, can't chat, and can't browse Reddit.

I paid almost $30 for wi-fi access and I can't access any of the primary things that I wanted to access on my Android tablet:

  • Reddit
  • Discord
  • Google Play Store

How to Publish Android Apps to Google Play Store

Building Android apps can be really easy to get started with. There is a bit of a hurdle when it comes to jumping from the debug build to a release build because it requires keystores and private keys and app signing. It can be confusing. This guide will walk through all the steps needed to build a release APK that is fit for distribution and can be uploaded to the Google Play Store.

With the knowledge in this guide, you will be able to build signed release APKs that can be distributed and uploaded to the Google Play Store.

This guide assumes you already have an Android app or know how to create one, but only using debug builds. This guide will walk through the process of creating the keystore and signing APKs with self-signed certificates for distribution on the Google Play Store.

If you don't know hot to build Android apps, check out my Android related tutorials and streams:

You can also read up on the official Android Developer Documentation and Android Distribution Guide.

Java Keytool Tutorial

Java has a tool named keytool that lets you do common tasks like

  • Generate RSA keys and self-signed SSL certificates
  • Import and export certificates
  • Print certificate information
  • Generate and sign certificate signing requests

It also stores everything in a secure file that has a master password in addition to specific passwords for each key it stores. You can think of it kind of like a little password protected SQLite database with your keys and certs (though there is no SQL involved).

Arduino Libraries Tutorial

If you have ever written an Arduino sketch or function that you want to re-use or share, creating a library for it is a great idea. In this guide, we will look at creating, importing, and using libraries. We will also look at creating and using examples that come with a library. You wil learn all the basics about managing libraries and even create your own custom library.

This guide will help you understand how to:

  • Create and distribute a Arduino library ZIP
    • With examples that can be opened via File -> Examples menu
    • That can be imported via the Sketch -> Include Library -> Add ZIP Library
  • Create and open sketches that are found with the File -> Sketchbook menu
  • Include libraries in to your sketches