#ubuntu-nl-mwanzo-klas 2011-03-14
<leoquant> exalt!
<leoquant> ben je hier neergestreken
<Cugel> Hij is Overal.
<leoquant> oei....
<leoquant> wee U
<exalt> hey hoi
<leoquant> ha ik miste u reeds...
<exalt> leoquant, ohh? ik was inderdaad wat minder online
<leoquant> zo gaat dat idd
<exalt> deze man werkt tegen woordig hard om zijn stage mensen tevreden te stellen
<leoquant> perfect
<leoquant> lets work, be proud stand tall
<leoquant> song...?
<exalt> en dan heeft hij soms meer behoefte aan een film of de glimp van het liefdevolle gezichtje van zijn vriendin.
<exalt> leoquant, had je gehoord dat ik niet door ben :O
<exalt> ik ben niet stem gerechtig
<leoquant> hehe ach exalt....
<leoquant> tuurlijk heb je een stem
<leoquant> ik hoor u
<leoquant> ik neem aan dat de raad
<StefandeVries> En anders stemt leoquant wel voor u
<leoquant> niet voor eeuwig zitting neemt?
<exalt> neen sense ( en vijf andere ) vond dat ik tekort actief was, 6 jaar ofzo :P
<exalt> leoquant, ik overdrijf...
<leoquant> nee, zo was het niet echt toch.....
<exalt> sense vond het niet leuk :D
<exalt> leoquant, ik zal eens even zijn reden hier plakken vanuit de email
<leoquant> weet je exalt het was wel heel erg gecommuniceerd met iedereen
<leoquant> nou nee
<leoquant> niet uit vertrouwlijke mail citeren
<leoquant> toch?
<exalt> die mail was toch namens het panel ?
<leoquant> verder moet je je het zo voorstellen
<leoquant> dat de raad veel voor zijn kiezen krijgt
<leoquant> in het begin
<leoquant> en alles wat ik nu zeg is niet slim
<leoquant> want ik ben verkiesbaar
<leoquant> maar wil geen "reclame"maken
<exalt> hah :P, leoquant er was inderdaad 1 die voor gekozen heeft inderdaad
<leoquant> als je echt wilt kom je er ook in: iets bestuurlijks
<leoquant> nogmaals men zit er niet eeuwig
<leoquant> maar dat wil wel zeggen
<leoquant> dat ik het jammer vindt
<leoquant> dat je boos/teleurgesreld bent
<exalt> leoquant, en de reactie van mij en foad was ook meer als een vuurproef. onze inschrijving verliep niet geheel serieus, waar het ons om ging was hoe het gebracht werd.
<leoquant> hadden jullie dan geen idee van die lijst, and if, zo laat
<leoquant> die plannen waren stokoud
<leoquant> planet/forum/mailinglist
<leoquant> het op het 8 uur journaal
<leoquant> was
<leoquant> nah
<leoquant> ik hoop dat jij mwanzo mens/lid blijft
<exalt> jahoor
<leoquant> goed nieuws
<leoquant> daar neem ik er 1 op
 * StefandeVries haalt de tap tevoorschijn
