☛ Hver del etter del 0 kan gjøres separat i tilfeldig rekkefølge
Din virtuell maskin med Alpine er klar når
ping -c3 1.1.1.1viser "0% packet loss"
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/repositoriesFjern 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
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
Ø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 ...
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...?
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)
Å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'?
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.txtHva er det du ser?
Utforsk noen av de andre xxd opsjonene (xxd -h viser en liste)
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.txtHva har skjedd når vi kjørte 'xxd -r -ps' her? Bruk nano til å endre noen verdier i jam.txt, og gjenta stegene.
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')
>>> '\U00013515' # vises kun hvis glyph er med i valgt skrifttype
>>> import unicodedata as ud
>>> ud.name('\U00013515')
Åpne python shell og prøv
0.1+0.2==0.3