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