Posts Tagged ‘linux’

Prompt i terminalen som visar git- och svn-status

tisdag, januari 29th, 2013

Här kommer ett tips om du arbetar med Git eller SVN ifrån terminalen. Det går att modifiera prompten så att den visar statusen för aktuell arbetskopia.

Normalt ser prompten ut ungefär så här, beroende på distribution (jag kör Linux Mint för tillfället).

Min prompt

När jag hoppar in i en katalog som är utcheckad från SVN ser det ut så här.

Nu syns information om aktuell branch och revision, i detta fall är branchen branches/RB-1.8 och revisionen 837. Att det visas i grönt betyder att det inte finns några modifieringar. Om jag ändrar i en fil kommer prompten att bli röd.

Modifierad arbetskopia

Arbetar du med Git syns liknande information i prompten. På bilden nedan syns hur jag går in i en katalog som är klonad från Git, skapar en ny branch med git flow och redigerar en fil. Prompten byter även här färg till rött när det finns modifierade filer och när jag committar mina ändringar ändrar färgen till grön igen. Jag slutför min feature (branch) och promten ändras igen så att aktuell branch (develop) visas.

Git prompt

För att få den här funktionaliteten läggar man till kodsnutten nedan i filen .bashrc som finns i din hemkatalog, finns den inte går det bra att skapa den. För att scriptet ska fungera måste filen /etc/bash_completion.d/git finnas, den kommer vanligen med i installationen av git, åtminstone om du installerar med apt-get install git.

Här kommer då koden.

# Custom PS1 prompt to show git and svn repos, branches and their status
Color_Off="\[\033[0m\]"       # Text Reset
Green="\[\033[0;32m\]"        # Green
BGreen="\[\033[1;32m\]"       # Green
BYellow="\[\033[1;33m\]"      # Yellow
IRed="\[\033[0;91m\]"         # Red
PathShort="\w"

export SVN_SHOWDIRTYSTATE=1
export PS1='$(git branch &>/dev/null;\
if [ $? -eq 0 ]; then \
  # In Git repo
  echo "$(echo `git status` | grep "nothing to commit" > /dev/null 2>&1; \
  if [ "$?" -eq "0" ]; then \
    # Clean repository - nothing to commit
    echo "'$Green'"$(__git_ps1 " (%s)"); \
  else \
    # Changes to working tree
    echo "'$IRed'"$(__git_ps1 " {%s}"); \
  fi) '$BYellow$PathShort$Color_Off'\$ "; \
elif [[ -d ".svn" ]] ; then \
  # In SVN repo 
  r=`__svn_rev` ;\
  b=`__svn_branch` ;\
  out=`svn status | grep -c ".*"` ; \
  if [ $out -eq 0 ] ; then \
    echo "'$Green'[$b:$r] '$BYellow$PathShort$Color_Off'\$ "; \
  else \
    echo "'$IRed'[$b:$r] '$BYellow$PathShort$Color_Off'\$ "; \
  fi; 
else \
  @2 - Prompt when not in GIT repo
  echo " '$BGreen'\u@\h '$BYellow$PathShort$Color_Off'\$ "; \
fi)'