<exalt> we zijn IRC en real life, forums en mailing lists gaan me te traag
<leoquant> weet ik
<leoquant> irc gaat mij te snel...:)
<StefandeVries> om die reden heb ik het forum vaarwel gezegd
<StefandeVries> te veel gesoebat
<leoquant> kan idd
<leoquant> spijkers laag water
<StefandeVries> Jup
<leoquant> woorden weegschaaltjes
<StefandeVries> slakken en zout..
<exalt> muizen en olifanten
<leoquant> mja...we doen gewoon buntu klaar
<leoquant> OEbuntOE
<StefandeVries> En daar zijn we trots op, en we doen het graag
<leoquant> soms met veel BOE
<StefandeVries> =)
<leoquant> :P
<StefandeVries> ja toch? :P
<leoquant> greetz allen
<leoquant> ik ga tot morgen
<leoquant> misschien
<StefandeVries> okÃ©, leoquant
<leoquant> doeg
<StefandeVries> tot later iig ;)
<exalt> later
#ubuntu-nl-mwanzo-klas 2011-03-19
<FOAD> Zo.
<leoquant>   
<commandoline> Welkom allemaal, het is 19:30, dus laten we beginnen.
<commandoline> laten we beginnen met het huiswerk van vorige keer bespreken, voordat we in een nieuw onderwerp duiken
<commandoline> en daarvoor mag ik FOAD vandaag uitnodigen :)
<FOAD> Dank u, dank u.
<FOAD> Ik heb mijn poging op http://paste.ubuntu.com/582571/ geplaatst.  Vergeef me de idiosyncratische tekst maar.
<FOAD> Eigenlijk gebeurt er niet zoveel, het programma doet letterlijk wat de opdracht vraag.  Ik was wel zo eigenwijs om het ding zichzelf niet te laten uitvoeren.
<FOAD> En.. um.  Klopt het?
<commandoline> mooi gebruik gemaakt van os.path
<commandoline> maar laat ik nog even een linkje geven naar het iets simpelere voorbeeld dat wij hebben gemaakt
<commandoline> FOAD, wil jij ondertussen deze regel even wat uitgebreider uitleggen?
<DooitzedeJong> Kun je uitleggen wat er gebeurt bij de oplossing van FOAD
<DooitzedeJong> FOAD?
<commandoline>     if os.path.splitext( file )[ 1 ] == ".py" and os.path.realpath( sys.argv[ 0 ] ) != os.path.realpath( file ):
<DooitzedeJong> commandoline was mij voor
<FOAD> Natuurlijk.
<DooitzedeJong> Bedankt
<commandoline> http://paste.ubuntu.com/579221/, ondertussen
<FOAD> De if controleert 2 dingen: 1) of de extensie van het bestand "file" gelijk is aan py (dus, dat het (waarschijnlijk) een python bestand is.
<FOAD> Maar 2) ook of het bestand naar waar wordt gekeken niet toevallig het programma zelf is.  De naam van het programma zelf vind je via sys.argv[ 0 ].
<FOAD> Ik gebruik realpath om zeker te weten dat hij absolute paden vergelijkt.  Ik weet eigenlijk niet zeker of het nodig is, maar ik denk het wel.
<FOAD> Moet ik dat nog verder toelichten?
<commandoline> DooitzedeJong> Wat betekent die !=
<commandoline> DooitzedeJong> niet gelijk aan?
<FOAD> De reden dat ik dit doe is dat het programma niet zichzelf gaat aanroepen, want dan kan het zo lang gaan duren.
<commandoline> <StefandeVries> Inderdaad, DooitzedeJong
<FOAD> !- betekent "niet gelijk aan".
<commandoline> ok, bedankt voor de uitleg, FOAD. Heeft iemand idd nog vragen?
<FOAD> Eh, !=
<commandoline> ok, dan gaan we verder
<commandoline> oh, nog een vraag
<commandoline> <DooitzedeJong> Wat moet je invullen..
<commandoline> <DooitzedeJong> bij dir?
<StefandeVries> DooitzedeJong: de directory die je wilt scannen
<FOAD> Ik besef me wel dat + "/" + een beetje os-afhankelijk is.
<StefandeVries> DooitzedeJong: bijvoorbeeld ja
<StefandeVries> Alle .py bestanden in die dir zullen dan worden uitgevoerd
<commandoline> <DooitzedeJong> bijvoorbeeld /home ?
<StefandeVries> ^
<StefandeVries> Al beantwoord ;)
<commandoline> OK, ik wil jullie vandaag wat leren over een andere manier van programma's ontwerpen
<commandoline> tot nu toe hebben jullie procedureel geprogrammeerd
<commandoline> je kunt met die manier van programmeren alles maken wat je ook kan met de methode die we vandaag gaan bespreken, maar daar wordt het niet altijd duidelijker op.
<StefandeVries> DooitzedeJong: al je programma's werden regel voor regel afgewerkt.
<commandoline> * altijd duidelijker van
<commandoline> <DooitzedeJong> |Wat houdt dat in|
<commandoline> <DooitzedeJong> ?
<commandoline> <DooitzedeJong> van 1 tot 10 het proces afhandelen?
<commandoline> was de vraag
<DooitzedeJong> Die is beantwoord
<DooitzedeJong> Ga verder
<commandoline> ho, hier wat verwarring, ok, verder
<commandoline> de methode die we gaan bespreken heet in het Engels 'Object Oriented Programming', kortweg OOP
<commandoline> de Nederlandse vertaling daarvan is ObjectgeoriÃ«nteerd programmeren
<commandoline> deze manier van programmeren is dus gewoon een andere manier om tegen het probleem dat je programma moet oplossen aan te kijken
<commandoline> Voordat ik ga uitleggen hoe we die manier van programmeren toepassen in Python, wil ik jullie eerst proberen duidelijk te maken wat het hele concept inhoudt.
<commandoline> want pas als je dat begrijpt, kan je het toepassen in de praktijk
<commandoline> OK, zoals het woord al zegt, gaat objectgeoriÃ«nteerd programmeren over objecten
<commandoline> de eerste vraag om te stellen is dus: wat is een object?
<commandoline> objecten zoals je die gebruikt bij programmeren, lijken best sterk op objecten die je in de praktijk ziet
<commandoline> Laten we eens een voorbeeld nemen
<commandoline> Bijvoorbeeld een fiets
<commandoline> een object zoals je dat gebruikt bij OOP, heeft twee kenmerken:
<commandoline> - het object bevat handelingen (de zogenaamde methods)
<commandoline> - het object bevat eigenschappen (de zogenaamde properties in het Engels)
<commandoline> Het is ook mogelijk om die manier van kijken toe te passen op een object uit de praktijk, dus op het voorbeeld van de fiets.
<commandoline> een fiets heeft handelingen:
<commandoline> - versnelling veranderen
<commandoline> - remmen
<commandoline> - versnellen
<StefandeVries> hannie: ja dus ;)
<commandoline> ook heeft een fiets eigenschappen:
<commandoline> bijv. de huidige versnelling, en de huidige snelheid
<commandoline> het komt dus vaak voor, dat de handelingen die de fiets heeft de eigenschappen van de fiets veranderen.
<commandoline> je kan zo'n manier van kijken naar objecten op allerlei dingen die je ziet toepassen
<commandoline> is dit ongeveer duidelijk? Kunnen jullie je er wat bij voorstellen?
<commandoline> hmm, ik heb nog niet iedereen overtuigd
<commandoline> nog een voorbeeldje dan:
<commandoline> oh, het gaat alleen om toepassen in een programma, dan ga ik toch door
<StefandeVries> FOAD: daarom is dit nog conceptuele uitleg, en geen Pythontoepassing
<commandoline> jullie hebben namelijk al objecten gebruikt
<commandoline> eentje die jullie je allemaal zullen herinneren, is de list
<commandoline> de list is een object
<commandoline> ten eerste heeft het methods, we hebben nl. het volgende gedaan:
<commandoline> list = [1, 2, 3]
<commandoline> list.append(4)
<commandoline> append is een method, een handeling, van list
<commandoline> list heeft ook eigenschappen/properties, maar die kunnen we niet direct zien in dit geval.
<commandoline> en list is nog maar Ã©Ã©n object
<commandoline> <FOAD> Is het aantal elementen niet een property van list?
<StefandeVries> FOAD: nee, het is een enkel een property van die specifieke list
<Ronnie>  DooitzedeJong: dus bijvoorbeeld adresboek is ook een object?
<Ronnie> het adresboek dat jullie gemaakt hebben nog niet, maar er is wel gemakkelijk een object met handelnigen van te maken
<Ronnie> bijvoorbeeld de handeling (voeg adres toe)
<commandoline> hmm, laat ik nog even wat dingen toevoegen over de twee vragen:
<Ronnie> of verwijder adres, zoek adres etc
<commandoline> FOAD, het aantal elementen van een lijst is eigenlijk geen property, omdat ze d.m.v. de len()-method worden verkregen. Intern gaat dat via een method, voor de geÃ¯nteresseerden.
<commandoline> over het adresboek, wij hebben voor het adresboek een dictionary gebruikt
<commandoline> en een dictionary is een object.
<commandoline> het is alleen geen Adresboek-object, wat, zoals Ronnie al zei, bijv. een method voeg_adres_toe zou hebben
<commandoline> eigenlijk is vrijwel alles in python een object, hoewel je dat niet meteen ziet.
<commandoline> ints, floats, strings, functies, dictionaries, lists, etc. zijn allemaal objects
<commandoline> 'Everything is an object'
<commandoline> wordt dan ook wel eens over python gezegd.
<commandoline> <DooitzedeJong> Kun je concreet een voorbeeld van een method geven?
<commandoline> bij een list dus 'append'
<commandoline> bij een string bijv. 'endswith'
<commandoline> en bij een dictionary bijv. 'keys'
<commandoline> <hannie> waarom noem je len() een method? het is toch een functie. Zijn alle functies dan methods?
<commandoline> als ik dat inderdaad heb gedaan, is dat fout
<commandoline> len() is een functie
<commandoline> maar wat ik dacht ik zei is dat het intern een method aanroept
<commandoline> maar die onmerking maakt het geheel nu complexer, dus vergeet dat maar ;)
<commandoline> ok, ik hoor iedereen vragen om codevoorbeelden, dus ik zal jullie er een aantal geven.
<commandoline> ten eerste toch nog even als herhaling: http://paste.ubuntu.com/582591/
<commandoline> je ziet 2 dingen:
<commandoline> - een object kan meerdere keren aangemaakt worden
<commandoline> - een object kan worden aangepast door het aanroepen van een handeling (method)
<commandoline> is dat duidelijk?
<commandoline> goed, dan het tweede voorbeeld:
<commandoline> http://paste.ubuntu.com/582592/
<commandoline> je ziet hier een nieuwe constructie
<commandoline> de zogenaamde class
<commandoline> <hannie> Wordt het eigenlijk een variabele?
<commandoline> in dat voorbeeld werden lists opgeslagen  Ã­n een variabele
<commandoline> het eerste wat jullie moeten weten is wat een class is:
<commandoline> het is het ontwerp/de blauwdruk van een object
<commandoline> zoals we ook al bij list zagen, is het mogelijk om meerdere lists aan te maken
<commandoline> in het tweede voorbeeld, wordt een nieuwe class gedefinieerd:
<commandoline> Adresboek
<commandoline> en daardoor wordt het mogelijk om meerdere adresboeken te maken.
<commandoline> voordat ik de code regel voor regel ga uitleggen, wil ik eerst even stilstaan bij hoe het mogelijk is om deze class te gebruiken:
<commandoline> - ten eerste is het nodig om een object te maken, net zoals in voorbeeld Ã©Ã©n.
<commandoline> in dat geval ging het om deze regel:
<commandoline> list1 = []
<commandoline> in dit geval gaat dat zo:
<commandoline> adresboek1 = Adresboek()
<commandoline> overigens wordt de overeenkomst misschien duidelijker, als je weet dat je het eerste geval ook zo kan schrijven:
<commandoline> list1 = list()
<commandoline> Het lijkt een functieaanroep, maar wat het in werkelijkheid is, is het maken van een object op basis van de eisen van de class.
<commandoline> het is nu mogelijk om methods (handelingen) van het object adresboek1 aan te roepen:
<commandoline> adresboek1.voeg_toe("commandoline", "mail@adres-zeg-ik.niet")
<commandoline> als ik daarna mijn mailadres weer wil verwijderen, kan dat zo:
<commandoline> adresboek1.verwijder("commandoline")
<commandoline> het voordeel hiervan bovenop dat van een dictionary is klein in dit geval
<Ronnie> hannie: horen [] en {} ook tot de eigenschappen?
<commandoline> maar als dit object zou moeten controleren of het adresboek geldig was, dan zou het al veel schelen.
<commandoline> hannie, ik kom er straks even op terug, als ik vertel wat de eigenschappen hier zijn
<commandoline> het voordeel van een object gebruiken is dus, dat je niet precies hoeft te weten wat er onder de motorkap gebeurt
<commandoline> en opnieuw ook hergebruik, net zoals bij functies
<commandoline> Goed, dat over het gebruik van deze class
<Ronnie>  Cugel_laptop: Is def __init__  een verplicht onderdeel van een classdefinitie?
<commandoline> nu even verder over hoe de class zelf is opgebouwd
<Ronnie> nee, dat is niet perse nodig
<Ronnie> uitleg hierover komt nog
<commandoline> op lijn 1 zien jullie de declaratie van de class
<commandoline> het lijkt wel wat op het definieren van een functie
<commandoline> in dit geval krijgt de class de naam 'Adresboek'
<commandoline> en het laatste stukje, (object), mag je voorlopig aannemen als een verplicht iets
<commandoline> <hannie> zijn dat twee underscores?
<commandoline> __init__ bevat idd vier underscores
<commandoline> twee aan beide kanten
<commandoline> zodra dat is gebeurd, begint de classdefinitie
<commandoline> we zien daarin functies, zoals we die al eerder hebben gezien
<commandoline> ik begin niet met de eerste, maar met de tweede:
<commandoline> voeg_toe
<commandoline> dat is een hele normale functie, op Ã©Ã©n ding na.
<commandoline> het eerste argument is 'self'
<commandoline> en jullie hebben zonet gezien, dat we dat argument niet meegeven, we deden immers:
<commandoline> adresboek1 = Adresboek()
<commandoline> adresboek1.voeg_toe("commandoline", "mijn_mail@adres.nl")
<commandoline> dat eerste argument wordt gevuld door python
<commandoline> python geeft dan het object mee, waarop de method (de handeling) wordt aangeroepen
<commandoline> dus eigenlijk is het gelijk aan dit, als dat het iets duidelijker maakt:
<commandoline> Adresboek.voeg_toe(adresboek1, "commandoline", "mijn_mail@adres.nl")
<commandoline> dat geeft de method dus de mogelijkheid, om iets te veranderen aan het object zelf
<commandoline> in dit geval wordt de eigenschap 'adressen' verandert.
<commandoline> Dat is een dictionary, en er wordt een adres aan toegevoegd
<commandoline> verwijder doet iets soortgelijks
<commandoline> __init__ is nog wel bijzonder
<commandoline> die method wordt aangeroepen door python tijdens het maken van het object
<commandoline> dus, bij deze regel code:
<commandoline> adresboek1 = Adresboek()
<commandoline> wat die method doet, is niks anders dan het toevoegen van de eigenschap 'adressen' aan het object
<commandoline> goed, nog vragen?
<commandoline> dit is een ingewikkeld onderwerp, we gaan er iig de komende en waarschijnlijk ook nog de daaropvolgende les ermee verder
<commandoline> <hannie> self, is dat een bewaarplaats waar later iets in komt?
<commandoline> dat argument wordt dus ingevuld door python, als je een method aanroept
<commandoline> het is altijd het huidige object
<commandoline> bijv:
<commandoline> adresboek1 = Adresboek()
<commandoline> adresboek2 = Adresboek()
<commandoline> adresboek1.voeg_toe("naam", "mailadres")
<commandoline> adresboek2.voeg_toe("naam", "mailadres")
<commandoline> wat er eigenlijk gebeurd bij het aanroepen van de method
<commandoline> is in beide gevallen anders
<commandoline> terwijl het hetzelfde lijkt
<commandoline> want achter de schermen gebeurt:
<commandoline> Adresboek.voeg_toe(adresboek1, "naam", "mailadres")
<commandoline> Adresboek.voeg_toe(adresboek2, "naam", "mailadres")
<commandoline> <hannie> en adresboek1, 2 enz. gebruik je later in een programma?
<commandoline> inderdaad, het is in het adresboekprogramma dus opeens mogelijk om voor meerdere personen een adresboek te maken
<commandoline> zonder een regel te veranderen aan de class Adresboek
<commandoline> opnieuw een voordeel van classes :)
<commandoline> ok, het huiswerk:
<commandoline> maak een programma dat niks anders doet dan methods van Adresboek aanroepen
<commandoline> maak daarbij adresboeken aan voor meerdere personen.
<commandoline> probeer ook uit wat de laatste twee methods doen
<commandoline> probeer dus gewoon een echte situatie na te bootsen
<commandoline> de echte handelingen die normaal op een Adresboek losgelaten zouden worden
<commandoline> begrijpt iedereen dat?
<commandoline> ten slotte nog even een verbeterd linkje, deze class werkt nl. niet ;)
<commandoline> er is eigenlijk altijd wel hulp in #ubuntu-nl-mwanzo
<commandoline> http://paste.ubuntu.com/582607/
<commandoline> probeer gewoon objects te maken van deze class dus en ze te gebruiken, dat is kortweg de opdracht
<commandoline> succes ermee en bedankt voor jullie komst!
<FOAD> Dank je wel commandoline en support!
<commandoline> ik ben hier nog even voor vragen
<FOAD> Ik vond het erg leuk om mijn oplossing te presenteren.
<commandoline> bedankt voor de complimenten allemaal :)
<hannie> commandoline, en anderen, prettige avond nog
<commandoline> jij ook, hannie
<commandoline> let op allemaal: de les gaat volgende week niet door
<commandoline> i.v.m. dat ik wat anders heb
<Cugel_laptop> Jammer.
* ChanServ changed the topic of #Ubuntu-nl-mwanzo-klas to: 22 maart 2011 19.30-20.30 workshop werken met de wiki :  #Ubuntu-nl-mwanzo-klas. Info: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/WikiInleiding Leiding: Rawchid. 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 workshopleiders.
<FOAD> Wat.
<FOAD> :(
<leoquant> FOAD,?
<FOAD> Ik wil Python.
<leoquant> di 22 mrt is er weer wat anders
<FOAD> Oh leuk, daar ga ik ook aan meedoen.
<leoquant> python komt waarschijnlijk een week later weer. de topics worden vrij direct bijgewerkt hier
<commandoline> leoquant, python kÃ³mt een week daarna weer.
<leoquant> juist! ã
<leoquant> deo volente
<Cugel_laptop> Wat komt er dan volgende week.
<commandoline> een workshop 'Werken met de wiki' door RawChid. :)
<DooitzedeJong> Wat gaat RawChid ons dan vertellen
<DooitzedeJong> ?
<commandoline> http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/WikiInleiding
<DooitzedeJong> Dom dat ik daar niet aan dacht, ben net de wiki aan het aanpassen :P
<DooitzedeJong> ik ga
<DooitzedeJong> UndiFineD, we bespreken het nog wel even
<DooitzedeJong> doeg
<DooitzedeJong> oops verkeerde kanaal
<UndiFineD> ok
