1 |
#+LANGUAGE: nl |
2 |
#+LATEX_CLASS: article |
3 |
#+LATEX_CLASS_OPTIONS: [a4paper] |
4 |
#+LATEX_HEADER: \usepackage{pdfpages} |
5 |
#+LATEX_HEADER: \usepackage[dutch]{babel} |
6 |
#+AUTHOR: Maarten Vangeneugden |
7 |
#+EMAIL: maarten.vangeneugden@student.uhasselt.be |
8 |
#+TITLE: Voorstel bachelorproef |
9 |
* Executive summary |
10 |
De UHasselt is een universiteit die voor veel taken gebruik maakt van een |
11 |
IT-infrastructuur. Maar naar mijn mening is de huidige infrastructuur /zeer/ |
12 |
ontoereikend voor wat het hoort te doen. |
13 |
|
14 |
Mijn voorstel voor de bachelorproef is een systeem te programmeren, dat *een |
15 |
geïntegreerd platform* vormt *voor nagenoeg alle digitale functionaliteit van de |
16 |
UHasselt* (met uitzondering van enkele systemen die praktisch onvervangbaar zijn). |
17 |
|
18 |
De uiteindelijke implementatie omvat kort samengevat: |
19 |
- Een sociaal platform, gericht op de academische behoeften van zowel studenten |
20 |
als personeel (zie ook [[Waarom een sociaal platform]]) |
21 |
- Een centrale databank die alle informatie proper en veilig opslaat. Concreet |
22 |
is dit minstens |
23 |
een volledig uitgewerkt en [[https://nl.wikipedia.org/wiki/Databasenormalisatie][genormaliseerd]] schema (dat al |
24 |
geïmplementeerd kan worden met het voorgestelde systeem (zie [[Softwareframework]])) |
25 |
- Modules om te verbinden met externe, praktisch onvervangbare infrastructuur |
26 |
(PingPing, printinfrastructuur, ...) |
27 |
- Een academisch platform waarop alle vakken behandeld kunnen worden. |
28 |
- Een administratief gedeelte dat veel functionaliteit die nu in het |
29 |
Studentendossier zit, zal aanbieden. |
30 |
Deze opsomming doet het project eigenlijk geen goed: ook al leest dit als een hoop |
31 |
verschillende programma's, de realiteit is echter dat /alle/ functionaliteit één |
32 |
geïntegreerd geheel vormt. \\ |
33 |
Alle programma's gebruiken namelijk voor een groot deel dezelfde infrastructuur, |
34 |
met als meest prominente voorbeelden: |
35 |
- Databank |
36 |
- Softwareframework |
37 |
- Visuele layout |
38 |
- Achterliggende hardware |
39 |
Met als resultaat dat het voor de eindgebruiker voelt alsof alles |
40 |
samen /hoort/ en samen /werkt/. |
41 |
|
42 |
De uiteindelijke uitwerking van de proef omvat dus een *werkende implementatie* |
43 |
(in de voorgestelde /software stack/), een *onderzoek naar de bestaande |
44 |
structuren* en *verzamelen van de noden van alle betrokkenen* (administratie, |
45 |
studenten, professoren, ...). Al de vergaarde data wordt uiteindelijk verwerkt |
46 |
in een *gedetailleerd rapport*, vergezeld van alle benodigde gerelateerde zaken |
47 |
(zoals broncode). |
48 |
|
49 |
* Veldonderzoek |
50 |
Een prominent onderdeel van het project, is het voorafgaande onderzoek. |
51 |
Dit is belangrijk voor de uiteindelijke software, want dat laatste bouwt |
52 |
voor op de bevindingen uit het onderzoek. |
53 |
|
54 |
Er kan natuurlijk gebruik gemaakt worden van verzamelde informatie uit enquêtes, |
55 |
maar ik denk dat het ook nuttig zal zijn te polsen naar wat er /nu/ gebruikt |
56 |
wordt om de taken te vervullen, en op basis daarvan te voorspellen hoe dit in |
57 |
het nieuwe systeem verwerkt kan worden. |
58 |
Deel van het onderzoek bestaat uit het kunnen voorspellen van wat iemand zou |
59 |
willen; je kan niet gewoon vragen wat iemand wilt, of je gaat meestal algemene |
60 |
antwoorden krijgen zoals: "Iets dat goed werkt". |
61 |
** Belanghebbenden |
62 |
De belanghebbenden zijn kort samengevat: alle mensen die actief verbonden zijn |
63 |
aan de UHasselt. Triviale voorbeelden zijn de studenten, professoren, |
64 |
administratief personeel, ... |
65 |
|
66 |
Alhoewel ik denk een goed algemeen beeld te hebben van de wensen, zit het |
67 |
probleem vaak in de details; professoren die architectuur doceren kunnen andere |
68 |
wensen hebben dan professoren die fysica doceren. Het kan weinig kwaad om te |
69 |
polsen naar de individuele noden, en te trachten een oplossing aan te bieden die |
70 |
hieraan tegemoet kunnen komen. |
71 |
** Gebruikte software als voorbeeld |
72 |
De reden waarom de huidige software gebruikt wordt, is omdat er nood was aan |
73 |
software die een bepaalde taak kon vervullen.\\ |
74 |
De manier waarop de universiteit gebruik maakt van wat er nu is, geeft een |
75 |
sterke indicatie van wat er gevraagd wordt. Functionaliteit die nu in BlackBoard |
76 |
zit, zou dus deels moeten worden overgenomen in het nieuwe systeem. |
77 |
|
78 |
** Beschikbare API's en oplossingen |
79 |
Het is mogelijk dat de software die niet vervangen zouden worden geen publieke API |
80 |
ter beschikking stellen.\\ |
81 |
Dit hoeft echter geen beperking op te leveren om met deze diensten te |
82 |
interageren vanuit dit systeem. |
83 |
|
84 |
Het is namelijk zo dat /elk/ systeem dat zelf een website aanbiedt, geïntegreerd |
85 |
kan worden in dit project, zelfs als er geen API voorhanden is. |
86 |
Hieronder vallen de belangrijkste diensten, zoals |
87 |
PingPing en EveryonePrint. |
88 |
|
89 |
Ter demonstratie kunt u in [[Bijlage C][Bijlage C]] een klein script vinden dat met de logingegevens van een |
90 |
account, het resterende PingPing-saldo van dat account afdrukt op het scherm. |
91 |
|
92 |
Merk op dat dit slechts een voorbeeld is om aan te tonen dat, zelfs zonder een |
93 |
API, het mogelijk is om te interageren met bestaande infrastructuur. En minstens |
94 |
zo belangrijk; dat dit in een aanvaardbare hoeveelheid broncode kan geschreven |
95 |
worden.\\ |
96 |
PingPing en |
97 |
EveryonePrint gebruiken beide een website om met gebruikers te communiceren, en |
98 |
input van de gebruiker uit gebeurt via HTML-forms, wat dus relatief makkelijk |
99 |
via code kan worden behandeld. |
100 |
|
101 |
Voor EveryonePrint is een analoge oplossing mogelijk, en e-mails kunnen |
102 |
gemakkelijk via IMAP en SMTP opgevraagd en verstuurd worden. |
103 |
|
104 |
De reden dat deze integratie zo belangrijk is, is om de eenheid en uniforme |
105 |
stijl van het systeem te kunnen benadrukken bij de eindgebruiker, |
106 |
zelfs als dit achter de schermen niet echt zo werkt.\\ |
107 |
Een praktisch voorbeeld is dat, als een docent een PDF-document deelt met |
108 |
zijn/haar studenten, het mogelijk is om dat document direct naar de gewenste |
109 |
printer te sturen |
110 |
door op een printknop langs het document te klikken. Een veel |
111 |
gebruiksvriendelijkere oplossing dan hoe het nu moet. |
112 |
|
113 |
* Implementatie |
114 |
Kort opgesomd zou dit systeem de volgende digitale platformen vervangen en in |
115 |
hun volledigheid integreren in het nieuwe systeem: |
116 |
- [[https://bb.uhasselt.be][BlackBoard]] |
117 |
- [[http://www.uhasselt.be/UH/nl/InfoVoor/studenten-en-doctorandi/Snellinks-studenten/Studiegids.html][Studiegids]] |
118 |
- [[http://www.uhasselt.be/UH/nl/InfoVoor/studenten-en-doctorandi/Snellinks-studenten/Mijn-Studentendossier.html][Studentendossier]] |
119 |
- Uurroosters (zowel [[http://www.uhasselt.be/UH/nl/InfoVoor/studenten-en-doctorandi/Snellinks-studenten/Uurroosters.html][statisch]] als [[http://www.uhasselt.be/UH/nl/InfoVoor/studenten-en-doctorandi/Snellinks-studenten/Uurroosters-(dyn).html][dynamisch]]) |
120 |
- [[http://www.uhasselt.be/UH/nl/InfoVoor/studenten-en-doctorandi/Snellinks-studenten/Examenroosters.html][Examenroosters]] |
121 |
- [[http://www.uhasselt.be/UH/nl/InfoVoor/studenten-en-doctorandi/Snellinks-studenten/Acad-kalenders.html][Academische kalender]] |
122 |
- [[https://www.sturauhasselt.be/][StuRa]] |
123 |
- [[https://m.uhasselt.be]] |
124 |
|
125 |
De volgende platformen zouden niet vervangen worden, maar zullen verbonden |
126 |
worden met het systeem om een visueel geheel te kunnen vormen (Middels een API, |
127 |
een alternatief wordt besproken in [[Beschikbare API's en oplossingen]]): |
128 |
- [[https://mail.uhasselt.be][Mailsysteem van de UHasselt]] |
129 |
- [[http://www.uhasselt.be/PingPing][PingPing]] |
130 |
- [[http://everyoneprint.uhasselt.be][EveryonePrint]] |
131 |
|
132 |
Speculerend over een hypothetische toekomst van het project, zou het ook (na |
133 |
voltooiing!) andere |
134 |
delen van de IT-infrastructuur kunnen integreren, zoals de [[https://www.uhasselt.be/Help-Studenten-Algemene_Help-Huisstijl][bibliotheek]], Toledo, |
135 |
... |
136 |
|
137 |
** Bestaande infrastructuur |
138 |
De meest prominente reden dat zaken zoals PingPing niet vervangen worden, is |
139 |
omdat er geen directe nood is aan vervanging; het is een betalingssysteem dat |
140 |
goed werkt.\\ |
141 |
Belangrijk is dat, in tegenstelling tot bv. BlackBoard, PingPing intensief |
142 |
gebruik maakt van bepaalde hardware en bestaande materialen, zoals de |
143 |
studentenkaarten, de kassa's, ... |
144 |
Deze vervangen en gespecialiseerde software voor schrijven is moeilijker dan |
145 |
enkel een softwarepakket vervangen. |
146 |
|
147 |
Volgens mij is het dan beter om deze zaken te laten voor wat ze zijn, maar |
148 |
eerder een paar /software hooks/ in te bouwen met het project, zodat studenten bv. |
149 |
via een werkbalk op de website hun resterende PingPing-tegoed kunnen zien (mits |
150 |
ze aangemeld zijn). |
151 |
|
152 |
** Huisstijl |
153 |
Het hoeft geen uitleg dat de bestaande platformen lak hebben aan [[https://www.uhasselt.be/Help-Studenten-Algemene_Help-Huisstijl][de huisstijl |
154 |
van de UHasselt]]. Het eindresultaat voor de gebruiker is een (visueel bevestigd |
155 |
*en correct*) gevoel dat alles nogal ''op een eigen eilandje'' leeft, en niets |
156 |
echt met elkaar kan communiceren. |
157 |
|
158 |
Mijn oplossingen houdt een verdere uitwerking (en daadwerkelijk gebruik) van de |
159 |
huisstijl van de UHasselt in, zodat deze overal consistent terug te vinden is. |
160 |
Dit zal een verzorgde en afgewerkte uitstraling geven aan het systeem. |
161 |
|
162 |
** Waarom een sociaal platform |
163 |
Alle mensen op de UHasselt communiceren met elkaar; professoren en studenten, |
164 |
administratief personeel en studiebegeleiders, ...\\ |
165 |
Het is duidelijk: een digitaal platform voor communicatie is vitaal voor een |
166 |
moderne universiteit. Maar buiten e-mail is er geen enkele manier om sociaal |
167 |
actief te zijn op de universiteit. Studenten zijn aangewezen op externe sociale |
168 |
media (wat een uitsluitend effect heeft voor studenten zonder een account voor |
169 |
deze diensten), of externe communicatieplatformen zoals Slack (waar communicatie |
170 |
met studiebegeleiders of professoren niet mogelijk is). |
171 |
|
172 |
Dit zijn slechte hulpmiddelen; de populaire socialemediaplatformen hebben een |
173 |
winstoogmerk, en presenteren de gebruiker met dat wat hem/haar het meeste |
174 |
interesseert, maar niet per sé het belangrijkste, of waar hij/zij zich op hoort |
175 |
te concentreren.\\ |
176 |
Er zijn natuurlijk ook de fundamentelere problemen omtrent privacy en algemene |
177 |
impact van bv. Facebook op het leven van haar gebruikers. |
178 |
|
179 |
Met een zelfgebouwd sociaal platform voor de UHasselt worden al deze |
180 |
tekortkomingen weggewerkt; iedereen kan met iedereen communiceren via een |
181 |
systeem dat geschreven is /met het expliciete doel/ universitaire/academische communicatie |
182 |
te verzorgen. Dit maakt het vele malen geschikter dan sociale media zoals |
183 |
Facebook (die meer de focus leggen op algemene sociale activiteiten) en Slack |
184 |
(die zich richten op vormen van professionele communicatie in een context van |
185 |
/start-ups/ en KMO's). |
186 |
|
187 |
Het is belangrijk te weten dat *dit platform niet dient om afgeleid te worden |
188 |
van de verantwoordelijkheden van de gebruiker*; het gaat geen |
189 |
"UHasselt-Facebook" worden. Het ''sociale'' aspect is vooral gericht op |
190 |
communicatie en sociale zelfontplooiing binnen de universiteit.\\ |
191 |
Deze stelling impliceert echter niet dat informele communicatie verboden is, of |
192 |
zal worden tegengewerkt. |
193 |
|
194 |
Het platform zou ook integreren met de verschillende vakken die gedoceerd |
195 |
worden; zo kan het onderwijsteam snel communiceren met de studenten, en is er |
196 |
een veel lagere barrière om contact op te nemen bij vragen. |
197 |
|
198 |
Het laat ook toe om communicatie gemakkelijk te centraliseren en te |
199 |
structureren; Berichten kunnen gesorteerd worden per vak, gefilterd op datum, |
200 |
personen, ... Deze geraakt dan ook niet vermengd met ongerelateerde info buiten |
201 |
de universiteit om. |
202 |
|
203 |
Bijkomend laat het mensen toe zich te verenigen binnen zelfgemaakte groepen; zo |
204 |
kunnen ze studiegroepen oprichten, gelijkgezinde mensen zoeken voor een bepaalde |
205 |
hobby, ...\\ |
206 |
Natuurlijk kan het personeel van de universiteit ook deel uitmaken van dit soort |
207 |
groepen, en er zelf opstellen voor bv. onderzoeksteams. Deze groepen hoeven |
208 |
natuurlijk niet publiekelijk zichtbaar te zijn. |
209 |
** Softwareframework |
210 |
Het project zou volledig geschreven worden binnen een web-based systeem, dat gebruik maakt van het |
211 |
[[https://djangoproject.com][Django-framework]]. |
212 |
|
213 |
Ik heb enkele argumenten om deze keuze te staven: |
214 |
- Beperkte tijd :: Ik heb al veel ervaring met Django en Python. Voor de |
215 |
bachelorproef is het nefast om nog veel nieuwe |
216 |
technologieën te leren gebruiken voordat er daadwerkelijk kan |
217 |
begonnen worden met het uitwerken. |
218 |
- Web-based :: De studenten zijn vertrouwd met hun webbrowser te gebruiken voor |
219 |
de interactie met BlackBoard, Studentendossier, ... Alhoewel een |
220 |
desktopprogramma een minstens zo goed idee is, is het misschien |
221 |
toch beter om gewoon de website als basisplatform aan te bieden. |
222 |
Later kan er nog steeds uitgebreid worden door een /standalone/ |
223 |
programma te maken. |
224 |
- Volledige oplossing :: Django biedt ondersteuning voor meerdere talen |
225 |
(belangrijk om het internationale aspect van de UHasselt te benadrukken), |
226 |
een [[https://en.wikipedia.org/wiki/Object-relational_mapping][object relational mapper]] voor de databank, een |
227 |
[[https://docs.djangoproject.com/en/2.0/intro/overview/#a-dynamic-admin-interface-it-s-not-just-scaffolding-it-s-the-whole-house][automatisch gegenereerde adminpagina]], een cache-module om de druk |
228 |
op de server te verminderen, een [[https://docs.djangoproject.com/en/2.0/topics/templates/][modern systeem voor HTML-templates]], |
229 |
en gebruikt Python 3, wat het project toelaat |
230 |
om gebruik te maken van alle bestaande /software libraries/ voor deze |
231 |
programmeertaal. Django biedt ook uitgebreide |
232 |
[[https://docs.djangoproject.com/en/1.11/topics/security/][bescherming tegen bekende /exploits/ op het internet]]. Dit zijn slechts |
233 |
enkele voorbeelden van waarom Django een goed framework is. |
234 |
- Getest :: Bekende websites die van Django gebruik maken zijn onder andere |
235 |
[[http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances-dozens-of][Instagram]], [[https://developer.mozilla.org/en/Python#Use_of_Python_at_Mozilla][Mozilla]] en [[http://opensource.washingtontimes.com/][The Washington Times]]. |
236 |
- Agnostisch binnen gebruikte stack :: Wat binnen Django geschreven wordt, staat |
237 |
volledig los van de rest van de gebruikte software. Men kan dus bv. Apache |
238 |
vervangen door Nginx, zonder dat daar aanpassingen voor moeten gebeuren in |
239 |
Django. Zelfs complexere opgaven zoals een verandering van databank (bv. |
240 |
DB2 naar PostgreSQL) |
241 |
vereisen slechts een migratie van bestaande /records/, een proces dat |
242 |
toch /altijd/ moet gebeuren. Het is zelfs mogelijk de software op Windows, |
243 |
GNU/Linux of macOS te draaien, omdat de gebruikte Python-interpreter |
244 |
([[https://en.wikipedia.org/wiki/CPython][CPython]] of [[https://en.wikipedia.org/wiki/PyPy][PyPy]]) op deze besturingssystemen kan werken, zonder |
245 |
aanpassingen binnen de code (zolang deze ook OS-agnostisch geschreven is). |
246 |
- Vrije software :: Django is gelicensieerd onder de |
247 |
[[https://github.com/django/django/blob/master/LICENSE][3-clause BSD-licentie]], wat het [[https://www.gnu.org/licenses/license-list.html#ModifiedBSD][vrije software]] maakt. Dit is |
248 |
belangrijk voor [[https://www.gnu.org/philosophy/free-software-even-more-important.nl.html][ethische redenen]] ten opzichte van de |
249 |
gebruikers. Vanuit het standpunt van de universiteit is dit |
250 |
belangrijk om totale controle te kunnen behouden over |
251 |
de software die er gebruikt wordt, en in staat te zijn deze |
252 |
naar wens uit te breiden en te onderhouden. Er zijn veel |
253 |
meer redenen, maar gedetailleerdere info over |
254 |
het belang hiervan valt buiten het bereik van dit document. |
255 |
|
256 |
* Dit is nodig |
257 |
In het beleidsplan 2016-2020 is er binnen de UHasselt het ALIPA-project tot |
258 |
stand gekomen. /ALinging ICT with PArtners/ is een project om de informatica |
259 |
waar de UHasselt gebruik van maakt, terug op peil te brengen. |
260 |
In [[https://www.uhasselt.be/documents/Tijdschriften/nUweetjeHet/personeelsblad-februari-2017-klein.pdf][de eerste uitgave van nUweetjeHet]] werd ALIPA in een Q&A voorgesteld aan het |
261 |
brede publiek. |
262 |
|
263 |
De link aan het einde van het artikel ([[http://www.uhasselt.be/intra/Alipa]]) is op dit |
264 |
moment niet meer beschikbaar (voor mij?), en leidt gewoon naar https://www.uhasselt.be. |
265 |
|
266 |
Ik heb in het academiejaar 2016-2017 een vergadering van [[http://www.sturauhasselt.be][StuRa]] bijgewoond dat in |
267 |
dit project kaderde (zie [[Bijlage A][bijlage A]]). Ik heb daarvoor nog meegedaan aan "De grote |
268 |
ICT-enquête", waarvan enkele relevante antwoorden in [[Bijlage B][bijlage B]] opgelijst staan. |
269 |
|
270 |
Concreet is het punt dat geen enkel onderdeel van de UHasselt samen lijkt te |
271 |
werken, maar eerder allemaal totaal verschillende programma's zijn die niet met |
272 |
elkaar kunnen communiceren. De huidige situatie is een symptoom van een |
273 |
aanslepend probleem dat nog altijd niet opgelost raakt. |
274 |
|
275 |
Uitvoering van deze bachelorproef opent ook de deuren om voorstellen van studenten moeiteloos te |
276 |
integreren in de IT-infrastructuur van de UHasselt; voorbeelden zijn o.a. de |
277 |
mogelijkheid om lokalen te reserveren (en te controleren of een lokaal bezet |
278 |
is), medestudenten te vinden om te carpoolen, simpele en overzichtelijke |
279 |
agenda's, enquêtes ingericht door masterstudenten, ... |
280 |
|
281 |
Deze bachelorproef zou niet zozeer gericht zijn op het bestuderen van een nieuwe |
282 |
technologie, maar eerder op het onderzoeken naar wat er nodig is, en op basis |
283 |
van al bestaande (en geteste) technologie, een stabiele en robuuste oplossing |
284 |
ontwikkelen voor het probleem. |
285 |
|
286 |
Ik ben overtuigd dat de vaardigheid om een probleem te begrijpen, en te vertalen |
287 |
naar een creatieve informaticaoplossing (programma's schrijven is immers een |
288 |
creatief werk) een ondergewaardeerde kwaliteit is van een goede |
289 |
software-ingenieur, alsook de vaardigheid het juiste gereedschap te kunnen |
290 |
kiezen voor een probleem op te lossen. Software die het probleem niet kan oplossen, dient per |
291 |
definitie geen enkel doel, en ontstaat uit onbegrip van de programmeur zelf. |
292 |
De conclusie is dat het vitaal is om eerst degelijk onderzoek te verrichten, |
293 |
vooraleer er kan overgegaan worden op het uitwerken van een oplossing. |
294 |
|
295 |
Alhoewel nieuwe technologieën bestuderen zeker leerrijk en tof kan zijn, |
296 |
betekent dat niet dat het daarom ook een publieke nood zal vervullen. Er wordt |
297 |
veel onderzoek gedaan naar IoT en allerhande huis-en-tuinrobotjes die onze taken |
298 |
kunnen automatiseren, maar zelfs /smartwatches/ zijn nog altijd niet van de |
299 |
grond gekomen. De kans dat de kennis van deze onderwerpen later veel nut zal |
300 |
hebben voor de algemene bevolking, is zeer klein. In staat zijn om een probleem |
301 |
te begrijpen, is daarentegen een kwaliteit die zichzelf vele malen zal terugbetalen. |
302 |
|
303 |
Het project hoeft niet gebruikt te worden door de UHasselt, maar |
304 |
een daadwerkelijke /deployment/ behoort zeker tot de mogelijkheden; tot slot van |
305 |
rekening is deze software speciaal geschreven /in functie van de noden/ van de UHasselt. |
306 |
Ervan uitgaand dat dit niet gebeurt, kan dit project een bewijs zijn dat het wel |
307 |
écht beter kan dan de huidige infrastructuur. Het kan dus ook dienen als een |
308 |
/proof of concept/ voor de toekomst. |
309 |
|
310 |
Het uiteindelijke resultaat is dat de UHasselt zich hiermee kan profileren als |
311 |
een vooruitstrevende universiteit voor de 21^ste eeuw, die digitaal kritisch is |
312 |
uitgebouwd, en binnen het Belgische academische landschap waardig meestrijdt om |
313 |
een internationaal topland te vormen voor universitaire studies. Informatica maakt |
314 |
een integraal deel uit binnen /alle/ takken van een bedrijf en functioneert als |
315 |
de bloedbaan, met de software als het hart. En als dat goed pompt, werkt alles |
316 |
zoveel beter. |
317 |
* Bijlage A |
318 |
#+LATEX: \includepdf[pages={-}]{./VerslagwerkgroepICT-ALIPA30-01.pdf} |
319 |
* Bijlage B |
320 |
#+INCLUDE: "./ict-enquête.org" |
321 |
* Bijlage C |
322 |
#+INCLUDE: "./pingping.py" src python |