Die ultimative .bashrc

Dieses Thema im Forum "Linux OS" wurde erstellt von dizzgo, 09.11.2006.

  1. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Hallo zusammen

    Ein 'gute' .bashrc kann einem die Arbeit - bekannterweise - ganz schön erleichtern. Ich denke die meisten haben sich mittlerweile eine mehr oder weniger clevere .bashrc zusammen gestellt.
    Ich fände es interessant zu sehen wie ihr euch die Arbeit mit Hilfe der .bashrc erleichtert. Ich mag es .bashrcs von andern anzuschauen, man sieht immer wieder neue Ideen.
    Wenn einige ihre exportieren Variablen, gesetzen Aliase, Funktionen usw. posten kann man sich bestimmet eine ziemlich tolle .bashrc zusammenstellen...

    Ich fang mal an (die standards ;))

    Aliase:
    Code:
    # ls aliase
    alias ll='ls -lh'
    alias la='ls -A'
    alias l='ls -lha'
    alias dir='ls -lht | less'
    
    # be faster aliase
    alias cd..='cd ..'
    alias ..='cd ..'
    alias ...='cd ../..'
    alias cls='clear'
    alias h='history'
    alias df='df -h'
    
    
    Vaiablen:
    Code:
    export EDITOR=vim
    export VISUAL=$EDITOR
    export PAGER=less
    export LESS='-iMn'
    
    Funktionen:
    Code:
    # prozesse finden (ps -ef | grep prozess)
    function psgr()
    {
    FIRST=`echo $1 | sed -e 's/^\(.\).*/\1/'`
    REST=`echo $1 | sed -e 's/^.\(.*\)/\1/'`
    ps -ef | grep -v "$0" | grep "[$FIRST]$REST"
    }
    
    Ich freu mich schon auf phantasievollere beiträge ;)

    Gruss
    d22
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. Psyjo

    Psyjo Routinier

    Dabei seit:
    15.11.2005
    Beiträge:
    259
    Zustimmungen:
    0
    Ort:
    Hinter'm Berg
    Da ich immer zu faul bin jedesmal 'emerge' einzutippen hab ich mir das mal gut gekürzt *g*

    Code:
    alias es="eix-sync"
    alias pw="emerge -upND world"
    alias uw="emerge -uqND world && etc-update"
    alias p="emerge -p"
    alias pv="emerge -pv"
    alias qm="emerge -q"
    alias MC="vi /etc/make.conf"
    alias KW="vi /etc/portage/package.keywords"
    
    MfG
     
  4. #3 Bâshgob, 09.11.2006
    Bâshgob

    Bâshgob freies Radikal

    Dabei seit:
    29.07.2004
    Beiträge:
    2.334
    Zustimmungen:
    0
    Ort:
    Hannover
    Code:
    alias cdcopy='/usr/bin/cdrdao copy --device 0,0,0'
    alias md5='/usr/bin/md5sum -c'
    alias jigdo='/usr/local/bin/jigdo-lite'
    export PAGER=most
    
     
  5. #4 Wolfgang, 09.11.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Die Ultimative bashrc wird es wohl nicht geben.
    Jeder hat seine eigenen Shorts und wiederholende Aufgaben.

    Ich benutze Debian Sarge, und habe mir eine sudoerrs eingerichtet.

    Ich fand es z.B. ganz nützlich das Dollarsymbol für meine Perlhacks ohne Shifttaste greifbar zu haben.
    Die Tastatur hat bei mir noch diese für mich unbrauchbare Windows Taste...;)
    Links liegt dann $ rechts @.

    Code:
    if [ -n "$DISPLAY" ]; then
    xmodmap -e 'keycode 115 = dollar';
    xmodmap -e 'keycode 116 = at';
    xmodmap -e "keycode 22=BackSpace";
    fi
    ### apt-get
    alias such='sudo apt-cache search'
    alias inst='sudo apt-get install'
    alias au='sudo apt-get update'
    alias ax='sudo apt-get upgrade'
    alias policy='sudo apt-cache policy'
    alias show='sudo apt-cache show'
    ## tar-handling
    export df_tgz='date +"%a-%d-%m-%Y_%H-%M.tar.gz"'
    export df_tbz='date +"%a-%d-%m-%Y_%H-%M.tar.bz"'
    alias utarz='tar -xzf'
    alias utarb='tar -xjf'
    alias tarz='tar -czf $(whoami)_$df_tgz'
    alias tarb='tar -cjf $(whoami)_$df_tbz'
    ## weblogs
    alias weblog='cat /var/log/apache2/access.log'
    alias webelog='cat /var/log/apache2/error.log'
    ## Meine IP als pppoe user ohne router
    alias IN='sudo ifconfig ppp0|sed -e '\''/inet Adresse/!d;{s/.*se:\([^[:space:]]*\).*/\1/g}'\'''
    ## Timestamp to  date
    alias zeit='/usr/bin/perl -e '\''print scalar localtime $ARGV[0],"\n"'\'''
    ## shutdown 
    runter="sudo /sbin/shutdown -h now"
    ## backup-part mounten als user
    alias mounta13='sudo mount /dev/hda13 /mnt/hda13 -treiserfs -orw,users,exec'
    ....
    
    Dann kommen noch eine Menge persönlicher Funktionen für spezielle Aufgaben.
    Andere Dinge erledige ich über meine fluxbox keys, da werden diverse Scripte gestartet.

    Gruß Wolfgang
     
  6. #5 Goodspeed, 09.11.2006
    Goodspeed

    Goodspeed Foren Gott
    Moderator

    Dabei seit:
    21.04.2004
    Beiträge:
    4.165
    Zustimmungen:
    1
    Ort:
    Dresden
    @Wolfgang:
    Tip: apt-cache funktioniert auch ohne root-Rechte ;)
     
  7. #6 Wolfgang, 09.11.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hehe
    Stimmt.
    Hab ich noch nie probiert, wieder mal mit der Brechstange losgezogen.:D

    Gruß Wolfgang
     
  8. dizzgo

    dizzgo Lernbereite Riesenratte

    Dabei seit:
    04.08.2005
    Beiträge:
    573
    Zustimmungen:
    0
    Ort:
    /ch/sg///
    Das es keine ultimative .bashrc gibt ist mir schon klar ;) Aber ich hab schon jetzt ein paar coole neue Sachen für meine .bashrc gesehen...

    Danke für eure Posts :)

    Gruss
    d22
     
  9. #8 Jabo, 09.11.2006
    Zuletzt bearbeitet: 09.11.2006
    Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    .alias <-> .bashrc

    Ich auch :)

    @Wolfgang, das mit den Windows-Tasten mache ich auch!

    Überhaupt coole Idee der Thread, dizzgo.

    Wo wir übrigens gerade dabei sind, habt ihr interessante Dinge in ".alias" stehen?

    Mir ist zwar klar, daß ich mit meinem Japanisch-Zeugs hier ein Exot bin, aber das hier:
    Code:
    alias JP='LANG=ja_JP.UTF-8 XMODIFIERS="@im=SCIM"'
    
    führt dazu, daß ich mit JP kwrite einen Editor am Start habe, in dem ich mit Skim japanesisch schreiben kann... während außerhalb des Editors "LANG" anders besetzt ist:
    Code:
    jens@trebulon-1:~> echo $LANG
    de_DE@euro
    
    und innerhalb einer Shell (--> JP kterm &)
    Code:
    jens@trebulon-1:~> echo $LANG
    ja_JP.UTF-8
    
    Ist es nicht überhaupt auch interessanter, in ".alias" was einzutragen, solange das in anderen Shells als bash klappt?
     
  10. caba

    caba GESPERRT!

    Dabei seit:
    13.08.2002
    Beiträge:
    351
    Zustimmungen:
    0
    ~/etc/bash/functions
    Code:
    ## various functions
    
    function vman(){
    	/usr/bin/man $* | col -b | /usr/bin/view -c 'set ft=man nomod nolist' -
    }
    
    function makeiso() {
    	local ISO_FILE ISO_VOL_ID SOURCE USAGE
    	USAGE="usage: makeiso ISO_FILE ISO_VOL_ID SOURCE [SOURCE2 SOURCE 3...]"
    	if [ -z "$1" ]; then
    		echo -e "${USAGE}"; return 1
    	fi
    	ISO_FILE="$1"
    	ISO_VOL_ID="$2"
    	shift 2
    	SOURCE="$@"
    	mkisofs -J -r -V "${ISO_VOL_ID}" -o "${ISO_FILE}" ${SOURCE}
    }
    
    function burniso() {
    	local ISO_FILE CDRECORD_ARGS USAGE
    	USAGE="usage: burniso ISO_FILE"
    	if [ -z "$1" ]; then
    		echo -e "${USAGE}"; return 1
    	fi
    	ISO_FILE="$1"
    	CDRECORD_ARGS="-v dev=$CDR_DEVICE speed=$CDR_SPEED driveropts=burnfree -eject"
    	sudo cdrecord ${CDRECORD_ARGS} -data "${ISO_FILE}"
    }
    
    function copycd() {
    	local CD_DEV CDR_DEV CDR_SPEED CDRECORD_ARGS USAGE
    	USAGE="usage: copycd CD_DEV CDR_DEV CDR_SPEED"
    	if [ -z "$1" ]; then
    		echo -e "${USAGE}"; return 1
    	fi
    	CD_DEV="$1"
    	CDR_DEV_ID="$2"
    	CDR_SPEED="$3"
    	CDRECORD_ARGS="-v dev=$CDR_DEV_ID speed=$CDR_SPEED driveropts=burnfree -eject"
    	cdrecord ${CDRECORD_ARGS} -isosize ${CD_DEV}
    }
    
    function ripcd() {
    	while true; do
    		echo "*** ripper:"
    		echo "--- 1: cdda2wav"
    		echo "--- 2: cdparanoia"
    		echo "--- q: none, quit."
    		echo -n "--- use: "
    		read -en 1 use
    		case "${use}" in
    			1)
    				exec sudo cdda2wav -O wav -H -B -P 0
    				;;
    			2)
    				exec sudo cdparanoia -b -d /dev/cdrom
    				;;
    			q)
    				echo "*** have a nice day. EOF"
    				break
    				;;
    			*)
    				echo "!!! wrong answer."
    				;;
    		esac
    	done
    }
    
    function mrproper() {
    	local DIR PATTERN USAGE
    	USAGE="mrproper [DIR]"
    	PATTERN="^.*/(.*(~|\.(bak|tmp|orig|rej|swp))|core|a\.out)$"
    	if [ -z "$1" ]; then
    		DIR="."
    	else
    		DIR="$1"
    	fi
    	echo -n "really clean directory \"$DIR\" RECURSIVELY?: "
    	read yn
    	if [ "$yn" = "y" ]; then
    		find "$DIR" -type f | egrep "$PATTERN" | xargs -i rm -vf "{}"
    	else
    		echo -n "not "
    	fi
    	echo "cleaned."
    }
    
    function colors() {
    	local T FGs FG BG
    	T="gYw" # the test text
    	echo -e "\n                 40m     41m     42m     43m     44m     45m     46m     47m"
    	for FGs in \
    		'    m' '   1m' '  30m' '1;30m' '  31m' '1;31m' '  32m' \
    		'1;32m' '  33m' '1;33m' '  34m' '1;34m' '  35m' '1;35m' \
    		'  36m' '1;36m' '  37m' '1;37m'; do
    		FG=${FGs// /}
    		echo -en " $FGs \033[$FG  $T  "
    		for BG in 40m 41m 42m 43m 44m 45m 46m 47m; do
    			echo -en " \033[$FG\033[$BG  $T  \033[0m"
    		done
    		echo
    	done
    	echo
    }
    
    function f() {
    	local USAGE
    	USAGE="usage: f [PATH] [INAME]\n\nINAME is a case insensitive name-pattern"
    	find ${1:+ "$1"} ${2:+ \-iname "$2"} -print
    }
    
    function mkcd() {
    	local USAGE
    	USAGE="usage: mkcd DIRECTORY"
    	if [ -z "$1" ]; then
    		echo -e "$USAGE"; return 1
    	fi
    	mkdir -p "$1"; cd "$1"
    }
    
    function pfcp() {
    	local USAGE
    	USAGE="usage: pfcp SRC DST"
    	if [ "$#" -lt 2 ]; then
    		echo -e "$USAGE"; return 1
    	fi
    	src="$1"
    	if [ ! -f "${src}" ]; then
    		echo "ERROR: can only copy regular files"; return 1
    	fi
    	src_base="${src##*/}"
    	dst="$2"
    	if [ -d "${dst}" ]; then
    		dst="${dst%*/}/${src_base}"
    	fi
    	pv -W -p -t -e -r -b -s $(du -sb "${src}" | awk '{ print $1 }') < "${src}" >"${dst}"
    	# pipemeter -f "${src}" >"${dst}"
    }
    
    function prompt_elite {
    	local C_GRAY="\[\033[1;30m\]"
    	local C_LIGHT_GRAY="\[\033[0;37m\]"
    	local C_CYAN="\[\033[0;36m\]"
    	local C_LIGHT_CYAN="\[\033[1;36m\]"
    	local C_NONE="\[\033[0m\]"
    	case $TERM in
    		xterm*|rxvt*)
    			local TITLEBAR='\[\033]0;\u@\h:\w\007\]'
    			;;
    		*)
    			local TITLEBAR=""
    			;;
    	esac
    	local temp=$(tty)
    	local GRAD1=${temp:5}
    	PS1="$TITLEBAR$C_GRAY-$C_CYAN-$C_LIGHT_CYAN($C_CYAN\u$C_GRAY@$C_CYAN\h$C_LIGHT_CYAN)$C_CYAN-$C_LIGHT_CYAN($C_CYAN\#$C_GRAY/$C_CYAN$GRAD1$C_LIGHT_CYAN)$C_CYAN-$C_LIGHT_CYAN($C_CYAN\$(date +%H%M)$C_GRAY/$C_CYAN\$(date +%d-%b-%y)$C_LIGHT_CYAN)$C_CYAN-$GRAY-$C_LIGHT_GRAY\n$C_GRAY-$C_CYAN-$C_LIGHT_CYAN($C_CYAN\$$C_GRAY:$C_CYAN\w$C_LIGHT_CYAN)$C_CYAN-$C_GRAY-$C_LIGHT_GRAY "
    	PS2="$LIGHT_CYAN-$CYAN-$GRAY-$C_NONE "
    }
    function remount() {
    	/bin/mount -o remount ${1+"$@"};
    }
    function repeat() {
    	local USAGE COUNT I
    	USAGE="usage: repeat COUNT COMMAND"
    	if [ -z "$1" ] || [ -z "$2" ]; then
    		echo -e "$USAGE"; return 1
    	fi
    	COUNT="$1"
    	shift
    	for I in $(seq 1 "$COUNT"); do
    		eval "$@"
    	done
    }
    function rot13() {
    	if [ $# = 0 ] ; then
    		tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]"
    	else
    		tr "[a-m][n-z][A-M][N-Z]" "[n-z][a-m][N-Z][A-M]" < $1
    	fi
    }
    ## sizeof function for bash-arrays
    function sizeof() {
    	eval echo \${#$1[@]}
    }
    ## returns short pwd (last two directories)
    function spwd() {
    	IFS="/"
    	set $PWD
    	if test $# -le 3 ; then
    		echo "$PWD"
    	else
    		eval echo \"..\${$(($# - 1))}/\${$#}\"
    	fi
    }
    ## returns base pwd (last directory)
    function bpwd() {
    	echo "${PWD##*/}"
    }
    ## shell seq replacement
    function sseq() {
    	local FIRST LAST INCREMENT CMP OP USAGE
    	USAGE="usage: sseq LAST\n   or: sseq FIRST LAST\n   or: sseq FIRST INCREMENT LAST"
    	case "$#" in
    		1) LAST=$1 FIRST=1 INCREMENT=1;;
    		2) LAST=$2 FIRST=$1 INCREMENT=1;;
    		3) LAST=$3 FIRST=$1 INCREMENT=$2;;
    		*) echo -e "$USAGE"; return 1;;
    	esac
    	if [ $FIRST -eq $LAST ]; then return
    	elif [ $FIRST -lt $LAST ]; then CMP="le" OP="+"
    	elif [ $FIRST -gt $LAST ]; then CMP="ge" OP="-"
    	fi
    	while [ $FIRST -$CMP $LAST ]; do
    		echo "$FIRST"
    		FIRST=$(($FIRST $OP $INCREMENT))
    	done
    }
    ## ssh-copy-id clone
    test -x "$(type -p ssh-copy-id)" || {
    	function ssh-copy-id() {
    		local USAGE DST_HOST DST_AUTHKEYS SRC_PUBKEY
    		USAGE="usage: ssh-copy-id [USER@]HOST"
    		if [ -z "$1" ]; then
    			echo -e "$USAGE"; return 1
    		fi
    		DST_HOST="$1"
    		shift
    		SSH_PARAMS="$@"
    		DST_SSHDIR="~/.ssh"
    		DST_SSHAUTHKEYS="${DST_SSHDIR}/authorized_keys2"
    		SRC_SSHPUBKEY="$HOME/.ssh/id_dsa.pub"
    		ssh $DST_HOST $SSH_PARAMS "test -d ${DST_SSHDIR} || mkdir -p ${DST_SSHDIR}; cat >>$DST_SSHAUTHKEYS" <"$SRC_SSHPUBKEY" && {
    			echo "public key $SRC_SSHPUBKEY copied successfully to $DST_HOST:$DST_SSHAUTHKEYS."
    		}
    	}
    }
    function swatch() {
    	local USAGE FILE
    	USAGE="usage: swatch INTERVAL COMMAND"
    	if [ -z "${1}" ] || [ -z "${2}" ]; then
    		echo -e "${USAGE}"; return 1
    	fi
    	while true; do
    		clear
    		echo -e "Every ${1}s: ${2}\t[$(date)]"
    		eval ${2}
    		sleep ${1}
    	done
    }
    function now() {
    	local USAGE DELIMITER FMT
    	USAGE="usage: now ELEMENT [DELIMITER]\n\nELEMENT can be date [d] or time [t]"
    	DELIMITER=""; test -n "$2" && DELIMITER="$2"
    	case "$1" in
    		date|d) FMT="%Y$DELIMITER%m$DELIMITER%d";;
    		time|t) FMT="%H$DELIMITER%M$DELIMITER%S";;
    		*) echo -e "$USAGE"; return 1
    	esac
    	date +$FMT
    }
    function untar() {
    	local USAGE FILE
    	USAGE="usage: untar FILE [FILE 2] ... [FILE n]"
    	if [ -z "$1" ]; then
    		echo -e "$USAGE"; return 1
    	fi
    	for FILE in $*; do
    		tar xvf $FILE
    	done
    }
    function untbz2() {
    	local USAGE FILE
    	USAGE="usage: untbz2 FILE [FILE 2] ... [FILE n]"
    	if [ -z "$1" ]; then
    		echo -e "$USAGE"; return 1
    	fi
    	for FILE in $*; do
    		tar xjvf $FILE
    	done
    }
    
    function untgz() {
    	local USAGE FILE
    	USAGE="usage: untgz FILE [FILE 2] ... [FILE n]"
    	if [ -z "$1" ]; then
    		echo -e "$USAGE"; return 1
    	fi
    	for FILE in $*; do
    		tar xzvf $FILE
    	done
    }
    
    oports () {
        netstat -ant | grep LISTEN
    }
    
    ~/etc/bash/alias
    Code:
    
    alias ls='ls --color=auto'
    alias mc='mc -b'
    alias mcedit='mcedit -b'
    alias vi='vim'
    alias ll='ls -l'
    alias lw='ll | wc -l'
    alias v='vim'
    alias cl="clear"
    alias ..="cd .."
    alias ...="cd ../.."
    alias myip="/sbin/ifconfig | sed 's/\:/ /g' | awk '/P-[tz]-P/ {print \$3}'"
    alias df="pydf"
    alias ducks='du -cks *|sort -rn|head -11'
    
    Wolfgang für IP brauchst auch kein sudo ;)


    Der rest ist eigentlich weniger interessant...
     
  11. Jabo

    Jabo Aufgabe ohne Minister

    Dabei seit:
    12.10.2006
    Beiträge:
    1.322
    Zustimmungen:
    0
    Ort:
    Hamburg
    ... oder doch?

    Das ist so nicht ganz richtig....

    Also, ich kann was draus lernen.
     
  12. caba

    caba GESPERRT!

    Dabei seit:
    13.08.2002
    Beiträge:
    351
    Zustimmungen:
    0
    Sind nur paar exports etc.
    Also nichts mehr wo man viel draus lesen kann

    Ausser eventuell:
    Code:
    export drive=`echo $PWD | awk 'BEGIN {FS="/"} {print $2}'`
     
  13. #12 Wolfgang, 09.11.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Doch, ifconfig braucht bei mir sudo! ;)

    Gruß Wolfgang
     
  14. saiki

    saiki Bratwurstgriller

    Dabei seit:
    18.03.2003
    Beiträge:
    934
    Zustimmungen:
    0
    Ort:
    Sachsen/ Meerane
    eigentlich müsste man so einen thread mal über zsh machen ;)
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Ale-x, 22.04.2007
    Zuletzt bearbeitet: 22.04.2007
    Ale-x

    Ale-x bash lehrling

    Dabei seit:
    13.04.2007
    Beiträge:
    109
    Zustimmungen:
    0
    Ort:
    Osnabrück
    nix besonderes ein paar alias
    kommen aber noch einige dazu mit der zeit
    hab ich gestern angefangen , eine kleine spielerei und noch nicht fertig :)

    heute angefangen sieht dann so aus
    die funktionen sind noch nich ganz fertig
    ###################################
    # amule incoming files.... #
    # [l]s Incoming #
    # [m]ove all files to /downloads #
    # [r]ar unpack and [m]ove #
    # [z]ip unzip and [mo]ve #
    # [a]udio files -> /downloads/musik #
    # [v]ideo files -> /downloads/filme #
    # ack #
    ###################################
    root@jacque: l
    total 0
    [root@jacque ~]#







     
  17. codc

    codc /dev/null

    Dabei seit:
    12.01.2004
    Beiträge:
    607
    Zustimmungen:
    0
    Normalerweise ist /sbin nicht im Suchpfad von $USER aber hat die Rechte
    und braucht kein sudo
     
Thema:

Die ultimative .bashrc

Die Seite wird geladen...

Die ultimative .bashrc - Ähnliche Themen

  1. Ultimative-Umfrage-Mod

    Ultimative-Umfrage-Mod: Hi, wenn der seltene Fall einer Umfrage der Fall ist hat man die Möglichkeit Antworten vorzugeben und die User können dann für eine der Antworten...
  2. Der ultimative Egoshooter?

    Der ultimative Egoshooter?: Hi Leute, ich bin kein großer Zocker. Aber nun möchte ich mir ein unter Linux lauffähiges PC-Game kaufen. Ich steh auf Egoshooter. Mich...
  3. das ultimative rename script

    das ultimative rename script: hallo leute ich weiss, ich hätte vorher googeln sollen, aber es is schon spät und vllt. hat ja einer schon was passendes. andernfalls hoffe...
  4. Der ultimative Schleppi (Software mässig)

    Der ultimative Schleppi (Software mässig): Moins Moins Am Freitag bin ich immer aufgestellt und voller Ideen fürs Weekend :D Ihr nicht auch *g* Auf jedenfall hab ich folgendes vor:...
  5. Die ultimative Frisur

    Die ultimative Frisur: Seht selbst ;) http://www.lachschon.de/slide.php?id=4989