Knowledge Base

Sammlung von Knowledge Base Artikeln

Linux

Linux

tar|tar.gz

tar.gz entpacken

tar -zxvf file.tar.gz

tar entpacken

tar -xvf file.tar

tar packen

tar -cvf output.tar /dirname1 /dirname2 filename1 filename2

Parallele Komprimierung

Befehle
gz tar -czf tarball.tgz files
bz2 tar -cjf tarball.tbz files
xz tar -cJf tarball.txz files
Performance
  gzip bzip2  xz
Single-thread 17.466s 50.004s 3m54.735s
Multi-thread 4.623s 13.818s 1m10.181s
normal  3.78x 3.62x  3.34x

 

Linux

Gnome KeyRing

Git Passwörter in den Gnome Keyring ablegen

sudo apt-get install libgnome-keyring-dev
sudo make --directory=/usr/share/doc/git/contrib/credential/gnome-keyring
git config --global credential.helper /usr/share/doc/git/contrib/credential/gnome-keyring/git-credential-gnome-keyring
Linux

IpTables

Regel erstellen

iptables -A {INPUT/OUTPUT} {firewall-rule}

Port freigeben

iptables -A {INPUT/OUTPUT} -p tcp --dport {PORT} -j ACCEPT
Linux

Nano 4 leerzeichen statt Tab

Folgendes in die ~/.nanorc eintragen

set tabsize 4
set tabstospaces
Linux

UFW

Defaults für Server

ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw enable
Linux

IPv6

Ubuntu eine statische IPv6-Adresse zuweisen

ifconfig <interface> inet6 add <ipv6address>/<prefixlength>
ifconfig <interface> inet6 add <ipv6address>
Linux

Self Extracting Installer

Ziel des Ganzen ist ein Self Extracing Installer, also ein Archiv mit Installationsdateien das als Kopf das Installerskript enthält.

Zuerst ein Script erstellen, das die Logik enthält, hier ein sehr rudimentäres Beispiel:

#!/bin/bash

# Variable für den Installationspfad
INSTALL_LOCATION="/opt/my-userspace-program"

# Marker ab dem das Script endet und der Archivbereich beginnt
ARCHIVE=$(awk '/^__ARCHIVE__/ {print NR + 1; exit 0; }' "${0}")

# Ab marker ausgeben und tar in Zielverzeichnis entpacken
tail -n+${ARCHIVE} "${0}" | tar xpJ -C ${INSTALL_LOCATION}

Im Installer selbst ...

#!/bin/bash

# Installations Logik
echo "Doing some magic ..."

# Script beenden damit die Bash oder der entsprechende Shell-Interpreter nicht das Archiv ausführen ;)
exit 0

# Marker for archive begin 
__ARCHIVE__

DIe Zusammenführung des Archivs und des Installers ist dann ein Kinderspiel. Am besten den Installer aber vorher kopieren ... ein Beispiel:

#!/bin/bash

TARGET_DIR="./dist"
cp installer.src.sh installer.sh

