Notice: Trying to access array offset on value of type null in /customers/1/2/4/ on line 390 Notice: Trying to access array offset on value of type null in /customers/1/2/4/ on line 337 Notice: Trying to access array offset on value of type null in /customers/1/2/4/ on line 283 Deprecated: Function get_magic_quotes_runtime() is deprecated in /customers/1/2/4/ on line 18 Deprecated: Function get_magic_quotes_gpc() is deprecated in /customers/1/2/4/ on line 23 Other - Mr.Waggel's blog

Javascript human readable byte size function

31 March, 2020

Here is a small function which converts a bytes in to a readable format (B, KB, MB, GB, TB).


const TB = 1000000000000;
const GB = 1000000000;
const MB = 1000000;
const KB = 1000;

function bytesReadable(byteSize, decimals) {
    let unit;
    let i;
    let remainder;

    // Get the whole number, and the remainder for the
    // decimals later on.
    if (byteSize > TB) {
        unit = "TB";
        i = Math.floor(byteSize / TB);
        remainder = byteSize - (i * TB);
    }else if (byteSize > GB) {
        unit = "GB";
        i = Math.floor(byteSize / GB);
        remainder = byteSize - (i * GB);
    }else if (byteSize > MB) {
        unit = "MB";
        i = Math.floor(byteSize / MB);
        remainder = byteSize - (i * MB);

    }else if (byteSize > KB){
        unit = "KB";
        i = Math.floor(byteSize / KB),
            remainder = byteSize - i * KB;
        // Can't go smaller than bytes!
        return i.toString() + " " + unit;

    if (decimals === 0){
        return i.toString() + " " + unit;

    // Now we calculate the eventual missing leading
    // zeroes to pad up if needed.
    let width;
    if (remainder > GB){
        width = 12;
    }else if (remainder > MB){
        width = 9;
    }else if (remainder > KB){
        width = 6;
        width = 3;

    // Fill up leading zeroes if they are missing
    let remainderString = remainder.toString();

    for (let i = remainderString.length; i < width; i++){
        remainderString = "0" + remainderString;

    // Check to prevent unwanted behaviour
    if (decimals > remainderString.length){
        decimals = remainderString.length;

    return i.toString() + "." + remainderString.substr(0, decimals) + " " + unit;


console.log(bytesReadable(425005, 2));
console.log(bytesReadable(8741208, 2));
console.log(bytesReadable(114448910, 2));
console.log(bytesReadable(557891, 2));
console.log(bytesReadable(114710, 2));
console.log(bytesReadable(8933578, 2));
console.log(bytesReadable(5849684981, 2));
console.log(bytesReadable(12033687, 2));
console.log(bytesReadable(742289, 2));
console.log(bytesReadable(678007439, 2));

// Output
425.00 KB
  8.74 MB
114.44 MB
557.89 KB
114.71 KB
  8.93 MB
  5.84 GB
 12.03 MB
742.28 KB
678.00 MB



Inno Setup launch program at user login

24 March, 2020

The official post about this topic hasn't been updated in a long while. So here is a short wizard friendly refresh.

For all users

Creating a startup shortcut to the common start menu Startup folder requires the installer to be run in administrative installation mode, if not done through the wizard add the following line to the Setup block.


Assuming that that the following compiler directives are defined '#MyAppName' and '#MyAppExeName', normally done in the very last step of the script wizard, append the following line to the Icons segment.

Name: "{commonstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

The 'commonstartup' points to

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

For user (installer) only

No administrative installation mode is required here. As before presuming you have the defined directives, in the Icons block.

Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

'userstartup' leads to

C:\Users\__Username__\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

xrandr virtual splitscreen cookbook

17 March, 2020

As of xrandr version 1.5 it has become easy to divide your physical monitors into smaller virtual monitors. This is done with the following commands (without the '' quotation marks), scroll down for examples, explanations and even further down for more information.

xrandr --setmonitor 'vn' 'vw'/'pw'x'vh'/'ph'+'wo'+'ho' 'od'
This commands creates a virtual monitor

vn virtual monitor name
vw virtual monitor width in pixels
pw physical width on monitor in milimeters
vh virtual monitor height in pixels
ph physcical heigt on monitor in milimeters
wo width offset of the virutal monitor
ho height offset of the virtual monitor
od output device, the physical monitor on which the virtual monitor will be projected, specify none if your previous virtual entry is projected on the same monitor

xrandr --fb 'tw'x'th'
This command sets the total resolution of all the screens

tw The total width off all virtual monitors + their width offsets combined
th The total height off all virtual monitors + their height offsets combined

xrandr --delmonitor 'vn'
This command deletes a monitor

vn virtual monitor name

Identify your monitors(s)

Run the command xrandr in your terminal, you should see a list with all your output devices and for connected devices their supported modi. For my system it looks like this (shortened);

$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
DVI-D-1 disconnected (normal left inverted right x axis y axis)
VGA-2 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 476mm x 268mm
VGA-1-1 connected (normal left inverted right x axis y axis)
HDMI-1-1 disconnected (normal left inverted right x axis y axis)
DP-1-1 disconnected (normal left inverted right x axis y axis)
HDMI-1-2 connected (normal left inverted right x axis y axis)

We can see I have three monitors connected on my system, but only one is turned on and displaying, that is VGA-2.
As you may notice it looks like a virtual screen which xrandr created by default, lets look closer.

Linux Mint Xapp missing library package fix

12 March, 2020


Some errors which I encountered during building 'systray' (

Package xapp was not found in the pkg-config search path.
Perhaps you should add the directory containing `xapp.pc'
to the PKG_CONFIG_PATH environment variable
running gcc failed: exit status 1
/usr/bin/ld: cannot find -lxapp
collect2: error: ld returned 1 exit status


Simply install the missing package with

sudo apt-get install libxapp-dev 

Flutter stuck on initializing graddle

30 January, 2019

You probably just installed the whole Flutter by following the getting started guide neatly, and see your build of the test app getting stuck at "Initializing graddle...".

Do note that the first launch of graddle will take some time, even on a good computer and fast internet (for me it was around 20 minutes).

Before you stop and try to rebuild, I suggest you enable verbose building output. (Scroll down) so you see what is actually happening.

Also make sure you have set your system PATH correctly.

Overload CSS `cursor: wait` page wide with jquery

04 December, 2018



You probably want to tell users on your page to wait for something important that is happening in the background. Most likely performing asynchronous page calls, calculations, DOM manipulation etc...

But just like any CSS property, the nested elements override the parent's property. This is troublesome if you have a lot of buttons and custom cursors in your style.

Home ← Older posts