Kapitel 11 Program Ett datorprogram är en samling instruktioner som beskriver något som en dator ska utföra. 11.1 Skript På s. 32 fick du skapa skalskript textfiler med flera skalkommandon efter varann och köra dem genom att skriva bash filnamn. Genom att ge ett filnamn som argument till skalet (bash) talar man om att det ska hämta kommandon från den filen. På s. 56 fick du sedan se hur man kan ge argument till ett sådant skript. Detta är ett slags enkla program. På samma sätt kan man köra t. ex. ett program i programspråket Python (brukar ha namn som slutar på.py) med python filnamn. 11.2 Interpreterande och kompilerande programspråk De flesta program man kör är dock inte textfiler utan binärfiler. De innehåller då instruktioner i en maskinnära form (maskinkod) som kan utföras (exekveras, köras) direkt av datorn. Med datorprogram kan man avse både en sådan binärfil, och även källkoden, så som programmet skrivits i något programspråk i en eller flera textfiler. I de flesta programspråk skriver man instruktioner som ligger långt ifrån den typen av instruktioner som datorn kan utföra direkt. Det finns olika sätt att då få datorn att utföra instruktionerna i källkoden: kompilering och interpretering. Kompilering är att översätta källkoden till maskinkod. Översättningen sker med en kompilator ett särskilt program. Sen kör man den resulterande koden. (Källkoden behövs inte längre för att kunna köra programmet. Men om man behöver göra ändringar i programmet behöver man källkoden igen och får lov att kompilera om den efteråt.) Interpretering är att tolka källkoden bit för bit istället, så som skalet tolkar kommandon i ett skalskript. Ett särskilt program, en interpretator, läser och utför dessa instruktioner. (Det finns även mellanlägen mellan kompilering och interpretering.) 11.3 Att köra program Programmen är filer de också. Om man t. ex. kör bildbearbetningsprogrammet Gimp så är det filen /usr/bin/gimp man kör. Det skulle gå att skriva den fullständiga sökvägen /usr/bin/gimp för att köra det programmet, men det räcker med bara gimp. Om man skriver bara ett namn utan katalog så letar nämligen skalet efter en sådan fil i vissa kataloger (däribland bland annat /bin och /usr/bin). Där ligger de flesta av de program du använt hittills, som t. ex. cat, grep, ls, sed osv. Om programfilen inte ligger i en av dessa kataloger måste man skriva ett längre filnamn där man tar med katalogen, med en fullständig eller relativ sökväg. Observera att skalet inte söker filen i aktuell katalog i sådana fall, som annars när man skriver ett filnamn utan katalog. 11.4 Att kompilera program För att kompilera ett program så kör man i de enklaste fallen en kompilator med källkodsfilen som argument. Kompilatorn skapar en ny fil som går att köra. Ett större program består normalt en mängd filer som använder sig av varandra på komplicerade sätt, och för att kompilera detta kan det krävas flera steg. I Unix-världen används oftast ett program make för att göra detta. Det utför alla dessa steg i rätt ordning för att tillverka vissa filer. I en fil Makefile har man skrivit regler som talar om för den vad den ska göra. Man kan ge argument till make som talar om vad det är man vill»tillverka«med det, men bara make utan argument duger ofta. 97
11. PROGRAM 11.5 Att installera program På en GNU-dator som man själv administrerar är det i allmänhet enklast att inte kompilera program man ska använda själv, utan istället installera färdigkompilerade program som färdiga paket med filer som läggs ut på rätt ställen på disken. Program som sköter sådant kallas pakethanterare. Detta förutsätter att någon har gjort ett sådant paket som passar till ens system, men är det ett välanvänt program så är det antagligen så. Ett par vanliga paketsystem är APT och RPM. Vårt system använder det sistnämnda av dessa. Men som vanlig användare utan administratörsrättigheter så kan du oftast inte använda dig av sådant eftersom du inte har rätt att lägga filerna på de centrala ställen där de då är tänkta att hamna. Då får du ofta lov att installera program någonstans under din hemkatalog genom att kompilera dem själv. (Så kan det också vara för att ingen har gjort nåt behändigt paket av just det programmet.) Programmen distribueras då i allmänhet i form av ett (komprimerat) filarkiv som källkoden finns i. Du börjar med att packa upp detta filarkiv och sen se efter om det bland filerna finns någon fil README med allmänna instruktioner eller kanske en fil INSTALL med instruktioner om hur du ska installera programmet. (Dessa filer heter ofta just så, med versaler.) Ofta säger instruktionerna att du ska använda make på något sätt. 11.5.1 Att installera med make I GNU har det utarbetats en standard för hur installationen går till. Med distributionen av programmet följer det med ett skalskript configure som man börjar med att köra. Det skapar en fil Makefile som är särskilt anpassad för det system man kör på. Efter det kan man kompilera programmet med make och sedan installera det med make install. I det sista steget kopieras filerna ut till olika ställen i filsystemet. De tre kommandona kan vara $./configure --prefix ~ $ make $ make install Normalt läggs program i /usr/local/bin/, man-sidor i /usr/local/man/ och diverse andra filer i några andra underkataloger till /usr/ local. Men där har vanliga användare inte rätt att lägga filer, så det kommer inte att funka om man inte är administratör! Med --prefix ovan till configure talar man om var programmet och alla dess filer ska installeras, så med t. ex. --prefix ~/foo installeras själva programmen i ~/foo/bin/ osv. Istället för en katalog under ens hemkatalog kan man förstås använda hemkatalogen själv: Med --prefix ~ hamnar själva programmen i ~/bin osv. 1 Det kan även finnas andra saker man ställer om vid konfigureringen med olika väljare till configure. 11.6 Upphovsrätt och licenser Upphovsrätt gäller för program, både för källkod och maskinkod, precis som för litterära och konstnärliga verk. Inga som har skrivit program för moderna datorer har dock varit döda i sjuttio år så att upphovsrätten har gått ut för deras verk, så som skett för t. ex. Strindberg och Lenngren. 2 Trots det finns det en mängd program som det står en fritt att använda, kopiera och sprida, eftersom programmens författare uttryckligen givit en tillstånd till detta. Sådant sker i form av en licens där upphovsrättsinnehavarna talar om vad de tillåter. I synnerhet är hela operativsystemet GNU sådan»fri programvara«, men för att komma till GNU tar vi först en kort Unixhistoria: 11.6.1 Unix Operativsystemet Unix skapades i slutet av 1960- talet på Bell Labs i USA. I mitten av 1970-talet började det spridas utanför Bell Labs. Det såldes rätt billigt (speciellt till universitet) och gick att köra på relativt billiga datorer (vid en tid när datorer var stora och dyra), vilket bidrog till dess popularitet. Dessutom följde källkoden med så att man kunde se precis hur det fungerade och även införa egna ändringar i systemet. Det ökade populariteten ännu mer i den akademiska världen, där en mängd universitet använde Unix i undervisningen i datorvetenskap. Möjligheten att göra ändringar i koden ledde till att det uppstod en stor mängd varianter av Unix. En viktig variant var BSD (Berkeley Software Distribution) från University of California, Berkeley. Berkeley spred sina tillägg och förändringar fritt, och många använde dessa. På 1980-talet tillverkade flera företag olika enanvändardatorer med Unix arbetsstationer. De var mycket kraftfullare och dyrare än den tidens vanliga persondatorer, och använde lite olika versioner av Unix. De olika tillverkarna skickade med olika tillägg från BSD och andra håll, och skrev också mycket egna tillägg (som inte spreds fritt), så de olika Unix-systemen skilde sig åt så 1 Tidigare har jag skrivit att det normala sättet att ge argument till långa väljare är med ett likamedtecken, som --prefix=~/foo, men just i detta fall ställer det till problem eftersom skalet bara ersätter ~ med ens hemkatalog när det står först i ett argument. 2 Detta är förstås skälet till att texter av dessa figurerat i flera övningar. 98
11.6. Upphovsrätt och licenser pass mycket så att det inte alltid gick rakt av att flytta ett program från ett system till ett annat, trots att alla var Unix i grunden. En viktig del var fönstersystemet X som spreds fritt från Massachusetts Institute of Technology (MIT) där det var skrivet. Även till detta lade de olika tillverkarna till olika nya finesser, så på olika datorer körde man lite olika versioner av X. 11.6.2 GNU och fri programvara När Unix var nytt hade de flesta av dess användare möjlighet att läsa koden för att lära sig hur den fungerade och även möjlighet att införa egna ändringar för att få delar av systemet att bete sig annorlunda. Med tiden hade det blivit allt ovanligare. De flesta Unix-användare kom att sitta vid arbetsstationer som till stora delar var som svarta lådor som man inte hade insyn i. Det uppfattades av många som frustrerande vid en tid när en stor del av datoranvändarna var programmerare själva. 1983 utannonserade Richard M. Stallman på MIT planer på att skriva ett fritt operativsystem som skulle få namnet GNU. Eftersom Unix redan då hade en så stark ställning så valde han att det skulle vara Unix-kompatibelt, dvs. bete sig som Unix trots att det inte var Unix. GNU stod för»gnu s Not Unix«. Snart startades en särskild stiftelse, Free Software Foundation (FSF), för att hålla i projektet och även i övrigt verka för fria program. En del program som redan fanns och som var fria kunde användas. T. ex. bestämde Stallman tidigt att man inte behövde skriva ett nytt fönstersystem eftersom fönstersystemet X var fritt. En del tillägg till Unix som skrivits på Berkeley och andra ställen var också möjliga att återanvända. Men den största delen av koden fick man skriva själva. 11.6.3 Linux Många delar av GNU kom snabbt till, och användes som separata delar på andra Unix-system, men en viktig del som kom på efterkälken var den mest centrala delen av operativsystemet, kärnan. Utan den var det inte möjligt att sätta ihop ett helt GNU-system. 1991 offentliggjordes Linux av den finlandssvenske studenten Linus Torvalds. Det var ett litet Unixliknande system, framförallt inspirerat av Minix, ett tidigare minimalt Unixliknande system, gjort särskilt för undervisning i operativsystem av Andrew S. Tanenbaum i Holland. Inom kort sattes hela GNU/Linux-system samman som använde Linux som operativsystemskärna istället för HURD som var den fortfarande bara halvfärdiga kärna som skulle användas i GNU. Oftast kallas sådana system bara för Linuxsystem, efter den kärna som används. Detta gick att köra på vanliga persondatorer, som annars oftast körde MS-DOS från Microsoft. Persondatorerna hade med tiden blivit så pass kraftfulla att de kunde klara ett mer krävande system. 11.6.4 Unix och Unix-liknande system idag En stor del av Unix-liknande system idag är fri programvara. Det finns nu en mängd olika distributioner av GNU/Linux som publiceras av olika företag och organisationer. Dessa skiljer sig åt mer eller mindre mycket beroende på vilka val distributörerna har gjort angående vilka program som ska vara med och inte vara med. Några av de populärare distributionerna är Debian GNU/Linux, Ubuntu, Red Hat Enterprise Linux, Fedora, Centos, Linux Mint, opensuse och Gentoo. Dessutom finns det fria Unix-liknande system som baserar sig på BSD. På Berkeley fortsatte man nämligen att utveckla koden, och så småningom hade man bit för bit ersatt så många delar med nyskriven kod så att det inte fanns mycket kvar av ursprunglig kod från Bell Labs. Då gjorde man en ansträngning att ersätta även de kvarvarande delarna, så i början av 90-talet kunde man släppa ett nästan komplett operativsystem som var fritt. Fria system som bygger på den koden är FreeBSD, OpenBSD och NetBSD. Alla de ovanstående är Unix-kompatibla, men de är inte Unix, dvs. de är inte licensierade att använda varumärket Unix, som ägs av»open Group, The«The Open Group. Det är däremot kommersiella Unix-versioner som AIX, HP-UX, IRIX, Solaris, Tru64, A/UX och OS X. De olika Unix-liknande systemen skiljer sig åt på en mängd små sätt. Det har gjorts flera försök att få dem att närma sig varandra för att underlätta flyttandet av program från ett system till ett annat, och bland annat genom standarderna POSIX och Single Unix Specification (och genom att en del kommersiella system slagits ut på marknaden) är dagens Unix-system mycket mer lika varandra än hur det var för ett par decennier sedan. 11.6.5 GNU GPL och»copyleft«många fria program finns det ofria varianter av. Så är det t. ex. med fönstersystemet X från MIT och med de Unix-tillägg som gjordes för BSD. Företag har vidareutvecklat dessa fria program men inte gjort sina nya versioner till fri programvara. Den som har använt dessa versioner har inte t. ex. kunnat läsa eller ändra i programmet de kört, trots att den ursprungliga versionen var fri programvara. De som skrivit dessa program hade inget emot detta, men för GNU ville man inte ha det så. Man 99
11. PROGRAM Figur 11.1: Copyleft-tecknet har bildats genom att spegelvända copyright-tecknet. ville att alla som använde de program man skrev skulle använda fria versioner av programmen. För att de program som skrevs för GNU skulle fortsätta att vara fria för alla som använde dessa program skrev man en ny licens, GNU GPL (General Public License), där en av de viktigaste nyheterna var något som man kallade för copyleft. Det innebär att man inte tillåter att någon sprider modifierade versioner av programmet om inte dessa ändringar också sprids med samma villkor. Den som delar med sig av program enligt GPL till en grupp människor ser alltså till inte bara att programmet är fritt för den gruppen, utan även för dem som den gruppen i sin tur sprider vidare programmet till. Ibland använder man ett spegelvänt copyright-tecken (figur 11.1) för detta. Med tiden har det skapats fler licenser för fri programvara med lite olika egenskaper, men GPL är den klart vanligaste inte bara för sådant som skrivits direkt för GNU, utan även för t. ex. kärnan Linux och webbläsaren Firefox. Istället för att formulera dessa villkor själv brukar man i allmänhet använda någon av de licenser som redan har formulerats. Ett skäl är att det underlättar mycket för den som vill använda programmet om en välkänd licens som man redan känner till har använts. Ett annat är att det underlättar återanvändning av delar av programmet tillsammans med delar av andra program som använder samma licens. Licenser för icke-fria program är i allmänhet utformade som avtal eller överenskommelser mellan två parter. För att få komma åt programmet så förbinder man sig till att uppfylla vissa villkor. En licens som GNU GPL fungerar inte så, utan är helt enkelriktad. Det finns ingenting som man behöver gå med på för att använda ett GPL:at program. Allt licensen gör är att ge andra rätt att göra vissa saker som annars inte hade varit tillåtet på grund av upphovsrätten. De som snarare betonar de tekniska fördelarna som att ökad tillgänglighet av källkoden kan leda till förbättrade program genom att fler har möjlighet att hitta fel eller bidra med fixar brukar istället tala om öppen källkod (open source), och ser det som ett medel till att nå bättre resultat snarare än som ett mål i sig, även om vilka program som är fri programvara och vilka som är öppen källkod i praktiken oftast räknas likadant. 11.6.7 Annat än program Programförfattares fria spridande av sina program har varit en inspiration även för fritt spridande av andra upphovsrättsligt skyddade verk, som texter, bilder och musik. Ett exempel är ett stort samarbetsprojekt som encyklopedin Wikipedia. Licenser som GNU GPL som är gjorda för program passar inte alltid så bra in på annat material. Organisationen Creative Commons har gjort en mängd olika licenser som är till för att upphovsrättsinnehavare ska kunna ge en del av sina rättigheter till allmänheten utan att släppa all kontroll. Dessa används rätt ofta vid spridande av texter, musik, bilder osv. och en del av dessa licenser är»fria«i den betydelse som används inom fri programvara. En del har även en copyleft-klausul, som där kallas för Sharealike. I figur 11.2 ses ikoner som ofta används vid beskrivning av de olika CC-licenserna. Creative Commons. BY = Attribution: man måste ange upphovsmakare. NC = Noncommercial: bara icke-kommersiell spridning är tillåten. ND = No Derivate Works: man får inte sprida härledda verk, utan bara exakta kopior SA = share alike: man får bara sprida det med samma villkor. En CC-licens använder någon kombination av dessa element, t. ex. Attribution + NoDerivates = by-nd = för något som andra får sprida vidare i oförändrat skick, om de anger ursprung, oavsett om det görs kommersiellt eller inte. 11.6.6 Öppen källkod = Open source Figur 11.2: Byggblock i Creative Commons-licenser. 100
Inlupp 11: Program Redovisning Checka in svar på frågorna i en fil ids11.txt i den versionskontrollerade katalog som heter som ditt användarnamn och som du har sedan tidigare. Gör en incheckning redan första dan du hållit på med detta, och en ny efter nästa gång du arbetat med det, osv. Versionskontroll igen Gå i skalet till katalogen alla som du skapat tidigare som kontrolleras av Subversion. Kolla läget här med kommandot svn status som säger något om hur din arbetskatalog skiljer sig från vad som finns i repositoriet. Du borde bland annat få rader som? sagobok.aux? sagobok.pdf och några till eftersom LaTeX skapade de filerna när du TeXade sagobok.tex, men Subversion inte vet något om dessa filer. Det är helt i sin ordning. Dessa filer bör inte checkas in, eftersom de skapas automatiskt från andra. Ett M står för modified, så om du har en rad som M sagobok.tex betyder det att du har gjort ändringar i den filen som du inte har checkat in. (Gör det i så fall om det är riktiga ändringar!) Ett A står för added, så om du haft en rad som A groda.png skulle det betytt att du har registrerat den filen i Subversion, men sen inte checkat in den ännu. Öppna sagotex.tex och använd samma kommando som i uppgift 10.21 för att se till att den är uppdaterad. Ändra sedan i den genom att byta ut Det var en gång i början av din saga mot \lettrine{d}{et var en gång}. TEXa filen, och om allt gick bra så checka in din ändring. Där används ett LaTeX-kommando för stor initial med två argument. Uppgift 11.1 Efter att du har checkat in den, så ta bort filen sagobok.tex och ge svn status igen. Att en fil som borde finnas saknas i din arbetskatalog vill Subversion verkligen uppmärksamma dig på. Vad använder den för tecken för att markera sådana filer? Eftersom filen var versionskontrollerad kan du hämta tillbaka den från repositoriet igen. Gör svn update så får du den senaste versionen. Uppgift 11.2 Vad svarade svn då? Använd samma kommando \lettrine för att markera början av Röda rummet i din egen latex1.tex. Kommandot \lettrine finns inte i LaTeX från början, så se till att använda paketet lettrine för att definiera kommandot. Med skalkommandot texdoc lettrine får du se dokumentationen för paketet lettrine. 3 Använd information där för att göra så att du i Röda rummet använder en röd initialbokstav. När det fungerar, så checka in den filen. * * * På http://stp.lingfil.uu.se/lila/vc/svn/ står om hur man kan starta egna projekt under Subversion här. Vissa av De lila sidorna kan bara läsas om man är inloggad på dem, för att inte säga onödigt mycket om hur våra datorer är uppsatta till allmänheten. Detta är en sådan sida. Skapa en sådan webbinloggning för att kunna läsa den. (Detta är ett exempel på ett lösenord som inte är så himla viktigt. Återanvänd inget viktigt lösenord här, t. ex. inte ditt vanliga inloggningslösen!) Uppgift 11.3 Vad står det för exempel på en svn import-rad för att starta ett projekt där? Att köra program Gå till svn-katalogen som heter som ditt användarnamn. I föräldrakatalogen, alltså din kurskata- 3 Det är bara början som riktar sig till den som ska använda paketet. I kapitel 2 där beskrivs exakt hur det fungerar under huven. 101
INLUPP 11: PROGRAM log ligger ett program som du körde från den grafiska miljön i uppgift 1.5 (s. 11). Om du istället ska köra samma program från skalet kan du använda en relativ sökväg för föräldrakatalogen. Prova! Uppgift 11.4 Hur skrev du då? Gå upp till föräldrakatalogen så att du står i samma katalog som programmet. För att köra programmet härifrån är det enklaste att använda en relativ sökväg som betyder»samma katalog«. Prova! Uppgift 11.11 Vissa delar av programmet är kommentarer de har ingen effekt på vad programmet gör, utan finns där för att underlätta läsningen och förståelsen av programmet. Vad skriver man tydligen före respektive efter kommentarer i C? Ändra i trappa.c så att den gör indrag med mellanrum istället för med understreck. Skriv make trappa för att kompilera om programmet och provkör det för att se att det stämmer, och checka sedan in den ändring du har gjort, med ett loggmeddelande som talar om vad du har ändrat. Uppgift 11.5 Hur skrev du då? Link Grammar Att kompilera Gör svn update i svn-katalogen som heter som ditt användarnamn. Det visar sig att en ny fil dyker upp trappa.c. Det är ett litet program i programspråket C. Kompilera programmet med cc trappa.c. (cc är C-kompilatorn.) Det skapas då en ny fil med det körbara programmet. Uppgift 11.6 Vad heter den fil som då skapas? Uppgift 11.7 Vad säger kommandot file att den filen är för något slags fil? Den skapade filen är ett körbart program. Kör den med /local/texts/jabberwocky som input. (Programmet accepterar inga argument, så du får lov att använda omdirigering.) Uppgift 11.8 Hur skrev du kommandot för att göra detta och hur löd resultatet? Normalt skulle man vilja att detta program vars källkod ligger i trappa.c skulle heta trappa istället. Det finns väljare till cc för att göra så istället, men tillverka istället en sådan fil trappa med hjälp av kommandot make. Kör alltså make trappa. Det skriver ut vilket kommando det i sin tur utför. Uppgift 11.9 Vilken väljare till cc använde make för att tala om vad det kompilerade programmet skulle heta? Uppgift 11.10 Om du gör make trappa igen vad får du du för meddelande från make? Såg du vad programmet gjorde med textfilen? Antagligen kan du inte C, men öppna ändå källkoden med Emacs och se om du kan gissa en del av hur programmet fungerar. Indent betyder indrag. Uppgift 11.12 I FSF och friprogramvaruvärlden talar man om fyra friheter som ska vara uppfyllda för att program ska räknas som fri programvara. Vilka är dessa fyra? (Sök på nätet.) Du har fått nys om ett program»link Grammar«som du tänker att du skulle behöva använda här. Du skulle kunna be systemadministratören, men du har en känsla av att han är så upptagen med undervisning så det är nog bäst att installera det själv istället. Sök upp den aktuella versionen av det programmet på nätet. Den senaste versionen kom nu i år, så gäller inte detta den version du har hittat så är det en för gammal version. Uppgift 11.13 Välj att ladda ner en»tarball«, dvs. ett tar-arkiv. Vad heter den filen? Lägg filen i din kurskatalog och cd:a dit i skalet. Uppgift 11.14 Ge ett kommando för att packa upp detta filarkiv. Hur lyder ditt kommando? Uppgift 11.15 I en fil där ges licensen enligt vilket programmet skrivs. Vad heter den filen? Uppgift 11.16 Vilka av de fyra friheterna i uppgift 11.12 har man som användare av detta program? Så är det»fri programvara«? Uppgift 11.17 I filen INSTALL står hur man kan installera programmet. Det är det normala sättet som nämns i detta kompendium. Mellan make och make install nämns ett extra steg som man kan göra om man vill. Hur lyder det? Installera programmet enligt instruktionerna. När configure ska köras, så gör det med --prefix ~/introduktion-till-datateknik för att lägga filerna under din kurskatalog. När du kompilerade programmet så skapades en massa filer som inte längre behövs. En del var 102
NR-grep bara mellanresultat, och de som var det resultat som du var ute efter har kopierats till en annan katalog när du installerade. Uppgift 11.18 Läs i INSTALL för att se vad du kan ge för make-kommando för att rensa bort de filer där som inte längre behövs och ge det kommandot. Vad var det? Om du går tillbaks till din kurskatalog ska du nu kunna köra programmet som bin/ link-parser. När man kör igång det får man en prompt linkparser> till vilken man dels kan ge särskilda kommandon, men också skriva engelska meningar för att få dem analyserade av programmet. Uppgift 11.19 Hur ser den första analys ut som programmet ger av meningen»your logic does not resemble our Earth logic.«? På webbsidan om programmet står även hur man kan checka ut den aktuella utvecklingsversionen av programmet. Gör så i din kurskatalog! Uppgift 11.20 att göra det? Vad gav du för kommando för Uppgift 11.21 Filen data/en/4.0.dict där innehåller huvuddelen av det engelska lexikon som systemet använder. I versionskontrolloggen för filen finns en post som innehåller»monsters«. Hur lyder den? NR-grep Du har fått nys om ett program NR-grep som är ett grep-liknande program, men som bland annat skiljer sig genom en väljare -k med vilken man kan hitta ungefärliga träffar, som kan skilja sig lite från det man letar efter. I exemplet nedan söker jag efter felstavningen»aprksimativ«i en ordlista. Först tillåter jag två skillnader, men hittar ändå inget. När jag tillåter tre skillnader hittar jag ordet. Om jag tillåter hela fyra skillnader finns det flera möjligheter. $ nrgrep -k2 '^aprksimativ$' dsso-list.txt $ nrgrep -k3 '^aprksimativ$' dsso-list.txt approximativ $ nrgrep -k4 '^aprksimativ$' dsso-list.txt approximativ approximativa approximativt predikativ presumtiv primitiv Sök upp detta program på nätet och hämta källkoden (till den senaste versionen). Flytta den till din kurskatalog och packa upp den där. Uppgift 11.22 Vad heter filen du hämtade? Uppgift 11.23 Vad gav du för kommando för att packa upp den? I katalogen du får då hittar du information om hur programmet kan installeras. Gå till den nyskapade underkatalogen och gör så. (Det kommer upp en drös varningar när programmet kompileras, men det är inget du behöver bry dig om. Ifall du vore programmets författare borde du bry dig om dem.) Uppgift 11.24 Ge ett kommando som plockar ut alla ord i dsso-list.txt som ligger högst ett steg ifrån»hund«, samt det resultat du får av detta. När man kör nrgrep -H säger den att det är free software och att man ska se»the GNU General Public License for details«, men här finns motstridig information, för det följer med en fil med programmet som innehåller upphovsrättsinformation som inte är GNU GPL utan en egen text. Uppgift 11.25 Vad heter den filen? Uppgift 11.26 Enligt vad som står om rättigheterna där finns det minst en av de fyra friheterna i uppgift 11.12 som man inte har som användare av detta program. Nämn en sådan, och förklara på vilket sätt den inte är uppfylld! Bugg i grep En student upptäckte under kapitel 9 en bugg där \> verkade tycka att ord tog slut vid t. ex. ä: $ grep 'v\>' dsso-list.txt head ablativ abonnentväxel abonnentväxeln abonnentväxelns abonnentväxels abonnentväxlar abonnentväxlarna abonnentväxlarnas abonnentväxlars abortiv Regexpet betyder v i slutet av ett ord, så de flesta svaren här är fel! 103
INLUPP 11: PROGRAM Det skulle kunna vara bra att rapportera buggen till programutvecklarna. Uppgift 11.27 Formulera en buggrapport om den buggen. Ge ett kort kommando utan onödiga detaljer som ger ett oönskat resultat. Tala om både vad det ger för resultat och vad du väntade dig för resultat istället. Du ska förstås inte använda dig av någon fil dsso-list.txt, för den har inte den som ska ta emot rapporten. Målet är att den som tar emot rapporten lätt ska kunna prova själv och se buggen. (Om det vore på riktigt skulle du skriva på engelska, men du kan skriva på svenska istället nu.) * * * Fast när man ska rapportera buggar är det ännu bättre om man först ser efter om de redan är fixade genom att jämföra med den senaste versionen. Uppgift 11.28 Vilken version av grep kör vi här? Hur tog du reda på det? Uppgift 11.29 Vilken är den senaste publicerade versionen av GNU grep? Var på webben hittade du det? (Den är från i år, så är inte den du hittade från i år har du hittat fel.) 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 GNUsättet för att installera program, och använd --prefix ~ vid konfigureringen för att få din hemkatalog som prefix. Uppgift 11.30 du då? Exakt vilka kommandon skrev Uppgift 11.31 I vilken katalog hamnade nu det nyinstallerade programmet grep? Hur kan du enklast skriva för att köra det? Uppgift 11.32 Finns buggen kvar? Vad använde du för kommando för att testa det? * * * echo Ap grep -o '[:upper:]' ger p och inte A som resultat, vilket kanske inte är vad den som skrivit så väntade sig. Uppgift 11.33 Hur kommer det sig? Uppgift 11.34 Vad får man om man kör motsvarande kommando med den senaste versionen av grep som du installerade nyss? DSSO I tidigare uppgifter har ni använt Den stora svenska ordlistan. Denna fria svenska ordlista finns inte tillgänglig nu på samma sätt som när denna uppgift skrevs, så istället för att hämta den på nätet själv får du använda den senaste versionen jag hämtade där förra året, /local/kurs/ids/dsso-1.52.txt. Uppgift 11.35 den filen? Vilken teckenkodning använder Den filen innehåller ordlistans information på ett särskilt textformat. Du får se efter själv hur innehållet i filen är upplagt. Från detta format har flera filer i andra format skapats, till exempel rättstavningsfiler till ordbehandlare. I figur 11.3 finns ett par utdrag ur filen. En sak att märka är att det bara är rader med < och > som innehåller ordformer. Lägg filen i din svn-arbetskatalog som heter som ditt användarnamn och skapa en fil dsso.sh i samma katalog. Checka in den, fast den är tom, så att jag ser att du kommit igång med denna uppgift. Här ska du skriva ett skalskript så att om du ger kommandot bash dsso.sh skapas en fil ordformer.txt som innehåller en UTF8-fil med en ordform per rad. Hoppa över flerordsuttryck från filen som»au pair«och»science fiction«. Resultatet ska vara sorterat (på svenska) och utan dubbletter. Det är alltså i stil med den dsso-list.txt som ni har använt förut, förutom att den är gjord från en tidigare version av DSSO. Använd flera skalkommandon i rad och lagra mellanresultat i filer som du tar bort i slutet av skalskriptet. Det första skulle t. ex. kunna vara ett kommando som skapar en fil dsso-u8.txt som är likadan som originalet, men omvandlad till UTF8. Senare i skalskriptet skulle du i så fall göra rm dsso-u8.txt för att rensa upp efter dig. * * * Tips: Fokusera inte på att det ska bli ett skalskript till att börja med, utan försök bara hitta kommandon för att lösa uppgiften. Sen kan du stoppa in dem i ett skript. I skalskript kan man skriva kommentarrader som börjar med»#«. Använd det för att förklara vad som händer, t. ex. med en kommentarsrad # Omvandla till UTF8 före första kommandot. Här följer några saker att kolla i ditt resultat: Skräp? 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 104
Skaluppgifter # Copyright (c) 2011 Göran Andersson # This work is licensed under the Creative Commons Attribution-Share Alike License.... 890212r5<verb>näta:näta:nätade:nätat:nätar:näta:nätas:nätades:nätats:nätas:nätad:nätat:nätats:nätande: DEFINITION 1: Göra mål, dvs bollen hamnar i målets nät.... 571187r5<adjektiv>rätt:rätt:rätt:rätta, rättan:rätta:rättare:::rätte:::::::: Figur 11.3: Utdrag ur dsso-1.52.txt. ett ord»creative«i din ordlista? Eller»dvs«för att det står t. ex. i en ordförklaring till»näta«? (Se figur 11.3!) 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! Har du»!«bland dina ordformer? Se efter hur det används i filen. Alla varianter? Tänk som exempel på en rad som den om adjektivet rätt i figur 11.3. Kolla att du fått med såväl»rättan«som»rätte«bland dina ordformer. Konstiga tecken i ord? Det kan ha känts naturligt att använda beteckningar i reguljära uttryck som betyder början-avord 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.»eau-de-cologne«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! Rapport Efter att du är klar detta så använd kommandot diff -u /local/dict/dsso-list.txt ordformer.txt för att se vilka skillnader det har blivit jämfört med den gamla listan. Skriv en kort rapport dsso.tex i LaTeX om din lösning av DSSO-uppgiften. Checka in den filen på samma ställe som det övriga. (Du ska inte lämna in den PDF du gör särskilt, utan den genererar jag själv när jag ska titta på den.) Använd dokumentklassen stupp, och \course för att ange kursnamn. Sätt lämplig titel. (Du kan ha en undertitel med \subtitle också.) Beskriv i några avsnitt uppgiften, din lösning och hur resultatet blev. I beskrivningen av lösningen så ta med hela ditt skalskript med det LaTeX-kommando som står sist i avsnitt 7.17. Avsluta med ett avsnitt där du berättar något om det resultat du fick. Berätta hur många ordformer du hittade, och tala om några tillägg och borttagningar jämfört med dsso-list.txt. 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 11.36 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 11.37 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 11.38 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. 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 http://stp.lingfil.uu.se/lila/disk/ för en del tips som har med diskanvändning att göra. 105
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 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 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 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 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 en underkatalog till en underkatalog till en underkatalog till en underkatalog till den katalogen, eller... (fnord) INLUPP 11: PROGRAM Uppgift 11.39 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 11.40 Använd samma skalkommando (med andra väljare/argument) för att lista storleken på alla filer och kataloger i din hemkatalog och sortera dessa rader i storleksordning. 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. Uppgift 11.41 Se även vad det står på de lila sidorna om att man kan lagra filer på andra ställen. Du kanske har noterat att det finns ett nobackup i din hemkatalog. Vad sägs om detta nobackup här? Uppgift 11.42 Se även tipsen där om hur man hittar stora filer som man inte använt på länge. Använd kommandot som nämns där för att lista vilka filer under din kurskatalog som är minst 500 kilobyte stora. (Visa som vanligt kommando och resultat.) I exemplet på sidan används»m«för Megabyte. Du kan använda»k«för kilobyte. Leta filer Läs i dokumentationen om kommandot find för att ta reda på hur man kan sätta krav på filnamnet för de filer som den ska hitta. Uppgift 11.44 Lista filer hos användaren ellen som har namn som slutar på.jpg. Ellen har flera kataloger som du inte får leta i, så därför får du en mängd varningar. Häng på 2>/dev/null på slutet för att slippa se varningarna. Varningar och felmeddelanden skrivs ut»för sig«och kan omdirigeras med 2> istället för >. Allt som skrivs till den speciella»filen«/dev/null i Unix försvinner i ett svart hål och kommer aldrig tillbaks. Uppgift 11.45 Det finns en särskild sökmöjlighet i find för sånt som är tomt också. 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 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 Uppgift 11.43 Lista alla filer under /usr/ share/gimp som har namn som slutar på».jpg«. 106