Today i searched for a problem with a docker container. Since there was a problem with the memory usage of the container, I wanted to check it in my Grafana. But unfortunately, the Telegraf plugin showed 0 bytes for each container since months. I founded the solution the the Telegraf GitHub issues. You need to enable memory control groups on Raspberry Pi. To do that, add the following to your
/boot/cmdline.txt to enable this metic:
And after reboot, it works:
With Microsoft Office Word 2013 and newer its possible to create nativly the following bar codes:
- QR (2D QR Code)
- CODE128 (Code 128 linear bar code)
- CODE39 (Code 39 linear bar code)
- JPPOST (Japanese Postal Service Customer barcode)
- EAN8 or EAN13 (EAN – International Article Number worldwide bar code)
- JAN8 or JAN13 (Japanese barcode for product ID’s)
- UPCA|UPCE (US barcode for product ID’s)
- ITF14 (ITF-14 item-tracking barcode for shipping)
- NW7 (NW-7 (CODABAR) serial number bar code )
- CASE ( barcode for tracking USPS mail)
- Create Word 2013 or newer document
- Create empty merge field with [CTRL]+[F9]
- You should see two curly brackets at this point. If not, toggle display merge fields with [ALT]+[F9]. Adding the brackets manually does not work, because Word does not recognize it as a function!
- Insert the
DISPLAYBARCODE-function and the right switches into the merge field (into the two curly brackets):
DISPLAYBARCODE field-argument-1 field-argument-2 [ switches ]
field-argument-1 is a quoted string containing the data (barcode-data) used to generate the barcode symbol
field-argument-2 is a text string containing the type of barcode (barcode-type) that will be generated. Valid are in the list above (case-insensitive).
DISPLAYBARCODE "My n!ce QR code" QR \s 50 \q 3
DISPLAYBARCODE = barcode function
"My n!ce QR code" = barcode data
QR = barcode type
\s 50 = scaling factor in percent. Valid values from 10 to 1000.
\q 3 = error correction level. Valid values (case insensitive) are [L|M|Q|H]
More information, also for the switches, you could find in the Microsoft Docs: [MS-OI29500]: DISPLAYBARCODE.
When you need tools like iotop or tcpdump on you Synology DiskStation or RackStation, you doens’t need to itall it via ipkg. Synology had a build in way to install the tools.
- Connect via SSH to your NAS
sudo synogear install
- Now you could use the tools from the list below
The package “Diagnosis Tool” are now also visible in the package center. You could also uninstall it from here, but a installation from package center is not possible.
Recently I have noticed that the output of the following code shows the month in the wrong language (English instead of German):
$date_now = date('Y-m-d');
echo strftime('%B %Y', strtotime($date_now));
This can be solved by installing the required language in the docker container. Unfortunately there is a bug which prevents that the languages can be easy activated by
locale-gen <lang-code>. So you have to enable them in
/etc/locale.gen first and then generate them with
locale-gen. This code solves the problem:
# install localisation
RUN apt-get update && \
apt-get install -y locales
# enable localisation and generates localisation files
RUN sed -i -e 's/# de_DE ISO-8859-1/de_DE ISO-8859-1/' /etc/locale.gen && \ # to uncomment the lange
sed -i -e 's/# <your lang code from locale.gen>/<your lang code from locale.gen again>/' /etc/locale.gen && \
Or you could install all available languages:
# install localisation
RUN apt-get update && \
apt-get install -y locales locales-all
If you perform a dry run in the container, you must restart Apache for see the changes.
This is my personal note list for preparing a root server. The list is not complete and may contain errors.
- Install OS as usual or use image from Control Panel
- Set/check fixed ip
- Set the “Reverse DNS” entry in Control Panel
- Add local user
usermod -aG sudo <username>
- Set hostname
sudo hostnamectl set-hostname <hostname>
- Edit the /etc/hosts file
- Edit the /etc/cloud/cloud.cfg file if exists (
preserve_hostname: false to true)
- Add pubkey to
- Disable SSH login with password and permit root login in
- Restart SSH Daemon
service sshd restart
- VIM Color open
~/.vimrc and add
- Install docker-cd here
- Install docker-compose here
- Install docker-compose command completion here
- add username to docker group (source)
sudo usermod -aG docker $USER
Logrotate for Docker
- Create Logrotate config file for Docker containers under
/etc/logrotate.d/docker-container with the following content:
- Test it with:
logrotate -fv /etc/logrotate.d/docker-container
Docker Compose aliases
- Create or append to
alias dcl='docker-compose logs -f --tail=200'
alias dce='docker-compose exec'
alias dcb='docker-compose up --build -d'
alias dcu='docker-compose up -d'
alias dcul='docker-compose up -d && docker-compose logs -f --tail=50'
alias dcd='docker-compose down --remove-orphans'
alias dcdu='docker-compose down --remove-orphans && docker-compose up -d'
alias dcdul='docker-compose down --remove-orphans && docker-compose up -d && docker-compose logs -f --tail=50'
alias dcdb='docker-compose down --remove-orphans && docker-compose up --build -d'
alias dcdbl='docker-compose down --remove-orphans && docker-compose up --build -d && docker-compose logs -f --tail=50'
Docker after dist upgrade
- Re-enable repo
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu <replace with lsb_release> stable"
- update the package database with the Docker packages from the newly added repo:
sudo apt-get update
- Make sure you are install from the Docker repo instead of the default Ubuntu repo:
apt-cache policy docker-ce
- upgrade packes
sudo apt-get install docker-ce docker-ce-cli containerd.io
- Update repos and upgrade system
sudo apt-get update
sudo apt-get upgrade
- Install fail2ban with
sudo apt-get install fail2ban
- Create config file
/etc/fail2ban/jail.local and add a jail for the SSH Deamon
enabled = true
port = <ssh port>
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Level your Anycubic i3 MEGA like in this video https://www.youtube.com/watch?v=aQOdlMW-m60, but in this order:
When I tried Fritzing for the first time today, I unfortunately had to notice that two parts are missing. A NodeMCU has already created and released squix78, thanks for that. But unfortunately I could not find a RS232-TTL converter (MAX3232). No problem, then I just create an own part. With this manual this is relatively easy. Unfortunately the part editor did not accept the SVG’s I created with Adobe Illustrator. After a long time of trying I found out that the following export settings are necessary. Important is the number of decimal places:
The final part:
You could download my MAX3232 RS232-to-TTL-Converter Breakout Board here. To use it, drag and drop it into you sketch.
I just wanted to test Fritzing today, but it is not so easy to download the program. On the website it is only possible to download it after a PayPal donation. Unfortunately the binaries are not available on github. Please don’t get me wrong, I don’t have anything against donating for free software, but I don’t like to force this on everyone. At the end, I found something after all:
TL;DR: Sign up for an acccount (or use bugmenot.com) and then you can select “I already paid” and download the binary for you platform. If you like Fritzing, please donate.
The task was simple: two computers (notebooks). One – we call it A – with a working operating system (Xubuntu) and a new one – we call it B – without operating system. This is how I proceeded:
- Create bootable flash drive with in my case Arch-Linux
- In the Arch-Linux boot loader, press [TAB] and add “copytoram” to the boot command to load the squashfs image into ram. I needed this because in this case I only had a flash drive at hand. If you have two, you don’t need this.
- List network devices:
- Assign a IP adress to computer A with:
ip address add <machine A ip adress> dev <ethernet device>
- To identify source disk, list all block devices with:
- Prepare the copy operation (do not execute yet!) with
dd if=/dev/<source block device> bs=32M status=progress | nc <machine B ip adress> <random port number>
- Boot machine B from the same or different flash drive
- Assign different IP adress
- Identify target device
- Prepare the receiving copy operation with
nc -l -p <same port number as A> | dd of=/dev/<destination block device> bs=32M status=progress
- Execute the command on Machine B
- Then execute the command on Machine A
- Wait until the copying process is completed.
- Use at least the Sync command to synchronize corresponding file data in volatile storage and permanent storage
- Restart the machine, you are done
How it works/remarks
dd reads the source drive bit by bit into the normal output stream. The output stream is piped to netcat, which sends it over the network to a receiving netcat process (server with -l). Therefore the server must be started first. The server receives the bits and piped them back to dd, which writes them to the target on machine B.
Maybe this is not the best and/or most efficient way, but transfer speed in my case of 75MB/s (poor performance on screenshots is from a setup with two vm’s) is in IHMO very good for this simple setup.
Thanks to pmenke for his support.
Use the following settings to configure a Fritz!Box – also a LTE version – to connect to a Sophos UTM (v9.7)
- Sophos UTM Settings
- Fritz!Box VPN VPN-Configfile
enabled = yes;
conn_type = conntype_lan;
name = "Sophos IPsec";
always_renew = yes;
reject_not_encrypted = no;
dont_filter_netbios = yes;
localip = 0.0.0.0;
local_virtualip = 0.0.0.0;
remoteip = AAA.BBB.CCC.DDD; // Change to Sophos External IP
remote_virtualip = 0.0.0.0;
fqdn = "my.fqdn.net"; // No change needed. Is ignored from the UTN
ipaddr = "AAA.BBB.CCC.DDD"; // Change
mode = phase1_mode_idp; // Main Mode
phase1ss = "dh14/aes/sha";
keytype = connkeytype_pre_shared;
key = "MySecr3tPassw0rd!"; // has to be changed
cert_do_server_auth = no;
use_nat_t = yes;
use_xauth = no;
use_cfgmode = no;
ipaddr = 192.168.0.1; // change to local network
mask = 255.255.255.0; // change to local subnet
ipaddr = 172.16.0.0; // change to remote network
mask = 255.255.255.0; // change to remote subnet
phase2ss = "esp-aes256-3des-sha/ah-no/comp-lzs-no/pfs";
accesslist = "permit ip any 172.16.0.0 255.255.255.0"; // to remote network
ike_forward_rules = "udp 0.0.0.0:500 0.0.0.0:500",
"udp 0.0.0.0:4500 0.0.0.0:4500";