#51 17.12.2009 18:07:59

efreak4u
Mitglied

Re: Eure brauchbarsten aliase

Army schrieb:

Kannst auch so machen

ls -a /var/log

wink

dann wechselt er aber nicht in das verzeichnis /var/log , sondern zeigt nur dessen inhalt an...  wink

Offline

#52 17.12.2009 18:40:51

custom
Mitglied

Re: Eure brauchbarsten aliase

Etwas dazugekommen in letzter Zeit.

# Check for an interactive session
[ -z "$PS1" ] && return

# Autologin on tty1, start X-Server
if [ "$(tty)" = "/dev/tty1" ]; then
    startx
#   logout
fi

# Autologin on tty2, start screen-session
if [ "$(tty)" = "/dev/tty2" ]; then
    screen -r 2>&1 >/dev/null || screen
    logout
fi

# Bash completion
if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

# Dont check /var/spool/mail/tom
if [ -n "$MAILCHECK" ]; then
    unset MAILCHECK
fi

# Prompt
PS1error='$(ret=$?; test $ret -gt 0 && echo "\[\e[0;31m\][$ret] \[\e[0m\]")'
PS1="\[\033[0m\]\n\[\033[1;34m\]\u \[\033[0m\]\w\n$PS1error\$ "

# Alias
alias ls='ls --file-type --group-directories-first --color=auto'
alias ll='ls -lhX --file-type --group-directories-first'
alias la='ls -A --file-type --group-directories-first'
alias cd..='cd ..'
alias .='cd ..'alias ..='cd ../..'
alias ...='cd ../../..'
alias xpdf='xpdf >/dev/null 2>&1'
alias antiword='LANG=de_DE antiword'
alias nopaste='curl -F "content=<-" npaste.de'
alias feh='feh -g 1400x1050 -F -d'

# Functions
function mergepdf() {
    if [ ! "$2" ]; then
        echo ":: Not enough input files"
        return 1
    else
        gs -sDEVICE=pdfwrite -sOutputFile=merged.pdf -dBATCH -dNOPAUSE "$@"
        return 0
    fi
}

function proxywww() {
    export http_proxy=http://proxy.cs.fh-nuernberg.de:3128
    w3m "$1" &&
    export http_proxy=
}

function spelltex() {
    LANG=de_DE xterm -fg '#babdb6' -bg '#111111' -e "aspell -d de_DE -t --dont-tex-check-comments --encoding=utf-8 -c $1" &
}

function dos2unix() {
    if [ "$#" -lt "2" ]; then
        echo ":: Not enough input files"
        echo ":: Usage: dos2unix input output"
        return 1
    else
        tr -d '\r' < $1 > $2 && mv $2 $1
        iconv -f ISO-8859-1 -t UTF-8 $1 > $2 && mv $2 $1
    fi
}

function copycd() {
    mkisofs -R -T -V CDROM /dev/sr0 | cdrecord -v speed=8 dev=0,1,0 -
}

function unpack() {
    if [ -f $1 ]; then
        case $1 in
            *.tar.bz2)  tar xjf $1  ;;
            *.tbz2)     tar xjf $1  ;;
            *.tar.gz)   tar xzf $1  ;;
            *.tgz)      tar xzf $1  ;;
            *.tar)      tar xf  $1  ;;
            *.bz2)      bunzip2 $1  ;;
            *.gz)       gunzip  $1  ;;
            *.rar)      unrar e $1  ;;
            *.zip)      unzip   $1  ;;
            *)  echo "'$1' cannot be extracted via unpack()" ;;
        esac
    else
        echo "'$1' is not a valid file"
    fi
}

function biggestProgs() {
    echo "-----+---------+---------------------------"
    echo " POS | SIZE MB |            NAME " 
    echo "-----+---------+---------------------------"
    pacman -Qs | awk '/local/{print substr($3,2)" "substr($1,7)}' | sort -rn | head -$1 | awk '{printf "%4d | %7s | %s\n",NR,$1,$2}'
}

# Exports
PATH=$PATH:/home/tom/bin
VISUAL=/usr/bin/vim
export VISUAL
export PATH
#export OOO_FORCE_DESKTOP=gnome

set show-all-if-ambiguous on

