Kapitel 12 Mer om program 12.1 Att rapportera buggar och problem När man rapporterar buggar eller andra problem i program så är det några saker att tänka på för att ens rapport ska vara användbar för den som tar emot rapporten. Detta gäller både när du rapporterar saker till Per här och när du stöter på buggar i diverse program. 1. Tala om vad du gjort! Skriv t. ex. inte bara»utskrifter funkar inte«om du har problem med en utskrift, utan tala mer specifikt om vad du gjort som inte fungerar på ett sätt som går att härma. Skriv t. ex. Jag öppnade filen ~ellen/foo.pdf från filhanteraren, tryckte Ctrl-P för utskrift, och tryckte sedan Print när punkt stod som vald skrivare. om det var det du gjorde. Kanske är det något med just den filen som ställer till problem. Kanske är det nåt med just det pdf-visarprogrammet som ställer till problem. Kanske är det just skrivaren punkt det är problem med. Det vet du förmodligen inte, så tala om alla detaljer. Annars är det stor risk att den du rapporterat till provar nåt annat och inte upptäcker något problem. Målet är att den som man hoppas ska kunna lösa problemet ska kunna återskapa problemet! Om det inte är lokal felrapportering så tala om vilken version av programmet du använder också! Kanske uppstår problemet bara i vissa versioner. 2. Tala om vad som händer! Skriv t. ex. inte bara»utskrifter funkar inte«, utan tala om på vilket sätt. Du kanske får ett felmeddelande när du ger kommandot för att skriva ut? Det kanske inte kommer någon utskrift alls och det dyker upp ett meddelande på skrivarens display? Det kanske kommer en utskrift som är fel på något sätt? Detta hjälper till för att bekräfta för dem som läser rapporten att de får fram samma beteende. Om du får ett felmeddelande, så återge det! 3. Tala om vad du väntade dig skulle hända istället Det finns fall där detta är helt självklart, men om det inte är det, så ta med det också. Kanske har du missuppfattat vad som skulle hända. Då är det bra om det framgår direkt. Kanske är den du rapporterar till inte så insatt i just detta program. Då hjälper det att få veta vad som skulle ske för att bekräfta att en lösning man kommit på fungerar. En del av ovanstående är kanske självklart, men ändå skrivs det ganska många dåliga buggrapporter som tycks vänta sig att det som läser dem är tankeläsare, så det kan vara värt att sägas ändå. 12.2 make Som ni såg i förra kapitlet finns det ett kommando make som kan skapa filer enligt vissa regler. Med make trappa tillverkades t. ex. filen trappa. I det fallet såg den att det fanns en fil trappa.c och visste då hur den skulle göra (nämligen kompilera det C- programmet). När ni skrev make trappa igen jäm- 125
12. MER OM PROGRAM saga-i.txt : saga.txt sed 's/[aeouyåäö]/i/g; s/[aeouyåäö]/i/g' <saga.txt >saga-i.txt %-i.txt : %.txt sed 's/[aeouyåäö]/i/g; s/[aeouyåäö]/i/g' <$^ >$@ Figur 12.1: Två exempel på make-regler. Först en specifik, och sedan en mer generell förde make när filerna trappa.c och trappa var skrivna, och kom fram till att den inte behövde kompilera om programmet, om inte källkoden var ändrad senare. Man kan skriva regler för hur filer ska skapas och lägga dessa regler i en fil Makefile i samma katalog där man ger kommandot make. Detta används framförallt för att kompilera program, men kan användas även i andra sammanhang när filer ska skapas utifrån andra filer. Med en regel som den för saga-i.txt i figur 12.1 kan man t. ex. tala om hur filen saga-i.txt kan skapas utifrån saga.txt. Först i denna regel står vad som kan skapas med den, saga-i.txt, sen efter ett kolon dess beroenden = prerekvisit de filer som den är beroende av. Bara om någon av dessa filer har ändrats senare behöver regeln utföras igen. Sist anges vilka skalkommandon som ska köras för att skapa filen. I exemplet är det bara ett kommando, men det kan vara flera, alla med ett TAB-tecken som indrag. (Detta kommando skapar verkligen en fil saga-i.txt. Det är inte nödvändigt utan man kan ha regler som kör vissa kommandon när man skriver t. ex. make foo utan att någon fil foo skapas.) Om man vill kunna göra motsvarande omvandling med vilka andra filer som helst också, och t. ex. kunna skapa foo-i.txt utifrån foo.txt kan man använda en mer generell regel som den andra i figur 12.1 istället. Observera att i dessa regler används procent som ett slags jokertecken! Dollartecken följt av ett annat tecken används i speciella betydelser. De viktigaste ses ovan, nämligen $^ som betyder regelns beroenden (det efter kolonet) och $@ som betyder den fil som regeln skapar. Framförallt är sådant användbart när man har en stor mängd filer som hänger ihop genom att vissa kan genereras utifrån andra, och en del indatafiler ibland ändras så att en del av de andra filerna bör genereras om. 126
Laboration 12: Avslutning Dina svar denna vecka ska du checka in med Subversion på samma sätt som tidigare i en fil ids12.txt. En del uppgifter är repetition. Andra är sådant som vi inte gjort, men som du ska kunna ta reda på själv hur man gör. Make och sagan Skapa en fil Makefile i din katalog saga där saga. sh ligger. Lägg regler där för att skapa alla de filer som saga.sh skapar så att man kan skriva t. ex. make saga-i.txt i den katalogen för att skapa en sådan fil om den inte redan finns. Det blir en regel för varje fil som ska skapas, alla i samma Makefile. Skriv reglerna så att de fungerar för andra textfiler med namn som slutar på.txt också. Det finns flera sätt att plocka ut ord ur en text. Använd denna gång grep -o med något lämpligt argument för att göra det vid tillverkningen av saga-ord.txt. Checka in din Makefile när den klarar allt detta. Spanska Utöka sedan samma Makefile med en regel som från varje textfil med namn som slutar på».txt«skapar en fil med namn som slutar på»-spanska.txt«som är översatt från svenska till spanska. med hjälp av gtrans. Checka in den ändrade Makefile med en kommentar som talar om att det var detta du lade till. Uppgift 12.1 Om du kopierar /local/kurs/ ids/rummet.txt till denna katalog och skriver make rummet-spanska-ord.txt, vilka kommandon utför då make och hur lyder resultatet? Buggar i grep Under kursen har man kunnat märka två buggar i grep. 1. På s. 86 skrev jag att \w betyder samma sak som [[:alnum:]] i reguljära uttryck i grep. Så står det nämligen i dokumentationen till grep. Men det betyder faktiskt inte riktigt samma sak! Med \w inkluderas även understreck (_) som inte räknas med i [[:alnum:]]! Antingen är det programmet som gör fel eller så står det fel i dokumentationen. Någonstans är det en bugg hursomhelst. 2. En sak som det kan ha hänt att någon drabbats av är att ankring i början av något inte funkar så bra tillsammans med grep -o. $ echo hej grep -o '^.' h e j Det tycks som att när h först har hittats så skalas strängen ner till ej och därmed finns e först på raden i resten, osv. Tänk om man skulle göra programutvecklarna en tjänst och rapportera dessa buggar. Men då bör man först se efter om de redan har fixats i den senaste versionen av grep. Uppgift 12.2 Vilken version av grep kör vi här? Hur tog du reda på det? Vilken är den senaste pub- 127
LABORATION 12: AVSLUTNING licerade versionen av GNU grep? Var på webben hittade du det? Hämta den senast publicerade på nätet och kompilera och installera den för att se om den har samma fel. Använd hela det normala GNU-sättet för att installera program, och ange din hemkatalog som prefix. Uppgift 12.3 Hur körde du då configure? (Använd den kortaste sökvägen till det.) Uppgift 12.4 Vilka kommandon gav du sen? Uppgift 12.5 I vilken katalog hamnade nu det nyinstallerade programmet grep? Hur kan du enklast skriva för att köra det? Uppgift 12.6 Har den senaste versionen kvar bugg 1 ovan? Om den har det så formulera en buggrapport om detta. Om inte, så tala om hur du såg det. Uppgift 12.7 Har den senaste versionen kvar bugg 2 ovan? Om den har det så formulera en buggrapport om detta. Om inte, så tala om hur du såg det. Om det vore på riktigt skulle du skriva på engelska eftersom det är vad programmets författare förstår, men om du vill kan du skriva på svenska istället. Ge korta exempel på något som ger fel resultat som de skulle kunna göra efter. Skicka inte in någon buggrapport på riktigt! (Om det behövs så är det redan gjort.) Skaluppgifter Dessa uppgifter ska lösas med ett eller flera kommandon i skalet. Ange både vilket eller vilka kommandon du gav, samt vad resultatet blev. Uppgift 12.8 Vilka delstater i USA har namn som består av mer än ett ord? Använd filen /local/ kurs/ids/us-states.txt. Låt resultatet bli sorterat och med bara namnen (utan datum). Uppgift 12.9 Hur långt är det längsta svenska språknamnet i /local/kurs/ids/eulang.tsv? Uppgift 12.10 Vad finns det för rader i /local/ kurs/ids/wonderland.txt som bara innehåller ett ord, eventuellt med ett eller flera mellanslag före eller efter, men inga andra tecken. För själva ordet kan du skriva \<\w*\>. Uppgift 12.11 Vad finns det för ord som börjar på stor bokstav i den ryskspråkiga textfilen /local/ kurs/ids/rysk.txt. Glöm inte att den filen är kodad med ISO 8859-5! Svaret ska vara i vårt vanliga UTF-8 och innehålla en lista över bara de orden, ett per rad, utan dubbletter. Emacs Uppgift 12.12 Vad är nu igen kortkommandona för a) att avbryta ett påbörjat kommando, b) öppna en fil, c) spara en fil, d) söka framåt (inkrementell sökning). Uppgift 12.13 Meddelandena som Emacs skriver ut ibland längst ner (i ekoarean) sparas också i en särskild buffert. Vad heter den? Reguljära uttryck Uppgift 12.14 Uttryck i ord vad följande utökade reguljära uttryck matchar: a)(abc){3} b)[abc]{3} c) <abc>{3} d)^[[:lower:]]+$ e)\<(\w\w)+\> Uppgift 12.15 Här ges ett antal utökade reguljära uttryck som alla går att skriva kortare så att ändå exakt samma texter matchas. Hur? a) bar ber bir bor bur b) ab[c]def c)[kanin] d)(.* groda) e)(xxx){10} f) foo [gj]oo g)[!]{2} h) aa?aaa?a?aa?a Diverse Uppgift 12.16 Vad kallas teckenkodningen ISO 8859-1 också ofta? 128
Att rensa upp efter sig Uppgift 12.17 En vanlig kombination i rörledningar är sort uniq. Eftersom det är så vanligt finns det en väljare till sort som gör samma sak som att slänga på uniq efteråt. Vilken? Uppgift 12.18 Nedan visas innehållet i en tänkt XML-fil, som inte är välformad XML. Vad är det för fel? <?xml version="1.0" encoding="utf-8"?> <bok> <författare>selma Lagerlöf</författare> <titel>gösta Berlings saga</titel> </bok> <bok> <författare>august Strindberg</författare> <titel>röda rummet</titel> </bok> DSSO igen I förra labben fick du tillverka ett skalskript som tog den textfil som man kan ladda ner från Den stora svenska ordlistan och tillverka en lista med ordformer i den. Om du är klar med den, så se över dessa saker för att se om du tagit hänsyn till dessa och gör ändringar i din dsso.sh om så är lämpligt. Skräp? I figur 12.2 på nästa sida finns ett par utdrag ur DSSO-filen. Du har väl inte fått med sånt som står på andra rader i filen? De där raderna om upphovsrätt i början har väl t. ex. inte gjort att du har fått med ett ord»creative«i din ordlista? Och du har väl inte råkat få med nåt av den där uppmärkningen av ordklass i din fil? Kolla om du har tecknen»<«eller»>«där! Flerordsuttryck Det stod i uppgiften att du inte skulle ha med flerordsuttryck som t. ex.»au pair«och»science fiction«. Sök i den fil du skapat för att se efter att det verkligen är så. Du har väl inte bara plockat bort mellanrummet och därmed fått med felaktiga ord som»alterego«? Dubbletter? Har du några dubbletter i din lista? Det stod inget i uppgiften om att ni skulle undvika det, men gör det nu. Låt din ordformer.txt bara ha med varje ordform (varje graford) en gång, även om det kommer från böjningar av olika ord, som t. ex.»vaken«(substantiv eller verb). Konstiga tecken i ord? Det kan ha känts naturligt att använda beteckningar i reguljära uttryck som betyder början-av-ord och ord-tecken osv., men här bör du ha godtagit de ordformer som anges i infilen oavsett vilka tecken som räknas som ordtecken eller inte, t. ex.»a-moll«trots att kanske bindestreck inte räknas som ett ordtecken ibland. Och se efter att du inte missat»bahá í«bara för att det innehåller en apostrof! Alla varianter? Tänk som exempel på en rad som den om adjektivet rätt i figur 12.2. Kolla att du fått med såväl»rättan«som»rätte«bland dina ordformer. Att rensa upp efter sig Snart har du förhoppningsvis blivit godkänd på denna kurs, och då kan det vara läge att rensa upp i din kurskatalog. Du borde inte ha skapat så mycket stora filer i denna kurs, men i en annan kurs kan det bli rejält med data som du antagligen inte behöver ha kvar efteråt, så det är en bra vana att efteråt se över vad som kan komprimeras eller kanske till och med tas bort. Se på http://stp.lingfil.uu.se/datorer/ disk.html för en del tips som har med diskanvändning att göra. Uppgift 12.19 Vad kan du enligt detta ge för skalkommando för att se hur mycket plats din hemkatalog tar upp? Hur mycket var det? Ett par väljare används till kommandot. Vad betyder de? Uppgift 12.20 Ge ett skalkommando som med hjälp av kommandot find tar fram vilka de största filerna/underkatalogerna i din hemkatalog är. (Använd exempel på samma webbsida som förebild.) 129
underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller... (fnord) LABORATION 12: AVSLUTNING # Copyright (c) 2009 Göran Andersson # This work is licensed under the Creative Commons Attribution-Share Alike License.... 571187r5<adjektiv>rätt:rätt:rätt:rätta, rättan:rätta:rättare:::rätte:::::::: Figur 12.2: Utdrag ur dsso-1.44.txt. Med ls -l eller wc -c får man filers storlek, men det duger inte till denna uppgift eftersom det inte säger nåt om katalogers storlek. Leta filer Läs i dokumentationen om kommandot find för att ta reda på hur man kan lösa ytterligare uppgifter med det. Uppgift 12.21 Lista alla filer under /usr/share/ gimp som har namn som slutar på».jpg«. Uppgift 12.22 Lista alla tomma filer och kataloger under /usr/share/amaya. (Det finns en särskild sökmöjlighet i find för sånt som är tomt.) Uppgift 12.23 Vad finns det för tomma filer som heter README under /usr/share? Med»under«menar jag i den katalogen, eller i en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller i en underkatalog till en underkatalog till en underkatalog till en underkatalog till en underkatalog till en 130