#ubuntu-nl-klas 2011-04-27
<leoquant> is er belangstelling voor een workshop IRC?
<leoquant> ok bij deze afgelast
#ubuntu-nl-klas 2011-04-28
<mel> hoi
<Guest82860> hallo
#ubuntu-nl-klas 2011-04-30
<puckipedia> /quit
<leoquant> zo, nu even afwachten of er publiek is deze avond
<commandoline> Mooi dat jullie er weer allemaal zijn, en welkom bij de 12e pythonles!
<commandoline> goed, het huiswerk voor vandaag was niet veel
<commandoline> maar ik wil nog wel even vragen of iemand wat te vragen heeft over tuples, keyword arguments en/of PEP8
<commandoline> nou, zo snel zijn  we nog nooit klaar geweest met het huiswerk :P
<StefandeVries> dat moeten we vaker doen :P
<commandoline> ok, deze les is de laatste les waarin jullie echt nieuwe dingen zullen leren
<commandoline> maar er is volgende week nog wel les
<commandoline> dit staat er voor vandaag op het programma:
<commandoline> - decorators
<commandoline> - een aantal modules
<commandoline> te beginnen met decorators, ik wil die uitleggen aan de hand van een voorbeeld.
<leoquant> hannie> gaan we nog leren webpagina's te maken?
<StefandeVries> Nee, hannie, dat niet meer. Dat zou te diep gaan voor een beginnerscursus
<commandoline> maar misschien dat we volgende week wel alvast een tipje van de sluier oplichten.
<commandoline> http://typewith.me/ep/pad/view/ro.6e1a1ZfrVlf/latest
<commandoline> ok, jullie zien dat ik een simpele class heb gemaakt
<commandoline> die class moet een rechthoek voorstellen
<commandoline> de class heeft twee properties, lengte en breedte, en die kunnen we gebruiken
<commandoline> handig, maar wat als we oppervlakte willen weten?
<commandoline> die property zou iedere keer bijgewerkt moeten worden als we lengte of breedte aan zouden passen
<commandoline> dat is niet erg handig
<commandoline> een alternatief zou zijn om een method te maken
<commandoline> iets als:
<commandoline> verkrijg_oppervlakte()
<commandoline> het nadeel is dat dat minder 'mooi' staat dan een echte property
<commandoline> daarvoor is een oplossing, die ik jullie nu ga laten zien.
<commandoline> goed, ik heb nu een normale method gemaakt, eigenlijk wat ik net beschreef
<commandoline> nu wil ik er een property van maken
<commandoline> dat heb ik nu gedaan
<commandoline> wat er ongeveer gebeurt
<commandoline> het methodobject 'oppervlakte' wordt door property() omgezet in een object dat zich voordoet als een normale property
<commandoline> zoals lengte en breedte
<commandoline> en dat object vervangt dan het oorspronkelijke oppervlakte
<commandoline> dat maakt mogelijk wat ik nu ga typen.
<StefandeVries> hannie> de eigenschap is hier dus lengte * breedte?
<StefandeVries> Inderdaad, hannie
<commandoline> het resultaat van deze code is '20' en '600'
<StefandeVries> <Dooitze> Wat doet die property nou?
<StefandeVries> Die property zorgt ervoor dat je de returnwaarde van de functie als variabele(property) kunt benaderen
<commandoline> ok, tot nu toe is er nog geen decorator bij betrokken geweest
<commandoline> we kunnen de regel 'oppervlakte = property(oppervlakte)' vervangen door iets anders
<commandoline> en dat wordt een decorator genoemd
<commandoline> en dat is nu gebeurt
<commandoline> @property betekent 'voer op deze method de property functie uit, en sla het resultaat op in de naam van die method'
<commandoline> we hadden i.p.v. property ook een andere functie kunnen gebruiken, zoals jullie straks zullen zien
<commandoline> dat zorgt dan natuurlijk wel voor een ander resultaat.
<commandoline> ik ga jullie nu een andere veelgebruikte decorator laten zien
<commandoline> @staticmethod
<commandoline> een static method is een method (van een class, zoals altijd) die geen 'self' meekrijgt
<commandoline> en dus niks kan veranderen aan een object
<commandoline> je kan het wel zien als een functie die aan een class wordt gehangen.
<commandoline> je hebt om een static method aan te roepen dan ook geen instantie nodig
<commandoline> goed, een voorbeeldje in het typewith.me bestand
<commandoline> http://typewith.me/3caWKjndO1 (voor de nieuwkomers)
<commandoline> wat jullie zien is dat ik twee rechthoeken aanmaak
<commandoline> en dat ik die vergelijk d.m.v. een static method van het object Rechthoek
<commandoline> groter() is eigenlijk gewoon een functie, die ik aan Rechthoek heb gehangen omdat hij daar zo goed bij past
<commandoline> maar hij had er net zo goed naast kunnen staan.
<commandoline> ok, nog een voorbeeld, een soort 'alternatieve constructor'
<commandoline> een vierkant heeft gelijke zijden, dus de 'constructor' voor een vierkant heeft maar Ã©Ã©n argument nodig
<commandoline> dat wordt vervolgens gewoon 2x doorgegeven aan de Ã©chte Rechthoek constructor.
<commandoline> ok, dat is alles wat ik over decorators en de twee voorbeelden daarvan te melden heb, vragen tot zover?
<StefandeVries> hannie> Het is duidelijk, maar ik moet er wel mee gaan stoeien
<StefandeVries> De praktijk is de beste leermeester ;)
<commandoline> idd :)
<commandoline> ok, dan gaan we verder naar onderwerp twee van vandaag: modules
<commandoline> jullie hebben al een aantal modules gezien, maar ik wil jullie er vandaag nog een aantal laten zien
<commandoline> maar eerst even een linkje: http://docs.python.org/library/index.html
<commandoline> de documentatie van python voor alle met python meegeleverde modules
<commandoline> daarin kan je alle functies en classes die ik gebruik uit de python modules vandaag nazoeken
<commandoline> zodat je precies weet wat ze doen
<commandoline> ik raad aan om dat een keertje te doen, zodat je straks ook modules kan gebruiken die ik niet heb uitgelegd door de documentatie ervan te lezen
<commandoline> er zijn namelijk veel meer nuttige modules dan ik in een cursus kan laten zien.
<StefandeVries> we zouden er 2 cursussen mee kunnen vullen :)
<commandoline> http://paste.ubuntu.com/601417/
<commandoline> ik wil de modules van vandaag uitleggen aan de hand van twee voorbeelden
<commandoline> het eerste voorbeeld haalt de titels van blogartikels van de planet van ubuntu-nl op, en laat die op het scherm zien.
<commandoline> even wat termen verduidelijken:
<commandoline> planet van ubuntu-nl: http://planet.ubuntu-nl.org/
<commandoline> RSS: een op de taal XML gebaseerde manier om bijv. nieuwsberichten te beschrijven
<commandoline> de link van de 'RSS feed' van de Ubuntu-NL planet staat hier: http://planet.ubuntu-nl.org/rss20.xml
<commandoline> als je die opent in je browser krijg je waarschijnlijk een soort grafisch overzicht
<commandoline> alleen dat krijgen we niet van python als invoer
<commandoline> wat we te zien krijgen is de broncode van die pagina, en die ziet er zo uit:
<commandoline> http://paste.ubuntu.com/601419/
<StefandeVries> <hannie> Wat betekent de u voor '\n'?
<StefandeVries> Die u zorgt ervoor dat in welk schrift de website ook zou staan, de '\n' altijd een nieuwe regel is; Chinees, Cyrillisch, etc.
<commandoline> goed, terug naar het pythonprogramma
<commandoline> eerst importeren we twee modules:
<commandoline> - urllib2
<commandoline> - xml.dom.minidom
<commandoline> met de eerste kunnen we documenten van internet (http) ophalen
<commandoline> bijv. een webpagina, of hier dus, een rss feed
<commandoline> met de tweede kunnen we xml omzetten in objecten (parsen), en aangezien rss gebaseerd is op xml, kunnen we er ook rss mee lezen
<commandoline> op regel 4 haal ik m.b.v. urllib2 de pagina op.
<commandoline> wat die functie teruggeeft is een soort file-object
<commandoline> ik kan er bijv. .read() op aanroepen om de data in een string te krijgen
<commandoline> maar dat doe ik niet
<commandoline> want xml.dom.minidom kan als invoer precies zo'n file object verwerken
<commandoline> dat gebeurt op regel 7
<commandoline> 'dom' is nu een object dat we kunnen gebruiken om de data uit het xml-bestand te lezen
<commandoline> (dom betekent Document Object Model)
<commandoline> we halen alle blokken tekst tussen <title></title> op, en dat zijn er meerdere.
<commandoline> op regel 9 lopen we door al die 'titles' heen
<commandoline> er zitten een paar titles teveel tussen
<commandoline> daarom gebruik ik if:
<commandoline> if title.parentNode.tagName == "item":
<commandoline> parentNode geeft de 'tag' waar de huidige title in staat
<commandoline> als je dat niet begrijpt, geen probleem
<commandoline> ga ervan uit dat het gewoon nodig is hier om alle goede data te krijgen
<commandoline> als aan die voorwaarde is voldaan, gebeurt het volgende:
<commandoline> result.append(title.childNodes[0].nodeValue)
<commandoline> relevant is 'title.childNodes[0].nodeValue'
<commandoline> dat is een ingewikkelde xml.dom.minidom notatie voor 'geef me alle tekst binnen <title></title>'
<commandoline> en die tekst (string) wordt dus toegevoegd aan result
<commandoline> daarna wordt het resultaat alleen nog maar uitgeprint naar de terminal
<commandoline> vragen over dit programma?
<commandoline> ok, dan gaan we over naar het huiwerk, daar wil ik nog even wat uitlegtijd bij hebben
<leoquant> dat kan
<commandoline> leoquant: bedankt :P
<commandoline> http://paste.ubuntu.com/601425/
<commandoline> * huiswerk
<commandoline> ik heb jullie hier een kant en klaar pythonprogramma gegeven, dat ik een behoorlijke tijd terug heb geschreven
<commandoline> het bevat geen commentaar, niet zo netjes.
<commandoline> nou wil ik jullie vragen om dat te doen, waardoor je begrijpt welke modulefunctie wat doet.
<commandoline> het voorbeeld maakt gebruik van de sqlite3 module
<commandoline> met die module kun je een database aanmaken
<commandoline> een database die je kan benaderen via SQL
<commandoline> dat is een taal speciaal geschreven voor databases
<commandoline> die taal is niet moeilijk, maar valt wel buiten deze cursus
<commandoline> dus daarom zal ik de stukken programma in sql even uitleggen
<commandoline> CREATE TABLE IF NOT EXISTS books (id INTEGER PRIMARY KEY, title TEXT, writer TEXT)
<commandoline> betekent 'maak een database, als die niet al bestaat, waarin ik een boekenverzameling in op kan slaan'
<commandoline> (zeg maar wat gegevens over de boeken)
<commandoline> INSERT INTO books VALUES (null, ?, ?)
<commandoline> betekent 'stop in de database 'boeken' de data (null, ?, ?)'
<commandoline> ik zou wel graag willen dat jullie uitzoeken wat die vraagtekens doen.
<commandoline> want dat is onderdeel van het pythondeel van de opdracht :)
<commandoline> SELECT * FROM books WHERE title = ?
<commandoline> geef alle boeken waar de titel ? is
<commandoline> SELECT * FROM books WHERE writer = ?
<commandoline> idem, maar dan met de schrijver
<commandoline> SELECT * FROM books
<commandoline> geeft alle boeken terug
<commandoline> ok, daarmee zijn we klaar met de complete basis van python!
<leoquant> congrats!
<commandoline> als je met een idee rondliep voor deze cursus van een programma dat je wil schrijven, dan zou ik dat proberen uit te voeren
<leoquant> en allebei zeeeer bedankt!
<commandoline> dan kan ik over *2 weken* nog even helpen met een aantal dingen
<commandoline> als er vragen ontstaan.
<leoquant> vind het geweldig opgezet
<commandoline> de volgende (laatste) les is over 2 weken (ondanks wat ik eerder zei)
<leoquant> ja dat wou ik net nog even vragen..:)
<commandoline> nog Ã©Ã©n ding
<commandoline> (20:28:42) hannie: Moet de uitleg in het Engels?
<commandoline> die vraag is waarschijnlijk gebaseerd op het feit dat de programma's van vandaag in het Engels zijn
<commandoline> en de rest in het Nederlands was.
<commandoline> dat heb ik gedaan om het makkelijker te maken, maar als je Engels kan schrijven (evt. met wat opzoeken), zou ik zeker Engelse programma's schrijven
<commandoline> het maakt het veel makkelijker om (internationaal) samen te werken aan programma's.
<commandoline> ok, dat was het voor vandaag, tot over twee weken, en bedankt voor jullie komst!
* ChanServ changed the topic of #ubuntu-nl-klas to: Zaterdag 30-04-11 19.30-20.30 workshop PYTHON:  #Ubuntu-nl-klas |  Info: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/BasiscursusPython | Leiding: commandoline en stefandevries | Logs op http://irclogs.ubuntu.com | Let ook op eventueel andere workshops| Alle cursisten join ook: #ubuntu-nl-mwanzo, daar kun je vragen stellen aan de workshopleider.
