Uke 4 - Binære tall og Full Adder; filbehandling og filrettigheter

Oppgaver til mandag 20. - fredag 24. jan

I første del av oppgavene skal du lage en simulering som legger sammen to tall på nøyaktig samme måte som det gjøres med fysiske kretser inne i en ekte CPU.

Etterpå går vi dypere inn på shell-kommandospråket bash med mange småoppgaver for å drille inn Linux-kommandoer og noen litt vanskligere for å forstå katalogstrukturer bedre. Se linken 'Linux kommando oversikt' under 'Linux hjelp'-linken på kurshjemmesiden om du ikke finner løsningen. Det kan være nyttig å lese 'Nyttige praktiske tips om bruk av Linux ' som også er en link under 'Linux hjelp'-linken.

NB! Oppgaven som omtales som ukens skrekk er bare for folk med gode nerver og som ikke lider av klaustrofobi. Du blir fanget nede i en katalog; en skjæbne værre enn døden! Tidligere år har mange blitt sittende fast i timesvis; klarer du å bryte deg ut av fengselet?

Alle oppgaver som er merket med (Oblig), skal inngå i rapporten dere skal levere på Canvas som en del av den første obligatoriske innleveringen. Rapporten kan gjerne være kortfattet. Merk hver oppgave med ukenummer og oppgavenummer av typen 4.2 som betyr andre oppgave i uke 4 (denne uken).

  1. (Oblig) Utfør addisjonen 5 + 5 = 10 med binære tall for hånd ved å bruke den samme addisjonsmetoden som man bruker når man legger sammen desimaltall med penn og papir.
  2. (Oblig) Se på hva som skjer når man legger sammen to siffer X og Y som står under hverandre i denne algoritmen. Anta at z er mente fra forrige operasjon til høyre for sifferene vi behandler, sifferet under streken blir S og c blir mente til neste operasjon, slik det er vist i figuren under:

    Sett på grunnlag av dette opp en sannhetstabell som viser hva output S og c må bli for alle verdier av X, Y og z.
  3. (Oblig)

    Hva blir den boolske funksjonen F som funksjon av A og B i figuren under? Skriv ned det boolske uttrykket.

  4. (Oblig)

    Forenkle det boolske uttrykket for F i forrige oppgave så mye som mulig.

  5. (Oblig) Last ned makroen FullAdder.dwm og vis at den oppfyller sannhetstabellen du satte opp i forrige oppgave. Velg File - New Macro, klikk på Embed Macro-ikonet i menyen, klikk midt på siden og velg så FullAdder.dwm. Koble til Interactive Input til X, Y og z og LED til S og c. (klikk på LED-ikonet og plasser det, trekk deretter opp en tråd mellom S og LED med hjelp av Wiring Tool helt til høyre i menyen). Verifiser deretter at sannhetstabellen blir riktig.
  6. Ukens utfordring! Sett sammen tre slike FullAdder-makroer til en krets som du kan bruke til å utføre summen 3+7=10.
  7. Tegn en krets med AND, OR og NOT-porter som gir funksjonen F = A + A · B.
  8. Hva er path? Finn ut hva som er full path til programmet som startes når du gir kommandoen diff og les manualsiden for denne kommandoen.
  9. (Oblig) Gå til katalogen /usr/bin ved å bruke absolutt path.
  10. (Oblig) Gå til hjemmekatlogen din. Gå deretter til katalogen /usr/bin ved å bruke relativ path.
  11. (Oblig) Lag to filer med følgende innhold
    haugerud@data2500:~$ cat fa.txt 
    1a
    2a
    3a
    4a
    5a
    haugerud@data2500:~$ cat fb.txt 
    1a
    2a
    3a
    4b
    5a
    
    og kjør kommandoen
    haugerud@data2500:~$ diff fa.txt fb.txt  
    
    Forklar hvordan innholdet av det du får fra kommandoen diff viser forskjellen på filene.
  12. Lag en katalog med navn 'test' i oblig1-katalogen du lagde i forrige uke. Kopier deretter katlogen oblig1 med alle filer og underkataloger til katalogen oblig2 (oblig2 skal ikke eksistere fra før). Sjekk at alt ble kopiert til den nye katalogen oblig2. Hva skjer om du utfører kopieringen av oblig1 til oblig2 en gang til (med samme kommando)?
  13. (Oblig) Utfør følgende Linux-kommandoer i en tom mappe:
    mkdir tex
    mkdir oblig
    mv oblig tex
    mkdir oblig
    mv tex oblig
    
    Bruk kommandoen tree eller tegn en liten skisse som viser katalogstrukturen i den tidligere tomme katalogen, med navn på alle katalogene etterat disse kommandoene er utført og prøv å forstå hva som skjedde.
  14. Gå til roten (/) av systemet. Finn minst tre forskjellige måter å gå tilbake til hjemmektalogen din på.
  15. (Oblig) Skriv kommandoen echo bla bla bla > newfile, og bruk more for å se på filens innhold. Kan du forklare hva som har skjedd? Dette kalles redirection.
  16. Editer filen .bashrc i din hjemmekatalog slik at neste gang du starter et shell blir rm en alias til rm -i (alias er en såkalt shell builtin kommando(prøv type alias) og disse har ikke egen alias men er omtalt i manualsiden for bash. Enklere enn å bla i denne store manualsiden er det å prøve help alias kommandoen) og bash-promptet endret fra deafult formen "[brukernavn]@host$ " til "OS-navn:hostname$". Lag filen med $ jed ~/.bashrc om du ikke har den fra før og skriv inn kommandoer. Disse kommandoene vil utføres hver gang du starter et nytt shell (hint: finn ut hvordan promptet settes i /etc/profile; let etter PS1. Søk eventuelt på web med søkeord 'bashrc' og 'prompt' for å finne alle muligheter).
  17. Man-siden til en kommando inneholder ofte enormt mye informasjon. Da kan det være greit å lære seg å navigere siden litt bedre enn bare pil opp/ned. Her er noen triks du burde prøve: Søke etter tekst: Skriv "/", legg merke til at du nede i venstre hjørne kan skrive hvilken tekst du leter etter. Trykk enter for å hoppe til første forekomst. Trykk "n" for å hoppe til neste forekomst.
  18. Søk vil bare lete nedover i teksten. Derfor kan det være greit å hoppe til start/slutt. Prøv "g" og "G".

    Forbedre verktøyet fra forrige uke: Scriptet som vi laget i forrige ukesoppgave hadde noen feil som kan forbedres.

    De neste oppgavene skal handle om å fikse feilene vi gjorde i scriptet vi lagde i forrige uke. For det første må vi fortelle kommandoen grep at den bare skal sjekke brukernavnet mot det aller første ordet i hver linje fra "ps aux".

  19. Begrunn hvorfor vi skal matche det første ordet i hver linje fra "ps aux" og ikke hele linjen
  20. Se i man-siden til grep om "REGULAR EXPRESSIONS" (husk tidligere oppgave om å navigere i man-sider). Se spesielt på 8. avsnitt i det kapittelet. Hva sier det avsnittet om hvordan begynnelsen og slutten av en linje kan bli repressentert i grep?
  21. Prøv å kjøre "ps aux | grep ..." manuelt og se om du kan matche et brukernavn når det står helt i starten av en linje.
  22. Bruk det du har lært til å modifisere scriptet ditt.
  23. Komandoen "watch" kan brukes for å kjøre en annen kommando om og om igjen. Ta en titt på den korte man-siden til watch og vis hvordan man kan kjøre scriptet ditt ved hjelp av watch til å oppdatere seg hvert 10. sekund.
  24. (Oblig) Lag først en fil hemmelig.txt. Utfør en Linux-kommando som setter filrettighetene for filen hemmelig.txt slik at eieren av filen (du) kun kan lese den, mens alle andre ikke har noen rettigheter.
  25. Lag først en fil fil.txt. Utfør en Linux-kommando som setter filrettighetene for filen fil.txt slik at eieren av filen (du) har alle rettigheter, medlemmer av filens gruppe har alle rettigheter untatt å skrive til filen, og alle andre kun kan lese den.
  26. Logg inn på data2500. Mappen www finnes ikke fra før, så lag først mappen med noen undermapper og filer. Endre rettighetene til katalogen www øverst på ditt hjemmeområde og til alle dens filer og underkataloger, slik at du har alle rettigheter mens gruppen og alle andre kun kan lese og kjøre filer under www.
  27. Hva blir rettighetene til en ny fil du lager med touch? Blir rettighetene de samme om du bruker en editor til å lage en ny fil? Bruk kommandoen umask til å sørge for at nye filer som lages kun kan leses og skrives til av eieren, mens alle andre ikke får noen rettigheter.
  28. (Oblig) Ukens skrekk!

    Denne oppgaven er litt skummel og anbefales ikke å gjøres alene i mørke vinterkvelder..... Utfør følgende kommandoer på din konto på data2500:
    $ cd
    $ mkdir fengsel
    $ cd fengsel
    $ chmod 055 ..
    $ chmod 055 .
    $ ls
    $ cd ..
    $ cd
    
    Hjelp! Hvordan kommer du deg ut av dette?
    $ chmod 755 .
    $ chmod 755 ..
    
    fikser vel biffen, eller? Mist ikke motet! Noen alternativer:

    Forklar kort hva som skjedde og hvorfor du ble fengslet, når du har kommet ut igjen.

  29. Ukens nøtt nr. 1:

    Start jed og lagre en fil med navn #fil.txt. Gå ut av jed og prøv å fjerne filen. Hva tror du problemet skyldes? Hvordan kan du fjerne den fra kommandolinjen?
  30. Ukens nøtt nr. 2: Prøv kommandoen
    seq 5 10
    
    og finn ut hva den gjør. Lag følgende shell-script og prøv å forstå hva det gjør:
    #! /bin/bash
    
    for i in $(seq 5 10)
    do
       echo "Nr $i"
    done
    
    Prøv kommandoen
    ping -c 1 -w 1 10.196.10.11 | grep icmp
    
    og finn ut hva den gjør. Se man ping. Bruk det du har lært i denne oppgaven til å lage et script som sender ping til alle IP'er mellom 10.196.10.11 og 10.196.10.20 og skriver ut en linje fra alle som svarer. Hvordan teller du antall som svarer?
  31. Ukens harde nøtt: Kommandoen type viser i hvilket directory en kommando ligger. type søker i alle directories i $PATH variabelen men slutter å søke når den finner en fil som matcher. Lag en bedre kommando alltype som skriver ut alle kommandoene med et visst navn - ikke bare den første dersom det finnes flere kommandoer med samme navn. Hint: IFS=: gjør at for splitter opp $PATH etter hvert kolon og ikke mellomrom som er default. $PATH angir alle katalogene som et shell leter i når det skal utføre en kommando. Testen if [ -x $fil ] ; then slår til om $fil er kjørbar. Hint: I bash refererer variabelen $1 til første argument som blir gitt til et script. Kall følgende script arg.bash:
    #!/bin/bash
    
    echo $1
    
    og kjør det med $ arg.bash argument. Du kan teste scriptet ved å lete etter whoami som finnes i to mapper.
  32. Ukens hardeste nøtt: Innen Linux er det forskjell på store og små bokstaver. Utvid scriptet i den forrige oppgaven til å matche filer med både store og små bokstaver og kall det anytype. F.eks. skal anytype mail finne mail, Mail, eventuelt MAIL og også rmail, kmail, sendmail etc. Hint: bruk echo til å vise alle kommandoer og bruk grep -i for å filtrerer bort alt unntatt 'mail'.
  33. (Oblig) Gjør først et forsøk selv på ukens harde og hardeste nøtt og gjør så et forsøk med ChatGPT (https://ki-chat.sikt.no/) ved å kopiere og paste inn oppgaveteksten. Sjekk at løsningen ChatGPT gir faktisk virker i praksis. Vurder om du lærte noe av denne måten å gjøre oppgaven på. Ville et Google-søk gjort samme nytten? Husk at til eksamen så vil hverken ChatGPT eller Google være tilgjengelig. Men du vil få tilgang til et Linux shell der du kan kjøre kommandoer og script i Inspera.