complete -cf su

complete -A directory mkdir rmdir

complete -f -o default -X '*.+(zip|ZIP)'  zip 
complete -f -o default -X '!*.+(zip|ZIP)' unzip
complete -f -o default -X '*.+(gz|GZ)'    gzip
complete -f -o default -X '!*.+(gz|GZ)'   gunzip
complete -f -o default -X '*.+(bz2|BZ2)'  bzip2
complete -f -o default -X '!*.+(bz2|BZ2)' bunzip2

complete -f -o default -X '!*.+(ps|PS)'  gs ghostview ps2pdf
complete -f -o default -X '!*.+(dvi|DVI)' dvips dvipdf xdvi
complete -f -o default -X '!*.+(pdf|PDF)' xpdf ps2pdf

complete -f -o default -X '!*.tex' tex latex pdflatex
# EOF

Beitrag geändert von custom (08.04.2010 22:14:59)

Offline

#53 17.12.2009 19:29:40

danlei
Mitglied

Re: Eure brauchbarsten aliase

Ich erwähne mal nur ein paar, die man nicht so oft sieht (zsh):

# List only directories and symbolic
# links that point to directories
alias lsd='ls -ld *(-/DN)'

# List only files beginning with "."
alias l.='ls -ldh .*'

# cd by ... or .... or mv file ....
alias -g ...='../..'
alias -g ....='../../..'
alias -g .....='../../../..'

# allow + and - for switching between dirs
alias -- +='pushd +0'
alias -- -='pushd -1'
alias -- ++='pushd +1'
alias -- --='pushd -2'
alias -- +++='pushd +2'
alias -- ---='pushd -3'
setopt pushdtohome pushdsilent pushdignoredups autopushd pushdminus

alias e=emacsclient

Beitrag geändert von danlei (17.12.2009 19:38:12)

Offline

#54 17.12.2009 20:40:46

Dirk
Moderator

Re: Eure brauchbarsten aliase

danlei schrieb:

alias -g .....='../../../..'

RU SERIOUS? smile

Offline

#55 17.12.2009 22:14:45

CrAc
Mitglied

Re: Eure brauchbarsten aliase

efreak4u schrieb:
Army schrieb:

Kannst auch so machen

ls -a /var/log

wink

dann wechselt er aber nicht in das verzeichnis /var/log , sondern zeigt nur dessen inhalt an...  wink

Aber dann kann ich mir gleich mit entsprechendem alias, was noch im bau ist, die gesuchte logdatei anzeigen lassen, wenn ich nach /var/log wechsel. Es erleicht allgemein das weitere Arbeiten. (auch wenn ich dafür nicht nach /var/log muss)

und noch die neuen:

alias ebashrc='gedit ~/.bashrc'
alias umntstck='sudo umount /dev/sdc1'
alias umnthandy='sudo umount /dev/sdc'
alias root='sudo -s'

Man, ich liebe bash und die rc smile
Was würde ich nur ohne machen ...

Beitrag geändert von CrAc (17.12.2009 22:19:34)

Offline

#56 17.12.2009 22:26:47

Army
Mitglied

Re: Eure brauchbarsten aliase

CrAc schrieb:
alias umntstck='sudo umount /dev/sdc1'
alias umnthandy='sudo umount /dev/sdc'

Sicher dass das so immer stimmt? Wenn du mal ein anderes Gerät vorher einsteckst, dann ist es halt nimmer sdc1, sondern sdd1 oder so. Bei festen Zuweisungen empfielt es sich generell, die fstab zu benutzen. Dann wird daraus einfach ein

umount /mnt/handy

oder so ähnlich, je nachdem, was du für nen Pfad angibst. Aber es bleibt auf jeden Fall immer die gleiche Befehlszeile, egal, ob das Handy jetzt sdc oder sdd oder sonstwas ist.

In der fstab kann das dann zB so aussehn

UUID=6536-3936 /media/handy vfat rw,user,noauto,flush,shortname=mixed,uid=1000,utf8,umask=077

Die UUID findest du mit dem Kommando blkid heraus.

Nur so als Anregung wink

Beitrag geändert von Army (17.12.2009 22:27:40)

Offline

#57 18.12.2009 13:48:12

