INF105 gruppetime 02

☛ Hver del etter del 0 kan gjøres separat i tilfeldig rekkefølge

Del 0 - Alpine klar til bruk

Din virtuell maskin med Alpine er klar når

Nyttige verktøy

Nå kan vi installere noen nyttige programmer. Alpine sin package manager heter apk, og vi skal hente en editor som heter nano:

apk add nano

Så bruker vi nano til å editere listen av kildene som apk bruker, for å få et større utvalg av pakker:

nano /etc/apk/repositories
Fjern kommentarsymbolet # foran "community"-linjen og tast CTRL-x for å lagre endringer. Vi må oppdatere pakkelisten med
apk update

Nå kan vi legge til python, numpy, xxd (for å se på byte-innholdet til filer), og curl, et nyttig verktøy for å laste ned fra nettsider:

apk add python3 py3-numpy xxd curl

Liten skriftstørrelse?

Om skriften er veldig liten, kan du redusere skjermstørrelsen i din virtuell maskin, eller følge stegene 1.-4. her: bytte font til Alpine-konsolen

Del 1 - Binærtall / hex

Øv deg litt på oversetting mellom binær og hex. Gjør det manuelt først før du sjekker i python med f.eks hex(0b1101) eller bin(0xAA)!

0x35 =
0xFD =
0x7F =
0x80 =
0x8A =
0b00001100 =
0b11100110 =
0b00010000 =

Hvilket tall kommer etter? (samme notasjon)

0x02 ...
0x09 ...
0x0f ...
0x99 ...
0x9f ...
0xff ... (her er det 2 mulige svar. hvorfor?)
0b0111 ...

Del 2 - (Un)signed integers

Python sin innebygde "int" implementerer heltall i software, uten begrensninger. For å leke med heltall med fast lagringsstørrelse kan vi bruke Python-pakken numpy. Vi starter en python-shell og importerer numpy med avkortning np:

python
>>> import numpy as np
>>> 

Nå kan vi lage en variabel av en fast størrelse ved bruk av np.uintX() eller np.intX() der vi erstatter X med antallet bits vi skal bruke til lagring (8,16,32,64).

>>> x = np.uint8(120)
>>> x
np.uint8(120)
>>> 5 * x
np.uint8(88)
>>> np.uint8(255) + 1
np.uint8(0)  
>>> np.int8(np.uint8(130))
np.int8(-126)
Gir hver output mening? Utforsk andre størrelser, hvor er overflow-punktet til int16, int32, osv...?

Gå dypere

I forelesningen snakket vi om noen feil med bankkontoer. Dette skjedde noen få ganger ved omstillingen fra 32-bit- til 64-bit-maskiner. Denne python-sekvensen viser problemet:

lagre_endring    = np.int32(-1000).tobytes()
lagre_noe_annet  = np.int32(10).tobytes()
minne            = lagre_endring + lagre_noe_annet
lese_som_64bit   = np.frombuffer(minne, np.int64)
Se på verdiene. Kan du forklare hva som skjer her? (Rekkefølgen til bytesene har med "little-endian" vs. "big-endian" å gjøre, søk info om dette)

Del 3 - Tekstkoding

Bytte codepages

Åpne python og lek litt med de innebygde encode()- og decode()-funksjonene:

>>> 'blå'.encode('iso8859-1').decode('iso8859-7')
'blε'
>>> 'blå'.encode('utf-8').decode('iso8859-1')
'blå'
Prøv ulike codepages, ulike iso8859-NN (finn Euro-tegnet, sammenligne mellom -1 og -15), cp1252, ascii, utf-8, etc. Hva slags data får du etter bare 'encode' eller 'decode'?

.txt filer

Bruk nano for å lage en kort textfil som inneholder noen ikke-ascii tegn. Så se på outputet til denne filen med xxd:

nano hello.txt
[... skriv noe, lagre med ctrl-x ...]
xxd hello.txt
Hva er det du ser?

Utforsk noen av de andre xxd opsjonene (xxd -h viser en liste)

Lage bytes på hånd

Bruk nano for å lage en fil "jam.txt" med dette innholdet:

62 6c c3 a5 62 c3 a6 72 73 79 6c 74 65 74 c3 b8 79 21 0a

xxd kan tolke denne tekstfilen og skriver resultatet som en ny fil hello.txt:

xxd -r -ps jam.txt hello.txt

Se på

cat jam.txt
cat hello.txt
xxd jam.txt
xxd hello.txt
Hva har skjedd når vi kjørte 'xxd -r -ps' her? Bruk nano til å endre noen verdier i jam.txt, og gjenta stegene.

Del 4 - Manuell UTF-8 koding av Unicode

Coding table showing the encoding of unicode code points in 1-4 bytes.

Encode

Velg din favorittglyph på Unicode Charts og skriv ned hvilket codepoint det er. F.eks er en uheldig egyptisk gartner U+13515.

Bruk tabellen manuelt for å lage en UTF-8 bytesekvens til den og så sjekk i python:

    '\U00013515'.encode('utf-8')

Decode

Bytt bytesekvensen med noen, og bruk tabellen til å dekodere manuelt. Når du har funnet U+.... codepoint, søk på den øverst på Unicode Charts. Python også har databasen innebygd, selv om ikke alle glyphs kan vises i alle skjermskrifter:
>>> '\U00013515' # vises kun hvis glyph er med i valgt skrifttype
>>> import unicodedata as ud
>>> ud.name('\U00013515')

0.1 + 0.2

Åpne python shell og prøv

0.1+0.2==0.3