# Outputs the current trunk, branch, or tag
__svn_branch() {
    local url=
    if [[ -d .svn ]]; then
        url=`svn info | awk '/URL:/ {print $2}'`
        root=`svn info|awk '/Repository Root/ {print $3}'`
        if [[ $url =~ trunk ]]; then
            echo trunk
        elif [[ $url =~ /branches/ ]]; then
            echo ${url##$root/}
        elif [[ $url =~ /tags/ ]]; then
            echo ${url##$root/}
        fi
    fi
}

# Outputs the current revision
__svn_rev() {
    local r=$(svn info | awk '/Revision:/ {print $2}')
    if [ ! -z $SVN_SHOWDIRTYSTATE ]; then
        local svnst flag
        svnst=$(svn status | grep '^\s*[?ACDMR?!]')
        [ -z "$svnst" ] && flag=*
        r=$r$flag
    fi
    echo $r
}

Rock on!

Använd error-loggen!

måndag, mars 5th, 2012

error_logOfta när jag ska hjälpa någon av våra utvecklare med ett problem är min första fråga: Vad står det i loggen? Apache och php har väl utvecklade loggfunktioner och man kan med hjälp av dom få en ganska bra fingervisning om vad som orsakar problemet.  Exempelvis kan det stå:

[Fri Mar 02 17:38:08 2012] [error] [client 127.0.0.1] PHP Parse error:  syntax error,
unexpected ';' in /var/www/smhifb/application/controllers/start.php on line 64</pre>

Just det här felet beror förmodligen på att det saknas en slutparantes eller klammer på rad 64 i filen start.php (Nu var det här bara ett exempel, eftersom rena syntaxfel så klart hittas av din IDE, som jag utgår ifrån att  du använder.)

När jag utvecklar har jag alltid ett terminalfönster öppet som visar loggarna i realtid så att jag snabbt ska kunna se om det händer något som inte borde hända, när man surfar in i applikationen.  Även om man inte märker några fel när man surfar så händer det ändå att det dyker upp fel i loggen. Oftast är detta då varningar eller notiser, vilka inte är fatala för körningen av koden. Det är väldigt vanligt att man ändrar i php.ini så att notiser och till och med varningar inte visas i loggen, koden fungerar ju ändå. Gör inte det! Se till att varningar och notiser loggas och fixa till felen! Den enda anledningen till att folk slår av notiser och varningar är att dom antingen är lata eller programmerar dåligt.  Det är lika vanligt att de som har varningar och notiser aktiverat inte bryr sig om att rätta till dessa fel, eftersom det fungerar ändå. Var inte en lat programmerare! Konsekvensen blir att koden inte blir så optimerad som den kunnat vara, dessutom kan små fel bli betydligt större längre fram.

Ett litet tips, använd programmet multitail. Multitail är ett program som körs i konsollen och kan visa flera loggar samtidigt i realtid. Vanligen när man vill se en logg i realtid använder man sig av kommandot tail med växeln -f, exempelvis:

tail -f /var/log/httpd/error_log

Med multitail kör man istället

multitail /var/log/httpd/error_log /var/log/httpd/access_log

Detta medför att terminalfönstret delas på två och visar en logg i varje del. Det är otroligt smidigt att se error-loggen i den ena delen och access-loggen i den andra. Det allra bästa med multitail är att det har syntax highlighting, det skriver alltså ut olika saker i olika färger, vilket gör det enklare  att se i loggen. multitail
Så, en kort sammanfattning.

  • Använd error-loggen
  • Se till att varningar och notiser visas
  • Fixa felen, även varningar och notiser
  • Visa loggen i realtid i ett eget terninalfönster
  • Använd multitail

Kod ska vara kul  och är det också med rätt förutsättningar, en av dessa förutsättningar är att veta vad som är fel och framför allt veta att det är fel.

wget i OS X Lion

fredag, januari 27th, 2012

wget för osxKommandot wget, som bland annat kan användas för hämta filer och sidor via http och ftp, finns tyvärr inte i Osx Lion. Det här är något som irriterat mig ett tag, men som jag av olika anledningar inte tagit tag i än. Så idag när jag satt och skrev lite nya alias för diverse kommandon (jag gör så för exempelvis de ssh-anslutningar jag ofta använder, det går fortare att bara skriva goserver1 istället för att skriva ssh -p 2211 daniel@server1.domain.com), så kom jag på att curl faktiskt finns i Lion. Varför helt enkelt inte göra ett alias för wget till curl? Så här gör man.

I min hemkatalog finns en fil som heter .bash_profile, i den lägger jag till följande rad:

alias wget='curl -O'

Sedan sparar jag filen och stänger alla eventuella terminal-fönster och öppnar ett nytt. Nu kan jag använda mig av kommandot wget för att hämta hem filer:

wget http://server1.domain.com/path/large_file.zip

Det här blir så klart inte exakt detsamma som att ha wget installerat på riktigt, eftersom wget kan göra så mycket mer än att bara hämta en fil, men i 99% av fallen är det just bara det jag använder det till. Ska jag göra något mer avancerat snickrar jag hellre ihop ett skript, antingen i bash eller i PHP.

OSX – som Linux fast snyggare!

Din dagliga dos av ko

tisdag, maj 24th, 2011

Kommandot apt-get, som används för att hantera paket i bland annat Ubuntu, har ett roligt påskägg inbyggt. Normalt använder man det exempelvis så här:

apt-get install lynx

Kommandot ovan laddar ner och installerar den textbaserade webbläsaren lynx. Om man däremot skriver:

apt-get moo

så visas en ascii-bild av en liten ko som säger ”Have you mooed today?” Det är såna här små saker som gör Linux så otroligt charmigt att arbeta med  🙂