CrAc
Mitglied

Re: Eure brauchbarsten aliase

Aber wenn ich das ganze in die fstab haue, wird das ganze schon am start geckeckt, das hält auf. Und so muss ich nirgends rumspielen smile
(Ich kann im laufenden Betrieb nichts aus der fstab mounten)

Und andere Geräte habe ich nicht wink

Achja:
Wäre nett, wenn mir wer verrät, was falsch ist:
alias greplog='cat /var/log/*.log | grep -i "$1" | less'

Das mit der Variable scheint zu haken.

Beitrag geändert von CrAc (18.12.2009 13:59:26)

Offline

#58 18.12.2009 14:05:17

badboy
Mitglied

Re: Eure brauchbarsten aliase

CrAc schrieb:

[...]
Achja:
Wäre nett, wenn mir wer verrät, was falsch ist:
alias greplog='cat /var/log/*.log | grep -i "$1" | less'

Das mit der Variable scheint zu haken.

alias führt eine simple Textersetzung durch, $1 wäre aber ein Argument, was an eine Funktion oder ein Programm übergeben wird

greplog() { grep -i "$1" /var/log/*.log | less } wäre hier die richtige Alternative (beachte "useless use of cat")

Offline

#59 18.12.2009 15:04:16

CrAc
Mitglied

Re: Eure brauchbarsten aliase

Zu nett wink

Nur, wie nutze ich diese funktion?
weder greplog, greplog() lala, noch greplog(lala) haben funktioniert wink

Offline

#60 18.12.2009 15:49:40

badboy
Mitglied

Re: Eure brauchbarsten aliase

CrAc schrieb:

Zu nett wink

Nur, wie nutze ich diese funktion?
weder greplog, greplog() lala, noch greplog(lala) haben funktioniert wink

na, sicherlich genau so wie du sie verwenden willst:

$ greplog test
...
<ganz ganz lange liste>

Offline

#61 18.12.2009 17:42:08

portix
Mitglied

Re: Eure brauchbarsten aliase

Einige meiner aliase

alias ren="vim -c ':Renamer'"
alias vimrc='vim $HOME/.vimrc'
alias bashrc='vim $HOME/.bashrc && source $HOME/.bashrc'
alias winid="xwininfo | grep id: | sed -e 's/[^0]*//' -e 's/ .*//g'"
alias info="info --vi-keys"
alias tvim="gvim --servername vimtex -S"

und die am meisten genutzten funktionen:

pdfconc () { 
    [ $# -lt 2 ] && echo "usage: pdfconc outfile infile(s)" && return
    out="$1"
    shift
    gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile="$out" "$@"
}
ll() { 
    ls -lh --color $* | more; 
}
www () { 
    w3m "${1:--B}"; 
} 
lz () { 
    mv "$1" "${1//\ /_}"; 
}
mkbash() { 
    echo "#!/bin/bash" > "$1" &&  chmod 700 "$1" && vim -c "set ft=sh" "$1" 
}
pacs () { 
    pacman -Ss $1 | less
} 
concol() {
    [ $TERM != linux ] && echo "Keine Linux-Konsole" && return 0
    case $1 in 
        -w) setterm -foreground black -background white -store -clear ;;
        -b) setterm -foreground white -background black -store -clear ;; 
        *) echo "usage: concol -w|-b" && return 0 ;;
    esac
}

Offline

#62 19.12.2009 00:12:34

CrAc
Mitglied

Re: Eure brauchbarsten aliase

badboy schrieb:
CrAc schrieb:

Zu nett wink

Nur, wie nutze ich diese funktion?
weder greplog, greplog() lala, noch greplog(lala) haben funktioniert wink

na, sicherlich genau so wie du sie verwenden willst:

$ greplog test
...
<ganz ganz lange liste>

fehler gefunden:

