#ubuntu-nl-mwanzo-klas 2011-03-05 <leoquant> commandoline, hier staat alles goed <commandoline> ok, prima. StefandeVries klaar? <leoquant> nog even wachten... <StefandeVries> klaar <commandoline> leoquant? <leoquant> ok <leoquant> ã <commandoline> Goed, welkom allemaal bij de 5e les Python. <commandoline> Ten eerste wil ik nu iedereen die de cursus volgt aanwezig is, even zeggen dat vanaf deze les StefandeVries officieel mede-workshop leider is. <commandoline> tijdens de lessen doet hij de vragen, buiten de lessen zijn we beide bereikbaar daarvoor. <leoquant> welkom StefandeVries ! <StefandeVries> dank jullie ;) <commandoline> Goed, ik had 2 huiswerkopdrachten gegeven i.v.m. de 2x uitval, dus laten we die eerst maar eens bekijken. <commandoline> de eerste opdracht is: <commandoline> http://paste.ubuntu.com/563139/ <StefandeVries> bekijk dat voorbeeld, en kijk of het in grote lijnen hetzelfde werkt als jouw uitwerking. als je vragen hebt, kan je ze stellen <commandoline> ohnee, deze klopt niet zie ik nu <commandoline> ik heb het huiswerk van les 3 voor me :P <commandoline> http://paste.ubuntu.com/566649/ <StefandeVries> Is op deze laatste opdracht nog een toelichting nodig, of lijkt hij duidelijk? <commandoline> de bijbehorende opdracht was: <commandoline> [19:28] <commandoline> wel heb ik nog een opdracht voor jullie bedacht <commandoline> [19:28] <commandoline> probeer dit programma zo om te schrijven, dat het een woordenboek wordt. <commandoline> [19:28] <commandoline> met als opties: <commandoline> [19:28] <commandoline> - een woord met betekenis toevoegen <commandoline> [19:29] <commandoline> - alle woorden & betekenissen tonen <commandoline> [19:29] <commandoline> - een woord verwijderen <commandoline> [19:29] <commandoline> - evt. een woord aanpassen <commandoline> bekijk het programma rustig, en voer het eens uit <commandoline> <hannie> Hoe kan je gegevens sorteren in een dictionary? <StefandeVries> hannie: dit kan niet direct; daar zijn dictionaries niet voor bedoeld. er is een methode om de keys via een list te sorteren, en door die list te lopen. daar komen we na de les even op terug, als je dat zou willen <leoquant> ok gesnapt <StefandeVries> klopt, hannie <commandoline> <hannie> Het woordenboek is eigenlijk exact hetzelfde als naam/e-mail (key/value) <commandoline> goed, als er geen vragen meer zijn gaan we door naar opdr. 2 <commandoline> die staat hier: http://paste.ubuntu.com/575952/ <commandoline> de bijbehorende opdracht was: <commandoline> [19:29] <commandoline> en voor degene die nog meer wil oefenen: <commandoline> [19:30] <commandoline> - probeer een winkelinventarisprogramma te schrijven, dat bijhoud wat een winkel allemaal in voorraad heeft. <commandoline> eigenlijk lijkt dit programma erg op het volgende <commandoline> het enige wat je even door moet hebben, is wat de bedoelde key/value combinatie is <commandoline> nl.: <commandoline> key = naam v/h product <commandoline> value = de hoeveelheid producten die de winkel op voorraad heeft. <commandoline> nogmaals, draai dit programma eens, en kijk of je het begrijpt <commandoline> hannie> We hebben toch al appels=10, peren=20 enz. gehad. Is dat wat je bedoelt? <commandoline> eigenlijk is dat inderdaad precies hetzelfde voorbeeld <commandoline> hier wordt het alleen toegepast in een programma, en die stap wilde ik jullie even laten maken. <commandoline> ok, als er toch nog vragen zijn mag dat ook na de les, ik kan me voorstellen dat het wat tijd kost om dit goed door te nemen <commandoline> vandaag gaan we namelijk met iets anders verder: functies. <commandoline> Ten eerste: wat is een functie? <commandoline> een functie kun je zien als een klein programma <commandoline> dat programma krijgt invoer, doet daar iets mee, en geeft het resultaat terug <commandoline> we hebben al een aantal functies gezien de afgelopen lessen, functies die standaard in python zitten. <commandoline> nl: <commandoline> len() <commandoline> raw_input() <commandoline> input() <commandoline> str() <commandoline> float() ook nog dacht ik? <commandoline> ok, float ook :) <commandoline> <Tjibba> hmm wat deed float ook alweer? <StefandeVries> het maakte van een geheel getal een komma getal, Tjibba <commandoline> <hannie> maar je kunt i.p.v. float ook een getal met ,00 opgeven bij input <commandoline> i.p.v. een komma moet het een punt zijn <StefandeVries> dat kan inderdaad ook, met een punt <commandoline> maar het achterliggende idee klopt :) <StefandeVries> commandoline was me voor <commandoline> ok, len() vind ik wel een mooi voorbeeld <commandoline> het krijgt invoer (bijv. een lijst), en geeft als resultaat de lengte van die lijst terug. <commandoline> dat is iets wat we ook zelf zouden kunnen doen, bijv. zo: <commandoline> lengte = 0 <commandoline> for item in lijst: <commandoline> lengte = lengte +1 <commandoline> (in het echt is de implementatie anders, maar even ter illustratie) <commandoline> voordelen van de functie boven deze code is: <commandoline> *zijn <commandoline> - het is abstracter, je hoeft niet meer te bedenken dat bovenstaande code de lengte berekend. <commandoline> - hergebruik: het is mogelijk om de functie meerdere keren aan te roepen, terwijl we dan de code elke keer zouden moeten kopiÃ«ren, en dat is lastig in het onderhoud. <leoquant> <hannie> Bedoel je met de lengte van de lijst het AANTAL items? <StefandeVries> Ja, hannie :) <commandoline> <MedUsaXIII74> Kun je zelf ook functies maken ? En gaat dat dan richting object georienteerd programmeren ? <StefandeVries> MedUsaXIII74: Ja, dat gaan we deze les uitleggen en inderdaad, we gaan later in de cursus door op OOP. maar maak je voor nu geen zorgen. ;) <leoquant> ok <commandoline> goed, ik zal jullie nog een paar termen vertellen, voordat we verdergaan met een voorbeeld: <commandoline> het aanroepen (Eng: callen) van een functie = een functie gebruiken, bijv. len(list) <commandoline> argumenten (Eng: parameters of arguments) = invoer van een functie, in het voorbeeld is dat 'list'. <commandoline> maar bij bijv. de functie pow(x, y) (power, x tot de macht y), zijn dat x en y <commandoline> ten slotte is het handig om de engelse term te kennen voor 'waarde teruggeven aan het de aanroeper (caller)': return <commandoline> <DooitzedeJong> QUESTION: Over die tweede opdracht van vorige week, kan je python ook de values op laten slaan in een document? <StefandeVries> DooitzedeJong: ja, dat kan. in een later stadium van de cursus gaan we dit ook doen. <StefandeVries> maar voorlopig niet <commandoline> goed, alles duidelijk tot zover? <commandoline> /vragen? <commandoline> goed, dan gaan we het adresboekprogramma (huiswerkopdracht 1) omschrijven om functies te gebruiken. <commandoline> http://typewith.me/ep/pad/view/ro.LGhT4417wF8/latest <commandoline> hoewel, dat is hier al gebeurd :P Nou ja, ook goed, dan gaan we dat uitleggen :) <commandoline> goed, we gaan even kijken wat er allemaal gebeurd, en beginnen net als python zelf, bovenaan. <commandoline> daar zien we dat de lijst (list) menu_opties wordt aangemaakt <commandoline> dat hebben we eerder gedaan, niks bijzonders. <commandoline> daaronder wordt het interessant: <commandoline> we zien een nieuw statement, nl. 'def' . <commandoline> def definieert een nieuwe functie <commandoline> een eigen functie dus, waarvan we zelf duidelijk maken wat die doet. <commandoline> deze functie heeft menu, en onder die naam kunnen we hem straks dus bereiken <commandoline> tot slot geeft de eerste regel aan dat de functie menu een argument heeft, nl. 'opties' <commandoline> <hannie> Wordt de functie door de programmeur gedefinieerd? <StefandeVries> Ja, je kunt een functie zelf definiÃ«ren, echter functies zoals len() niet; dit belcihten we later bij object geÃ¶rienteerd programmeren <commandoline> en dat is ook precies wat gebeurd op regel 11 van het document <commandoline> de functie wordt hier dus gedefineerd, voor later gebruik. <commandoline> de functie menu doet het volgende: <commandoline> - het laat iedere optie zien in opties d.m.v. de for-loop <commandoline> - het vraagt de gebruiker om een keuze te maken m.b.v. input() <commandoline> - het geeft die keuze terug aan het hoofdprogramma (r. 18, return keuze) <commandoline> met deze functie kunnen we later zo aanroepen: <commandoline> keuze = menu(menu_opties) <commandoline> je ziet hier de twee voordelen terug: <commandoline> - we kunnen menu later nog een keer gebruiken, zelfs om een compleet ander menu te laten zien door i.p.v. menu_opties een andere lijst mee te geven. <commandoline> - de programmeur hoeft niet alle bovenstaande stappen te bedenken <commandoline> (abstractie), het enige waar de programmeur aan moet denken is om een lijst met menu opties door te geven aan menu(), en het resultaat op te slaan. <commandoline> <hannie> Kan je de gedefinieerde functies opslaan en in andere programma's gebruiken? <StefandeVries> Ja, hannie, je kunt functies maken opslaan. deze bestanden kun je dan in programma's importeren en de functies dan aanroepen. volgende les wordt dit behandeld(modules) <commandoline> <bakeds> programma doet het nog niet klopt dit? <commandoline> hannie: je kunt momenteel ook nog gewoon regel 11 tot en met 20 kopieren naar een ander programma. <commandoline> bakeds: het werkt gewoon, zowel bij StefandeVries als bij mij. <commandoline> wel is het zo dat het nog niks doet als je het tot waar we nu zijn overneemt, bedoel je dat? <commandoline> vervolgens worden er nog een groot aantal functies gedefinieerd, ik loop ze wat sneller bij langs <commandoline> def toon_mailadressen(adresboek): <commandoline> deze functie toont alle mailadressen in 'adresboek' aan de gebruiker, we kunnen na deze declaratie dus zoiets doen: <commandoline> toon_mailadressen(adresboek_van_commandoline) <commandoline> deze functie geeft niks terug, het 'return'-statement staat nergens. <commandoline> de volgende functie heeft dezelfde argumenten en geeft opnieuw niets terug. <commandoline> def voeg_mailadres_toe(adresboek): <commandoline> het verschil is wat de functie zelf doet, namelijk een entry toevoegen aan het adresboek <commandoline> datzelfde geld voor verwijder_adresboek (r. 29) <commandoline> eh, regel 37 <commandoline> goed, als je alles tot regel 41 in een bestand zet en dat uitvoerd, gebeurd er niks <commandoline> dat is zo, omdat we alleen een aantal functies hebben gedefinieerd, we doen er verder niks mee. <commandoline> ze worden niet aangeroepen, en daarom doen ze niks. <commandoline> dat komt nu, we beginnen met de welkomsboodschap: <commandoline> print "Welkom bij het adresboekprogramma" <commandoline> gevolgd door het aanmaken van het adresboek, en het starten van de while loop om het programma meerdere keren te laten draaien, zoals we vaker hebben gedaan. <commandoline> daarna roepen we onze eigen gedefinieerde functie aan: <commandoline> keuze = menu(menu_opties) <commandoline> keuze is nu gelijk aan wat de functie menu teruggeeft. <commandoline> dan kijken we wat de gebruiker heeft gekozen met if/elif/else <commandoline> iedere menuoptie heeft eerder een eigen functie gekregen, en die roepen we nu aan. <commandoline> (bijv. toon_mailadressen(adresboek)) <commandoline> goed, dat is eigenlijk het hele programma. <commandoline> heeft iemand nog vragen tot zover? <commandoline> en is alles duidelijk? <commandoline> <hannie> Maar ik zou het nog niet zelfstandig kunnen maken ): <commandoline> dat is oefenen <commandoline> en dat is dan ook het huiswerk voor de volgende keer: <commandoline> mijn eerste opdracht is, schrijf je eigen len()-functie <commandoline> ik stel voor dat we 'm num() noemen zoals hannie voorstelde :) <commandoline> <MedUsaXIII74> Als je def voor een stukje code zet wordt het ook uitgevoerd, is dit te voorkomen ? <StefandeVries> MedUsaXIII74: hoe bedoel je dat precies? de code die je als functie definieert wordt als het goed is niet uitgevoerd als het niet aangeroepen wordt <commandoline> terwijl StefandeVries de vraag beantwoord, voor mensen die nog meer willen oefenen: herschrijf het rekenmachineprogramma om functies te gebruiken <commandoline> vaak is de menuopties in een functie zetten overzichtelijk <commandoline> goed, het is 20:30, tot volgende week allemaal! Wij gaan nog even door met vragen beantwoorden, en dat doen StefandeVries en ik doen dat ook graag door de week <commandoline> (en anderen ook, dus gewoon vragen in #ubuntu-nl-mwanzo) <StefandeVries> schaam je niet, ook wij zijn ergens en ooit begonnen :) <StefandeVries> Graag gedaan, hannie <commandoline> <MedUsaXIII74> Stel dat je bijvoorbeeld van het menu een def wilt maken MAAR nog niet wilt uitvoeren op dat punt. Dat bedoel ik. <commandoline> MedUsaXIII74, code binnen functies wordt nooit uitgevoerd als ze gedefinieerd worden, dat gebeurd pas als ze aangeroepen worden <StefandeVries> precies <commandoline> en def maakt duidelijk dat we een functie definiÃ«ren. duidelijk? <StefandeVries> ik begreep je niet helemaal, MedUsaXIII74, mijn excuses <commandoline> <MedUsaXIII74> Zodat je die def later als menu kan gebruiken, maar je wilt hem al van te voren defineren ipv pas als je hem nodig hebt. <commandoline> dat gebeurt dus altijd, het is zeg maar het idee achter een functie, je definieert 'm voordat je 'm nodig hebt. <commandoline> <hannie> Ik wil nog iets vragen over regel 18: <commandoline> <hannie> Waar gaat return keuze naartoe? <commandoline> 'return' stuurt een waarde terug naar dat stuk code dat de functie aanroept <commandoline> dat is in ons programma: <commandoline> keuze = menu(menu_opties) <commandoline> keuze is dus gelijk aan wat de menu-functie terugstuurt. <commandoline> <MedUsaXIII74> en je defineert hem door bijv aan te geven: menu = menu(menu1) of menu = menu(menu2) <commandoline> nee <commandoline> de definitie is alles wat achter 'def' staat. <commandoline> in het voorbeeldprogramma: <commandoline> def menu(opties): <commandoline> is de definitie <commandoline> keuze = menu(menu_opties) <commandoline> is de aanroep #ubuntu-nl-mwanzo-klas 2011-03-12 <leoquant> het staat hier nu op +m commandoline en StefandeVries <leoquant> ik ga zo eten, maar op de tijd terug te zijn hier <StefandeVries> dank je, leoquant <StefandeVries> tot later <leoquant> alvast weer bedankt, en succes <commandoline> Welkom bij de zesde les Python allemaal <commandoline> we gaan vandaag verder met functies <commandoline> maar voordat we dat doen wil ik even het huiswerk bespreken <commandoline> ten eerste de opdracht om een eigen alternatief voor de len()-functie te schrijven. <commandoline> genaamd num() <commandoline> http://paste.ubuntu.com/579208/ <commandoline> goed, even lijn voor lijn wat er gebeurd. <commandoline> we beginnen met het definiÃ«ren van de functie num(), zodat we die later kunnen gebruiken. De functie heeft Ã©Ã©n argument, items, wat de list/dictionary is waarvan we de lengte willen weten. <commandoline> daarna volgt de code om de eigenlijke lengte te berekenen: <commandoline> de code loopt met behulp van de for-loop door alle items, en hoogt voor ieder item de teller 'aantal' op met 1. <leoquant> hannie> Het werkt bij mij ook zonder argument <commandoline> ten slotte wordt aantal teruggegeven aan de aanroeper <commandoline> terwijl StefandeVries hannie's vraag beantwoord, leg ik nog even de laatste paar regels uit <commandoline> daar wordt de functie nl. gebruikt. <commandoline> <StefandeVries> hannie: het kan zijn dat dat toevallig goed ging, maar voor een goede programmeerstijl vooral erin houden <commandoline> was het antwoord. <commandoline> om de functie te testen maken we twee dingen (objecten) aan: een list en een dictionary <commandoline> over beide wordt zowel de functie num() als len() aangeroepen, en beide geven hetzelfde resultaat terug. <commandoline> overigens: de functie len() is intern anders geimplementeerd, en kan meer. Gebruik dus nooit een eigen implementatie in de praktijk, nergens voor nodig ;) <commandoline> goed, begrijpt iedereen wat er hier gebeurd? <commandoline> geen vragen? Dan gaan we verder naar de tweede opdracht <commandoline> http://paste.ubuntu.com/579219/ <commandoline> wat we hier zien is het bekende rekenmachineprogramma, maar weer in een andere vorm. <commandoline> als je wat anders hebt hier is het niet vreemd, want het kan op verschillende manieren <commandoline> maar wat wij kortweg gedaan hebben: <commandoline> maar wat wij kortweg gedaan hebben: <commandoline> :( <commandoline> - een functie maken voor het menu, zoals we die dacht ik vorige les al hadden gezien. <commandoline> - ieder menuitem in een functie gezet, om de code wat duidelijker te houden. <commandoline> wat nog had gekunt was het vragen van getallen in een functie zetten, of het verplaatsen naar voor het if-statement <commandoline> (if keuze == 1; if keuze == 2 etc.) <commandoline> maar zoals ik al zei, er zijn hier meerdere mogelijkheden <commandoline> ok, nog vragen? <commandoline> goed, dan gaan we verder <commandoline> jullie weten nu hoe je zelf functies kan schrijven, en hoe je ze aanroept. <commandoline> <CasW> Waarom geen switch-case? <StefandeVries> Die bestaat niet in Python <commandoline> er is overigens wel een mogelijkheid: <commandoline> een dictionary maken met functies daarin <commandoline> maar dat is hier denk ik alleen maar onduidelijker <leoquant> CasW> Waarom geen switch-case? <commandoline> het mooie aan python is, dat de makers ervan al een heleboel functies hebben geschreven die wij kunnen gebruiken in onze programma's met maar weinig moeite <commandoline> leoquant, die vraag is net beantwoord ;) <leoquant> ! <commandoline> en vandaag wilde ik jullie dus een aantal van die functies laten zien <commandoline> allemaal gaat niet lukken, want het zijn er honderden <commandoline> maar ik zal er een aantal laten zien die ik en StefandeVries vaak gebruiken <commandoline> open allemaal een terminal met daarin python <commandoline> dit is makkelijker om uit te proberen in de interactieve sessie dan in een opgeslagen programma. <commandoline> dus: <commandoline> Toepassingen > Hulpmiddelen > Terminalvenster <commandoline> 'python' intikken en op enter drukken <commandoline> goed, omdat python zoveel functies ingebouwd heeft, zijn ze geordend in zogenaamde 'modules'. <commandoline> standaard zijn modules niet geladen, dat moeten we doen op het moment dat we ze willen gebruiken. <commandoline> De eerste module die ik jullie wil laten zien, is de os module <commandoline> die kun je laden door 'import os' in te tikken. <commandoline> overigens staat de uitgebreide (Engelstalige) documentatie van alle modules hier: http://docs.python.org/library/ <commandoline> en van de os-module specifiek: http://docs.python.org/library/os.html <commandoline> goed, de eerste functie die ik wil bespreken is os.listdir() <commandoline> die heeft Ã©Ã©n argument, zoals ook hier te lezen valt: http://docs.python.org/library/os.html#os.listdir <commandoline> nl. een locatie <commandoline> de functie geeft na aanroepen een lijst terug met alle bestanden en mappen in 'locatie' <commandoline> type in: <commandoline> os.listdir(".") <commandoline> . is de huidige map, dat is in de meeste gevallen jullie home-map. <commandoline> je ziet trouwens ook alle verborgen bestanden, dus het kan nogal een lange lijst teruggeven. <commandoline> je kan ook een andere locatie ("path") proberen <commandoline> bijv.: <commandoline> os.listdir("/home") <commandoline> ok, volgende functie: <commandoline> os.remove() <commandoline> daarmee moet je oppassen <commandoline> het verwijdert nl. een bestand, en dat zonder te vragen of je het zeker weet o.i.d. <commandoline> je kan 'm uitproberen door een lege map aan te maken met daarin een leeg bestand <commandoline> <hannie> moet je bij elke terminalsessie opnieuw importeren? <commandoline> <CasW> Ja <commandoline> en dan dat bestand verwijderen <commandoline> het argument werkt net zoals bij os.listdir <commandoline> maar doe dat alleen als je bovenstaande instructies begrijpt. <commandoline> overigens kan je os.remove niet gebruiken om mappen weg te gooien <commandoline> alleen bestanden, en dan Ã©Ã©n voor Ã©Ã©n. <commandoline> voor mappen kun je os.rmdir gebruiken <commandoline> maar die werkt alleen als de map die je probeert te verwijderen compleet leeg is <commandoline> dan is er nog Ã©Ã©n functie uit os die ik jullie wil laten zien: os.walk() <commandoline> <MedUsaXIII> Vraag: Dus je gebruikt os.remove in combinatie met os.rmdir om een map met bestanden weg te gooien >? <commandoline> dat kan, zeker als je 'm combineert met os.walk die we nu bespreken zoals je straks misschien zult zien. <commandoline> maar makkelijker is om de shutil module te gebruiken. <commandoline> die heeft functies als rmtree() <commandoline> dat alles in een map verwijdert, dat zijn dus de echt gevaarlijke functies als je niet precies weet waar je mee bezig bent * commandoline heeft er een keer m'n halve home map mee leeggegooid. <commandoline> *z'n, als ik /me gebruik :P <commandoline> ok, os.walk: <commandoline> http://docs.python.org/library/os.html#os.walk <commandoline> die functie wordt meestal gebruikt i.c.m. de for-loop <commandoline> ik zal een voorbeeldje ervan geven, maar het verder niet uitleggen. <commandoline> als het nu niet duidelijk is, komt dat vanzelf. <commandoline> http://paste.ubuntu.com/579427/ <commandoline> je kan het overtypen in de terminal, maar als jullie syntax errors krijgen zet het dan gewoon even in een bestand <commandoline> <FOAD> En niet met "marten" zeker. <commandoline> even aanpassen idd <StefandeVries> Tenzij je Marten heet <commandoline> idd :P <commandoline> goed, tenzij iemand nog vragen heeft over os wil ik door met os.path <StefandeVries> Ik zie geen vragen =) <commandoline> os.path is een zogenaamde submodule van os <commandoline> en dat heeft als voordeel dat je 'm niet hoeft te importeren als je os al hebt geimporteerd <leoquant> <hannie> ik krijg geen output <StefandeVries> hannie: staat er iets op je bureaublad, en heb je je gebruikersnaam aangepast? <commandoline> als de map niet bestaat zou hij een foutmelding geven, en hij geeft altijd wat output. <commandoline> het werkt hier gewoon, dus hier komen we later even op terug hannie <commandoline> importeren <commandoline> <hannie> na enter zie ik >>> <commandoline> bedoel ik <commandoline> lijkt me toch dat het bureaublad leeg is, maar goed, zo verder. <commandoline> je kan os.path wel importeren via 'import os.path' overigens <commandoline> als je dat doet is os.listdir niet beschikbaar <commandoline> maar goed, jullie hebben os geimporteerd, dus automatisch ook os.path <commandoline> dus, door naar de eerste functie <commandoline> (nadat jullie de documentatie hebben gekregen van os.path: http://docs.python.org/library/os.path.html) <commandoline> de eerste functie uit os.path die ik wil behandelen is os.path <commandoline> stel je voor dat je weet dat je op linux werkt, en dat er een /home map bestaat. <commandoline> en de gebruikersnaam niet weet <commandoline> dan kun je die vragen aan de gebruiker <commandoline> je zou dan iets kunnen doen als: <commandoline> locatie = "/home/" + raw_input("Geef de gebruikersnaam: ") <commandoline> het probleem aan deze code is dat zodra de / achter home weg gaat, de code crasht <commandoline> voor dat soort problemen hebben de python ontwikkelaars de functie os.path.join() geschreven <commandoline> die werkt op ieder platform waarop python draait <commandoline> dus op linux, mac os x, windows, bsd, etc. etc. <commandoline> de code uit mijn voorbeeld wordt er als volgt mee herschreven: <commandoline> locatie = os.path.join("/home", raw_input("Geef de gebruikersnaam: ")) <commandoline> <hannie> als je de gebruikersnaam niet weet kan je hem ook niet intypen <commandoline> <CasW> Je == de programmeur, voor als je een programma voor iemand anders schrijft <commandoline> ok, iedereen begrijpt de werking van os.path.join() ? <commandoline> de volgende is os.path.splitext() <commandoline> die kan je bijv. gebruiken als je een programma hebt dat bestanden maakt met de extensie .jdkf <commandoline> om een voorbeeld te noemen :P <commandoline> je wil dan contoleren of het bestand wat de gebruiker selecteert, eindigt op 'jdkf' <commandoline> dat kan op verschillende manieren, maar Ã©Ã©n daarvan is om de extensie op te vragen met os.path.splitext() <commandoline> het voorbeeld zou je bijv. kunnen vertalen naar de volgende code: <commandoline> if os.path.splitext("/locatie/die/eindigt/op.jdkf")[1] == "jdkf": <commandoline> #alles goed <commandoline> <hannie> hiermee worden dus de naam en de extensie gescheiden <commandoline> inderdaad, er wordt een 'tuple' (een soort list) teruggegeven. <commandoline> met twee items: <commandoline> alles wat voor de extensie staat <commandoline> en de extensie <commandoline> met [1] krijg ik dus de extensie <commandoline> met [0] krijg ik alles wat daarvoor staat. <commandoline> ok, dat was alles wat ik wilde laten zien van os.path <commandoline> iemand nog vragen tot zover? <commandoline> nee, dan pakken we de volgende module erbij: <commandoline> math <commandoline> dus, doe allemaal: <commandoline> import math <commandoline> math bevat wiskundige functies, zoals sqrt (square root = vierkantswortel) <commandoline> je kan er dus de wortel mee uit een getal trekken. <commandoline> math.sqrt(2) geeft bijv. <commandoline> 1.4142135623730951 <commandoline> en zo zitten er nog veel meer functies in. <commandoline> kijk gewoon de documentatie eens door als je ze nodig hebt: <commandoline> http://docs.python.org/library/math.html <commandoline> ok, ik heb nog twee modules, en omdat het idee zolangzamerhand wel duidelijk is, wil ik daar wat sneller doorheen <commandoline> we willen niet over de tijd heengaan... <commandoline> de eerste is subprocess <commandoline> import subprocess <commandoline> dus <commandoline> subprocess maakt het mogelijk om andere applicaties te starten <commandoline> probeer bijv. eens: <commandoline> subprocess.call(["firefox"]) <commandoline> of: subprocess.call(["python", "bestand_om_uit_te_voeren.py"]) <commandoline> <FOAD> Waarom die haakjes? <StefandeVries> FOAD: de ronde haakjes omdat het een functieaanroep is <StefandeVries> FOAD: de vierkante omdat elk argument een element van een lijst is <commandoline> en die functie vraagt nou eenmaal een lijst als invoer <StefandeVries> Helder? <StefandeVries> Mooi <commandoline> ok, het is mogelijk om i.p.v. subprocess.call os.system te gebruiken. De python handleiding zegt niet dat die laatste veroudert is, maar dat wordt door sommige mensen wel zo gezien. <commandoline> dus mijn persoonlijke advies is om gewoon de subprocess module te gebruiken om commando's uit te voeren als dat al moet <commandoline> want, door dit soort commando's uit te voeren, maak je je programma systeemafhankelijk <commandoline> sommige van deze commando's zouden mogelijk bijv. niet werken op windows. <commandoline> ok, dan de laatste module nog even snel: sys <commandoline> doe: <commandoline> import sys <commandoline> en vervolgens: <commandoline> sys.exit() <commandoline> en python is afgesloten <commandoline> je hebt ook de exit() functie hiervoor, maar die werkt in sommige gevallen niet <commandoline> (bijv. bij jython, even googlen als je nieuwsgierig bent daarnaar.) <commandoline> ook is het mogelijk om via sys argumenten mee te krijgen: <commandoline> bijv. als je programma zo wordt aangeroepen: <leoquant> <hannie> waarom niet quit() <commandoline> python programma.py argument1 argument2 <commandoline> dan kan je argument1 en argument2 zien via de list 'sys.argv' <commandoline> probeer het maar eens uit <StefandeVries> hannie: bij sommige Pythons werkt dit niet. sys.exit() werkt altijd en is veiliger <commandoline> en het is ook een keuze van de python ontwikkelaars geweest om het exit() te noemen :) <commandoline> ok, nog even huiswerk: <commandoline> schrijf een programma, dat de gebruiker om een map vraagt <commandoline> en vervolgens alle python programma's in die map uitvoert. <leoquant> leuk <commandoline> en dan hoop ik jullie volgende week allemaal weer te zien <commandoline> StefandeVries en ik zijn hier nog even voor vragen :) <StefandeVries> En dat hoop ik uiteraard ook ;) <commandoline> en ook door de week mag je altijd vragen stellen in #ubuntu-nl-mwanzo of via PM's aan ons. * leoquant biedt virtuele bloemen aan de leiders <leoquant> dit kanaal is weer open nu #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", "acolon@example.com") <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", "acolon@example.com") <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", "acolon@example.com") <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 #ubuntu-nl-mwanzo-klas 2011-03-22 <leoquant> hier staat alles goed? <leoquant> RawChid, ? <RawChid> Kan ik praten? <RawChid> Ja, het staat goed :) <leoquant> yep <leoquant> DooitzedeJong, ? <leoquant> nee, dan staat het prima zo...:) <RawChid> Over een paar minuten begint hier de wiki workshop <leoquant> Cees, kan ook z'n zegje doen <Cees> ja hoor <leoquant> nice <RawChid> Hm, ik verwacht nog een paar mensen (die op de lijst staan) <leoquant> ik denk dat "we" kunnen beginnen? ik had ook nog wat mensen verwacht. vreemd <RawChid> Is goed laten we dan maar beginnen. <RawChid> Welkom allemaal bij de workshop Werken met de Wiki. <RawChid> Deze workshop wordt gegeven in #ubuntu-nl-mwanzo-klas en vragen kunnen gesteld worden in #ubuntu-nl-mwanzo. <RawChid> Het eerste gedeelte zal ik vooral vertellen over wiki's. En bij het tweede gedeelte gaan we zelf aan de slag. <RawChid> = Wat is wiki = <RawChid> Een wiki is een website van verschillende gekoppelde pagina's welke door iedereen aangepast en aangemaakt kunnen worden. <RawChid> De ontwikkelaar van de eerste wiki-software beschreef het als "de eenvoudigste online database die mogelijk zou kunnen werken". <RawChid> Wiki is trouwens een Hawaiiaans voor snel. <RawChid> Het aanpassen van pagina's wordt gedaan in een vereenvoudige opmaaktaal of in een zogenaamde WYSIWYG-editor. <RawChid> Hier zal ik later wat meer over vertellen <RawChid> Wiki's zijn onder andere handig voor websites van een gemeenschap, intranet of kennisbeheer binnen organisaties. <RawChid> Zoals je merkt kun je een wiki voor veel verschillende doeleinden gebruiken. <RawChid> Daarom kun je wiki-software tegenwoordig in allerlei soorten en maten vinden. <RawChid> Sommige zijn erg specifiek gericht op 1 bepaald doel, andere weer wat algemener in gebruik. <RawChid> De syntax (of wiki-taal) kan ook verschillen per wiki-software. Maar meestal zijn ze in grote lijnen hetzelfde. <RawChid> == MoinMoin == <RawChid> Ik zal deze workshop vaker spreken over "onze wiki". Hiermee bedoel ik dan de wiki op wiki.ubuntu-nl.org <RawChid> Op wiki.ubuntu.com en onze wiki wordt er gebruik gemaakt van MoinMoin. <RawChid> MoinMoin is een wiki-software gebouwd in Python. <RawChid> Zoals eerder gezegd kan de syntax per wiki-software verschillen. Daarom zullen we ons vanaf nu geheel richten op MoinMoin en haar syntax. <RawChid> Trouwens, Moinmoin is ook een Nigeriaanse gestoomde bonenpudding: http://en.wikipedia.org/wiki/Moin_moin <RawChid> = Wiki taal = <RawChid> Ik heb verteld dat je een wiki vaak kunt bewerken met een WYSIWYG-editor, of doormiddel van een opmaaktaal. <RawChid> == opmaaktaal == <RawChid> Bij een opmaaktaal kun je bijvoorbeeld denken aan HTML. <RawChid> Dit houdt in dat je in het bronbestand de tekst kan opmaken met codes, en in de browser zie je hoe het er daadwerkelijk uit komt te zien. <RawChid> Een wikitaal is meestal wel een stuk simpeler dan HTML. <RawChid> == WYSIWYG editor == <RawChid> WYSIWYG staat voor What You See Is What You Get (wat u ziet is wat u krijgt) <RawChid> Als je hier een stukje tekst dikgedrukt wilt maken, selecteer je dat, en drukt op een knop of sneltoets, en je krijgt gelijk te zien hoe de tekst eruit hoort te zien. <RawChid> Denk hierbij aan OpenOffice Writer of Word. <RawChid> Op onze wiki kun je helaas geen gebruik maken van een WYSIWYG-editor, dus je zult met de opmaaktaal aan de slag moeten. <RawChid> Veel basisdingen kun je terugvinden op de pagina: http://wiki.ubuntu-nl.org/community/WerkenMetDeWiki <RawChid> hannie gaf net ook een hele handige link: http://wiki.ubuntu-nl.org/HelpOnMoinWikiSyntax#TableofContents <RawChid> Vooral in het begin heb je hier veel aan <RawChid> == Voorbeeld == <RawChid> Ik heb een simpel voorbeeld gemaakt op: http://wiki.ubuntu-nl.org/SimpelePagina <leoquant> erkan^> is wiki gebaseerd op HTML 4.01 ? <RawChid> Kunnen jullie deze link even openen? <RawChid> erkan^, een wiki bewerken doe je in een opmaaktaal die een stuk simpeler is dan HTML. <RawChid> De wiki software maakt hier uiteindelijk wel HTML van, die weer netjes door je browser weergegeven kan worden <RawChid> Het is dus niet speciaal gebaseerd op HTML 4.01 <RawChid> Ik ga nu die opmaaktaal uitleggen <RawChid> Dan wordt het misschien wat duidelijker <RawChid> Hebben jullie de link die ik net gaf geopend? <RawChid> Om te bekijken hoe de broncode van deze pagina eruit ziet kun je linksboven klikken op: Bewerken <RawChid> Mocht je nog geen account hebben, dan is hier een screenshot van wat je zou moeten zien: http://wiki.ubuntu-nl.org/community/mwanzo/Workshop/WikiInleiding/Les1?action=AttachFile&do=view&target=edit-wiki.png <RawChid> Eerst zal ik het scherm uitleggen wat je te zien krijgt, en daarna ga ik in op de inhoud van de pagina (de opmaaktaal). <RawChid> == De editor == <RawChid> Bovenaan zie je vier knoppen. <RawChid> De eerste twee zijn het belangrijkst, "Wijzigingen opslaan" en "Proeflezing". <RawChid> De eerste hoef ik hopelijk niet uit te leggen. <RawChid> De knop "Proeflezing" is erg handig! Deze laat je zien hoe je tekst eruit komt te zien wanneer je op "Opslaan" klikt. <RawChid> Het is belangrijk dat je met deze knop altijd je wijzigingen controleert voordat je daadwerkelijk opslaat <RawChid> Onder die knoppen staat de editor. Dit is een tekstvak met de broncode van de betreffende wiki-pagina. <RawChid> Is iedereen bij? <leoquant> RawChid, 1 vraagje, kan iedereen inloggen cq bewerken? <RawChid> Iedereen die een account heeft kan inloggen <RawChid> Oh, ik zie dat ze deze niet mogen bewerken natuurlijk <RawChid> Ik zal de pagina even verplaatsen zodat iedereen op bewerken kan klikken <RawChid> http://wiki.ubuntu-nl.org/community/SimpelePagina <RawChid> OKe, ik ga weer verder <RawChid> Onder de editor is een tekstveld om commentaar in te vullen. Dit veld is niet verplicht. <RawChid> Als je problemen hebt met die pagina, open dan gewoon de screenshot. <RawChid> Ik licht nu alleen even toe wat de knoppen enzo betekenen <RawChid> Onder de editor is een tekstveld om commentaar in te vullen. Dit veld is niet verplicht. <RawChid> Toch wordt het erg gewaardeerd als je hier beknopt neerzet wat je hebt veanderd. Dan is het later ook duidelijker te zien wat waar en wanneer is veranderd. <RawChid> De opties op de volgende regel laat ik nu even buiten beschouwing. <RawChid> Onderaan zie je een groot vlak met wat voorbeelden hoe je tekst kunt opmaken. (dikgedrukt, schuingedrukt, etc) <RawChid> De 2 links onderaan (rood) geven je een schat aan informatie en voorbeelden hoe je tekst kunt opmaken. Vooral in het begin kun je hier veel van leren. <RawChid> Verder is erg leerzaam om veel af te kijken. Als je bijvoorbeeld iets wilt maken, en je hebt het eerder gezien. Kopieer het stukje tekst van die pagina en pas het aan op je eigen pagina. <RawChid> == Opmaaktaal == <RawChid> Nu genoeg over het scherm. Ik zal uitleggen hoe die opmaaktaal nou werkt... <RawChid> De eerste regel begint met ## Commentaar: ... <RawChid> Elke regel die begint met ## is commentaar en is alleen te zien in de broncode. <RawChid> Commentaar zie je alleen als je de bron bekijkt <RawChid> Als je de pagina zelf bekijkt in de wiki zie je deze regel dus niet. <RawChid> Is dit duidelijk? <RawChid> Vervolgens zie je een regel die begint met = <RawChid> Dit is een titel (of koptekst) <RawChid> Je kunt een koptekst maken door het tussen = = te zetten. <leoquant> <erkan^> betekent # (br) ? <RawChid> Nee <RawChid> De wiki is erg streng met spaties enzo. Let er dus op dat de regel begint met = en ook eindigt met een =. <RawChid> Als er maar een spatie voor of achter staat zie je dat de wiki er geen titel van maakt, maar gewoon de tekst afdrukt. <RawChid> Een stelletje pubers hebben al ontdekt hoe je
{'channel': 'ubuntu-nl-mwanzo-klas', 'month': 3}