Python IntroduktionHer er min idé til hvordan vi lærer Python i løbet af 5 uger. De mest ihærdige studerende kan få sine ECTS-point rapportdokumenterede ved at lave ét af følgende projekter: Hello, WorldMandag den 20. November efter Network Embedded Programming ser vi på Hello World, så bring jeres egen. [løsning] De efterfølgende 'ugeopgaver' kunne vi vælge at løse til om torsdagen (igen efter Network Embedded Programming), startende fra og med den 23. November. Idéen er, at man laver opgaverne selv og diskuterer løsningerne samlet.Uge 1: Primtal med Eratosthenes Si (brug af arrays)Note: I grundlæggende python findes der ikke arrays. I stedet findes der lister, der her tilbyder lignende funktionalitet.
Uge 2: Data (brug af filer og strenge)Tag udgangspunkt i filerne uge2.conf og data.txt. Formatet af den første skal tolkes som:
filnavn : Hvorfra data skal læses. Opgaven består i følgende:
Uge 3: Navneliste (brug af hashes)Tag udgangspunkt i en navneliste som denne. Note: Python-folk kan godt lide at være centrum for alles opmærksomhed. Derfor bruger man i denne verden dictionaries og tror at hash er noget man ryger når mørket falder på. Som de veluddannede studerende vi er, bærer vi over med dem og accepterer deres særheder.
Uge 4: Dijkstra (brug af objekter)Denne opgave er markant vanskeligere at implementere end de foregående. Klasser er ikke specielt godt beskrevet. Prøv alligevel selv at finde en løsning før I ser på min løsning, det kan jo være at I finder en bedre. Note: Et godt udgangspunkt er den officielle dokumentation, selvom sproget er lidt grumset. Pointen er at klasser i Python, er defineret oven på eksisterende datastrukturer, ikke ulig hvordan Objekt Orienterede sprog blev beskrevet i kurset "Programmeringssprog". Denne arv skinner klart igennem når man arbejder med klasser i Python.
Uge 5: (Overdreven) god kodeskik (brug af egne moduler)Denne opgave er overraskende enkel hvis man finder den rette dokumentation. [hint]
Projekt 1: CGIDette projekt er opdelt i to faser. I første fase implementeres et CGI-script, der genererer et tilfældigt tal mellem to brugerdefinerede grænser. Grænserne skal naturligvis checkes og UI'en skal kune benyttes uden brug af andre HTML-sider. I anden fase skal CGI'en oprette en server-side session og i denne tælle antallet af kørsler. Dette tal skal naturligvis præsenteres for brugeren. [udgangspunkt] Løsning (fase 1): Problemet kan løses relativt simpelt, som fx her. Scriptet kan afprøves. Løsning (fase 2):Dette problem er en anelse mere interessant. Min løsning bruger modulet 'pickles' til at serialisere objekter til en sessionsfil. Den er hverken sikker (sessionsnøglen hashes) eller stabil (sessions-filen låses ikke under skrivning). Session og user-agent associeres vha. en cookie. Scriptet kan afprøves. Projekt 2: .NETImplementér den oprindelige Eratosthenes Si (fra uge 1) i IronPython. Dette er en Python-implementation, der kører oven på '.NET'. Løsning: Den lette løsning er simpelthen at skifte fortolker; så virker løsningen fra uge 1. Men eftersom Microsoft's fortolker ikke lader til at være specielt shebang-venlig er vi nødt til at gøre tingene på den kedelige måde:
$ ipy primes1iron1.py 40 Her er løsningen blevet strippet for den overflødige shebang. Eftersom løsningen er ren Python kan man vist sagtens kalde den lidt kedelig. I stedet for at bruge Python's indbyggede print kan vi eksempelvis bruge .NET's System.Console.WriteLine. Denne implementation køres på samme måde. Lidt benchmarking på en 2.0GHz iP4m:
$ time ./primes1.py 10000000 > /dev/null Projekt 3: Client/ServerLav et client/server system, således at klienten fungerer som en remote-promt på serveren. Hver gang man på klientsiden trykker på enter sendes den streng man har skrevet til serveren. Denne eksekverer strengen og returnerer STDOUT (og eventuelt STDERR) til klienten. Herefter kan klienten så give ny ordre. Løsning: Implementationen benytter sig af stream-baserede INET sockets. Der er en server og en klient. Eksempel på kørsel følger. klient-siden:
$ ./remoteshell_client.py localhost 1111 server-siden:
$ ./remoteshell_server.py 1111 |