greplog () {
			 grep -i "$1" /var/log/*.log | less 
	 	}

Das Leerzeichen nach dem funktionsname wink

Danke smile

Beitrag geändert von CrAc (19.12.2009 00:20:53)

Offline

#63 14.02.2010 17:56:44

maxiking333
Mitglied

Re: Eure brauchbarsten aliase

Hi,

das hier ist mein erster Beitrag, ich hoffe das ich das richtig mache...
Ich habe ein paar aliase und ein paar nützliche Funktionen in meiner .bashrc:

# Check for an interactive session
[ -z "$PS1" ] && return

alias .='cd ../'
alias ..='cd ../../'
alias ...='cd ../../../'
alias ....='cd ../../../../'
alias cp='rsync --progress -h -8'
alias pacman='sudo pacman'
alias ls='ls -l --color=auto'
alias system-update='pacman -Syu'
alias myip='curl http://www.whatismyip.org; echo'
alias ping='ping -c 5'
alias less='less -r'
alias vim-syntax='vim -c ":syntax on"'
alias mount='sudo mount'
alias umount='sudo umount'

function pastebin() {
	if [ -z $1 ]; then
		echo "pastebin [USER] [EXPIRY] [DATA] [FORMAT]"
		echo "    USER   = Your username"
		echo "    EXPIRY = d(day), m(month), f(forever)"
		echo "    DATA   = Your text"
		echo "    FORMAT = Text format, for example(text, bash)"         
	else
		if [ "$4" = "" ]; then
			FORMAT="text"
		else
			FORMAT=$4
		fi
		curl -i -d "poster=$1&expiry=$2&code2=$3&format=${FORMAT}&paste=Send" "http://pastebin.com/pastebin.php" 2>/dev/null | grep -i "Location:" 
	fi
}

function mkbash() {
	echo "#!/bin/bash" >$1 && chmod 700 $1 && vim -c ":syntax on" $1
}

function psgrep() {
	ps aux | grep $1 | grep -v "grep"
}

function unpack() {
	if [ -f $1 ]; then
		case $1 in
			*.tar.bz2|*.tbz2)
				tar xvfj $1
				;;
			*.tar.gz|*.tgz)
				tar xvfz $1
				;;
			*.bz2)
				bzip2 -d $1
				;;
			*.rar)
				unrar x $1
				;;
			*.gz)
				gzip -d $1
				;;
			*.tar)
				tar xvf
				;;
			*.zip)
				unzip $1
				;;
			*.Z)
				compress -d $1
				;;
			*.7z)
				7z x $1
				;;
			*)
				echo  "Cannot extract \"$1\" via unpack()"
				;;
		esac
	else
		echo "\"$1\" is not a valid file"
	fi
}

function pack() {
	ERROR=true
	if [ -d $2 ]; then
		ERROR=false
	fi
	if [ -f $2 ]; then
		ERROR=false
	fi
	if [ "$ERROR" = "false" ]; then
		case $1 in
			*.tar.bz2|*.tbz2)
				tar cvfj $1 $2
				;;
			*.tar.gz|.*tgz)
				tar cvfz $1 $2
				;;
			*.bz2)
				bzip2 --stdout $2 >$1
				;;
			*.gz)
				gzip -r --stdout $2 >$1
				;;
			*.tar)
				tar cvf $1 $2
				;;
			*.zip)
				zip -r $1 $2
				;;
			*.Z)
				compress --stdout $2 >$1
				;;
			*.7z)
				7z a $1 $2
				;;
			*)
				echo "Cannot pack \"$1\" with pack()"
			esac
	else
		echo "Cannot pack \"$2\" with pack()"
	fi
}

function gosleep() {
	if [ -z $1 ]; then
		echo "gosleep [WAKEUPTIME]"
		echo "    WAKEUPTIME = For exmaple: 14:00, 2010-01-17 14:00"
	else
		sudo rtcwake -u -m mem -t `date -d "$1" +%s`
	fi
}

PS1='[\u@\h \w]\$ '

Viele Grüße
Maxi

Offline

#64 08.04.2010 22:13:24

custom
Mitglied

Re: Eure brauchbarsten aliase

Mal meine paar Zeilen die wieder dazugekommen sind seit Bash-4.0.

stty -ctlecho

shopt -s checkwinsize
shopt -s cdspell
shopt -s dirspell
shopt -s dotglob
shopt -s globstar
shopt -s extglob
shopt -s autocd

Offline

#65 22.05.2010 14:18:16

stigmayta
Mitglied

Re: Eure brauchbarsten aliase

Meine sudo-Variante:

function sudo() {
  su -c "$*"
}

Offline

#66 01.09.2010 16:58:47

pSub
Mitglied

Re: Eure brauchbarsten aliase

Dirk Sohler schrieb:
danlei schrieb:

alias -g .....='../../../..'

RU SERIOUS? smile

Um so etwas zu vermeiden, finde ich diese Lösung ganz nett:

global-alias-dot() {
   if [[ $LBUFFER = *.. ]]; then
       LBUFFER+=/..
   else        
       LBUFFER+=.
   fi
}

zle -N global-alias-dot
bindkey '.' global-alias-dot

so werden die .. gleich angezeigt, wenn man einen zusätzlichen Punkt macht. Ist zwar kein richtiger alias aber sehr nützlich.

Offline

#67 01.09.2010 19:59:21

Kinch
Mitglied

Re: Eure brauchbarsten aliase

Sehr praktisch die Lösung.

Offline

#68 02.09.2010 09:04:58

dafab
Mitglied

Re: Eure brauchbarsten aliase

Wundert mich eigentlich, dass das hier noch von niemandem gezeigt wurde:

pacsearch () {
  echo -e "$(pacman -Ss $@ | sed \
  -e 's#current/.*#\\033[1;31m&\\033[0;39m#g' \
  -e 's#extra/.*#\\033[0;32m&\\033[0;39m#g' \
  -e 's#community/.*#\\033[1;35m&\\033[0;39m#g' \
  -e 's#^.*/.* [0-9].*#\\033[0;36m&\\033[0;39m#g' )"
}