# Archiv packen
tar cJf $TARGET_DIR/installer.tar.xz --directory=src binary1 lib/*

# Archiv an Installer nach Marker anhängen
cat $TARGET_DIR/installer.tar.xz >> $TARGET_DIR/installer.sh

# Archiv entfernen
rm $TARGET_DIR/*.tar.xz

 

MariaDB/MySQL

MariaDB/MySQL

Benutzerverwaltung

Neuen Benutzer anlegen

CREATE USER 'user'@'host' IDENTIFIED BY 'password';

Datenbankrechte zuweisen

GRANT ALL PRIVILEGES ON datenbank.tabelle TO 'user'@'host';

Konten auflisten

SELECT User, Host, Authentication_string FROM mysql.user;

 

ThinkPad

ThinkPad

Fn-Shortcuts

Tastenbeleuchtung

Fn + Spacebar (2 Stufen, 3. mal aus)

Umschalten Fn/Funktionstasten primär

Fn + ESC

JetBrains

JetBrains

Intellij Automatische Anzeige der Inline-Doc beim Hovern

  1. Editor > General > Other > "Show quick documentation on mouse move": 500 (ms)
  2. Editor > General > Code Completion > Parameter Info > "Autopup in ms:" 1000 (ms)
JetBrains

IntelliJ Lombok Unterstützung

  1. File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors > Enable annotation processing
  2. File > Settings > Plugins
  3. Lombok Plugin suchen
  4. Browse repositories...
  5. Lombok Plugin auswählen
  6. Install
  7. Restart IntelliJ
JetBrains

IntelliJ Spring Boot DevTools Hot-Reload

  1. Settings > Build, Execution, Deployment > Compiler > Make Project Automatically
  2. Command Switcher öffnen und Registry... eintippen
  3. IntellIj neustarten

Wichtige Information: Nur Änderungen in Methoden oder Resourcen können geswappt werden

JetBrains

Startup-Tuning Template

[PROGRAMM_HOME]/bin/.vmoptions

-server
-Xms2g
-Xmx2g
-XX:NewRatio=3
-Xss16m
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:ConcGCThreads=4
-XX:ReservedCodeCacheSize=240m
-XX:+AlwaysPreTouch
-XX:+TieredCompilation
-XX:+UseCompressedOops
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false
-ea

Quelle

Spring Boot

Spring Boot

Jackson Mapper LocalDate(Time) serialisieren

Zuerst zu den Maven Dependencies hinzufügen:

<dependency>
	<groupId>com.fasterxml.jackson.datatype</groupId>
	<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>

Entweder Bean anpassen, falls vorhanden:

@Bean
public ObjectMapper objectMapper() {
    return new ObjectMapper()
            .registerModule(new JavaTimeModule())
            .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}

Wichtige Information: Die Konfiguration aus der Spring Boot Config für Jackson wird dann ignoriert, sofern ein Bean erstellt wird.

Oder in der Application-Config:

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS: false

CSS-Snippets

CSS-Snippets

Absolute Zentrierung


your-selector {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate3d(-50%, -50%, 0);
}
CSS-Snippets

Hintergrund über ganze Seite

your-selector {
  background: url({background image url}) no-repeat center center fixed;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
    background-size: cover;
}
CSS-Snippets

"Always bottom"-Footer

html {
  height: 100%;
  box-sizing: border-box;
}

*,
*:before,
*:after {
  box-sizing: inherit;
}

body {
  position: relative;
  margin: 0;
  padding-bottom: 6rem;
  min-height: 100%;
}

footer {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  padding: 1rem;
  background-color: #efefef;
  text-align: center;
}

Vue.js

Vue.js

Vue Model für Komponente nutzen

model: {
    prop: 'propertyName',
    event: 'eventName'
},
props: {
    propName: {
        required: true
    }
}

Einen change kann man dann triggern mit this.$emit("eventName",wert)

C#

C#

Extension für Suche in Collections

Code


public static class GenericFullTextSearchEnumerableExtension
    {
        public static IEnumerable FindTextAtLeastInOneProperty<T, PropertyType>(this IEnumerable source, Predicate predicate)
        {
            var properties = typeof(T).GetProperties().Where(prop => prop.CanRead && prop.PropertyType == typeof(PropertyType)).ToArray();
            return source.Where(item => properties.Any(prop => PropertySatisfiesPredicate(predicate, item, prop)));
        }

        private static bool PropertySatisfiesPredicate<T, PropertyType>(Predicate predicate, T item, System.Reflection.PropertyInfo prop)
        {
            try
            {
                return predicate((PropertyType)prop.GetValue(item));
            }
            catch
            {
                return false;
            }
        }
    }

Beispiel:

list.FindTextAtLeastInOneProperty((string z) => z.ToString().ToLower().Contains("test")).ToList();

Einsatzmöglichkeit

Diese List Extension ermöglicht das dynamische Filtern von Properties nach einem Suchbegriff mit Hilfe von LINQ und Lambdas sowie Reflection und Generics.

JavaScript-Snippets

JavaScript-Snippets

Dynamische Volltextsuche für HTML-Tabellen

Code


$('input[type=search]').keyup(function () {
    var $rows = $('table tbody tr');
    var val = $.trim($(this).val()).replace(/ +/g, ' ').toLowerCase();

    $rows.show().filter(function () {
        var text = $(this).text().replace(/\s+/g, ' ').toLowerCase();
        return !~text.indexOf(val);
    }).hide();
});

Erweiterung

Den Code kann man natürlich noch durch Klassen weiter verfeinern und benutzen. In diesem Beispiel wird nach Werten in allen Spalten von den einzelnen Zeilen gesucht und nicht passende ausgeblendet.

Docker

Docker

Globale Konfiguration

Präambel

Diese Konfiguration bezieht sich auf Ubuntu/Debian.

Die Datei befindet sich unter /etc/default/docker 

Automatische Portfreigaben in iptables verhindern

Dazu folgendes in DOCKER_OPTS ergänzen:

DOCKER_OPTS="--iptables=false"

DNS-Server verändern

DNS ist oft ein Weg um einfach mehr Performance zu erreichen. Hierbei am Besten CloudfFlare DNS verwenden:

DOCKER_OPTS="--dns 1.1.1.1 --dns 1.1.2.2"