Ich mag nicht mehr ohne wink

Der git-Prompt ist auch hilfreich. Befindet man sich in einem Git-Repository zeigt er an welcher Branch gerade aktiv ist und ob Änderungen vorgenommen wurden:

# git
function parse_git_dirty {
  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*"
}
function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/*\(.*\)/[\1$(parse_git_dirty)]/"
}

export PS1='\u@\h \w\[\033[1;31m\]$(parse_git_branch)\[\033[0m\]$ '

Offline

#69 02.09.2010 12:52:39

pSub
Mitglied

Re: Eure brauchbarsten aliase

dafab schrieb:

Der git-Prompt ist auch hilfreich. Befindet man sich in einem Git-Repository zeigt er an welcher Branch gerade aktiv ist und ob Änderungen vorgenommen wurden:

Hier sollte man auch erwähnen, dass die Zsh solch eine Funktionalität schon von Haus aus mitbringt und das nicht nur für git. Florian Kriener hat dazu einen sehr guten Artikel geschrieben.

Beitrag geändert von pSub (02.09.2010 12:52:56)

Offline

#70 20.09.2010 11:34:15

NecroWxrst
Mitglied

Re: Eure brauchbarsten aliase

Hallo!

Als ersten Beitrag von mir erstmal ein paar Aliase (;

.bash_aliases:

alias ls="ls --color=auto"
alias l="ls -l"
alias la="ls -la"
alias ll="ls -1"
alias lr="ls -R"
alias grep="grep --color=auto"

alias upgrade="sudo pacman -Syu"
alias install="sudo pacman -S"
alias search="pacman -Ss"
alias remove="sudo pacman -Rs"

alias da='date "+%A, %B %d, %Y [%T]"'

aus der .zshrc:

alias -s html=$BROWSER
alias -s org=$BROWSER
alias -s com=$BROWSER
alias -s net=$BROWSER
alias -s png=feh
alias -s jpg=feh
alias -s gif=feg
alias -s gz=tar -xzvf
alias -s bz2=tar -xjvf
alias -s java=$EDITOR
alias -s txt=$EDITOR
alias -s PKGBUILD=$EDITOR
alias -s torrent=rtorrent
alias -s avi=mplayer
alias -s mpg=mplayer
alias -s mp4=mplayer
alias -s flv=mplayer
alias -s pdf=epdfview

alias -g L=' | less' 
alias -g G=' | grep' 

Grüße
Chris

Offline

#71 20.09.2010 15:52:55

dermarlo
Mitglied

Re: Eure brauchbarsten aliase

Army schrieb:
the_isz schrieb:

Cooler Thread. Hab mir paar abgeschaut. Das für die IP Adresse hab ich bißchen abgewandelt, damit wirklich nur die IP Adresse rauskommt:

alias myip="wget -q -O - http://www.whatismyip.de | grep '<title>' | sed -e 's/^[^[:digit:]]*\([[:digit:]\.]*\).*$/\1/'"

Geht das echt bei dir? Bei mir gehts net! Besser / einfacher ist

curl www.whatismyip.org

wink


oder in "cool"

curl -s http://www.whatismyip.de | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}'

wink

Offline

#72 20.09.2010 23:27:22

Dirk
Moderator

Re: Eure brauchbarsten aliase

dermarlo schrieb:

oder in "cool"

Eher in „umständlicher", oder?

Offline

#73 21.09.2010 02:36:49

Vain
Mitglied

Re: Eure brauchbarsten aliase

Dirk Sohler schrieb:
dermarlo schrieb:

oder in "cool"

Eher in „umständlicher", oder?

Achwas. Der Weg ist das Ziel. smile

Will auch mal.

alias l='ls -Fal --si -s --color=auto --group-directories-first'
alias v='vim -p'
alias g='git'
alias gk='gitk'
alias gka='gitk --all'
alias tt='mt /tmp/tmp; l'

ll()
{
    l --color=always "$@" | less
}

mt()
{
    mkdir -p -- "$@" && cd -- "$@"
}

tl()
{
    tree -FC "$@" | less
}

tla()
{
    tree -FCa "$@" | less
}

paste_to_script()
{
    xclip -o > "$1"
    chmod u+x "$1"
    v "$1"
}

new_script()
{
    touch "$1"
    chmod u+x "$1"
    v "$1"
}

curless()
{
    url="${1:-$(xclip -o)}"
    curl -s --location "$url" 2>&1 | less
}

rgrep()
{
    # Ermöglicht Angabe von Argumenten für find und für grep. Beispiel:
    #
    #   rgrep foo bar -- baz bam
    #         -------    -------
    #          grep        find
    #
    # Es ist jedoch so nicht möglich, ein "--" an grep zu übergeben.

    grepargs=()
    for i
    do
        # Beeinflusst $i nicht, sondern nur den Inhalt von "$@" nach der
        # Schleife.
        shift

        # Am Trenner abbrechen, ansonsten das Argument für grep
        # übernehmen.
        [[ "$i" == "--" ]] && break
        grepargs+=("$i")
    done

    # In "$@" sind jetzt nur noch die Argumente für find. Mindestens ein
    # Suchbegriff ist aber notwendig.
    (( "${#grepargs[@]}" == 0 )) && \
        echo "Usage: rgrep <term> [grep-args...] [-- [find-args...]]" && \
        return 1

    # find-Aufruf mit kulminiertem grep-Aufruf.
    find "$@" -exec grep --color=auto "${grepargs[@]}" '{}' '+'
}

tempshell()
{
    sh="${1:-csh}"
    su - "$(whoami)" -s "$(which "$sh")"
}

Offline

#74 21.09.2010 10:19:00

dermarlo
Mitglied

Re: Eure brauchbarsten aliase

Dirk Sohler schrieb:
dermarlo schrieb:

oder in "cool"

Eher in „umständlicher", oder?

Stimmt - war auch nicht ganz ernst gemeint wink

Der Vollständigkeit halber noch auszugsweise mein aliase (zsh):

alias c='clear &&'
alias l='ls -l --color=auto'
alias ls='ls --color=auto'
alias sl='ls --color=auto'
alias grep='grep --color=auto'
alias cal='cal -m -3'
alias -s 'pdf=evince'
alias -s 'txt=vim'
alias -s 'png=eog'
alias -s 'jpg=eog'
alias -s 'jpeg=eog'
alias -s 'odt=soffice'
alias -s 'doc=soffice'
alias -s 'ods=soffice'

Offline

#75 08.10.2010 09:51:13

custom|off
Gast

Re: Eure brauchbarsten aliase

Was ich immer öfter verwende in letzter Zeit:

encrypt() {
    gpg -r 0x17DE3BFD --sign --encrypt ${1}
}

decrypt() {
    gpg -o ${1%\.gpg} --decrypt ${1}
}

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums