TheacherDojo Schio 2016

Dopo un anno e mezzo di CoderDojo posso dire di aver accumulato una certa esperienza nell'affrontare questo tipo di attivita?

Forse no, forse sì. Comunqie in occasione del TeacherDojo, tenuto sabato scorso, ho esposto un po' di idee sul Pensiero Computazionale. In particolare evidenziavo come che questo tipo di pensiero si caratterizza per delle abiltà e delle capacità interessanti utili "la vita di ogni giorno", in particolare:

  • confidenza nel trattare la complessità;

  • ostinazione nel lavorare con problemi difficili;

  • tolleranza all'ambiguità;

  • abilità nel trattare con problemi definiti in modo incompleto;

  • abilità nel trattare con aspetti umani e tecnologici;

  • capacità di comunicare e lavorare con altro.

Sono tutte cose che un sviluppatore software affronta tutti i giorni.

Vi lascio ls slides [1]

Esercizi di programmazione

Vogli presentarvi un piccolo esercizio di programmazione, un semplice programmino che macina numeri.

L'ispirazione mi è venuta scoprendo il sito ProjectEuler in una maillinglist.

ProjectEuler è una collezione di problemi matematici e informatici a cui dare una soluzione. ProjectEuler dice di sé

"La motivazione che ha spinto l'avvio del Progetto Euler, e la sua prosecuzione, è di fornire una piattaforma per la mente indagatrice, per approfondire zone sconosciute e imparare nuovi concetti in un contesto divertente e ricreativo."

ProjectEuler chiede di non divulgare le soluzioni per non togliere il gusto di indagare e scoprire a chi volesse cimentarvisi. Ma noi facciamo un'eccezione per far vedere come Python sia flessibile, potente e anche conciso (se si vuole).

Il problema numero uno chiede di trovare la somma degli interi minori di 1000 e divisibili per 3 o per 5. Semplice. Volevo proporre due soluzioni, una "classica" nel senso di ampia e verbosa e una estremamente conisa.

Prima soluzione:

somma = 0                # (0)
for x in xrange(3,1000): # (1)
    if x % 3 == 0:       # (2)
        somma += x       # (2.1)
    elif x % 5 == 0:     # (3)
        somma += x       # (3.1)
print somma

Vediamo nel dettaglio. (1) cicliamo tra i numeri da 3 a 1000 (escluso), ovviamente i numeri minori di tre non sono divisibili né per tre né per cinque quindi li saltiamo. (2) vediamo se x è divisibile per tre, (3) altrimenti proviamo se x è divisibile per cinque. Nei punti (2.1) e (3.1) sommiamo alla nostra varibile accumulatore somma (definita la passo (0)) il valore di x.

Potevamo risparmiaci un paio di passi raggruppando le condizioni:

somma = 0
for x in xrange(3,1000):
    if (x % 3 == 0) or (x % 5 == 0):
        somma += x
print somma

Per leggibilità ho messo le parentesi intorno alle due condizioni, ma grazie alla priorità degli operatori non sarebbe stato necessario.

Se volessimo cercare di scrive il programma più compatto possibile, potremmo usare la finzione sum() che somma gli elementi di una lista o di un oggetto iterabile. Per creare la lista possiamo usare due simpatiche contrazioni di if e for. Per esempio per creare una lista di valori di interi da 3 a 1000 potremmo scrivere così:

(x for x in xrange(3,1000))

e la somma è quindi:

sum(x for x in xrange(3,1000))

Ma così facendo avremmo la somma ti tutti i valori nell'intervallo. Dobbiamo discernere quali valori entrano nella lista e quali no, la condizione è sempre la stessa x % 3 == 0 or x % 5 == 0, adesso usiamo una forma contratta dell'istruzione <expr> if <cond> else <expr>:

sum((x if x % 3 == 0 or x % 5 == 0 else 0) for x in xrange(3,1000))

Finito! Abbiamo ottenuto lo stesso risultato! Da notare che stiamo usando python con un paradigma di programmazione funzionale.

Nelle versioni più vecchie di python [1] non esisteva il costrutto <expr> if <cond> else <expr>, ma si poteva utilizzare un po' di programmazione logica [2] sfruttando gli operatori and e or oltre al fatto di tenere presente come python valuta le espressioni. Quindi avremmo potuto avere il medesimo risultato con il codice seguente:

sum(((x % 3 == 0 or x % 5 == 0) and x or 0) for x in xrange(3,1000))

Il giochetto sta tutto nell'ordine e nelle proprietà degli operatori logici. Schematizziamo il nostro codice nel modo seguente:

<expr 1> and <expr 2> or <expr 3>

Ricordiamo che l'interprete valuta l'intera espressione da sinistra verso destra. Ricordiamo anche che l'operatore logico AND è vero solo (e soltanto) se entrambi gli operandi sono veri, falso se anche uno solo è falso. Mentre l'operator OR è vero se anche solo uno degli operandi è vero e falso se entrambi lo sono contemporaneamente. Quindi il nostro interprete python deve valutare se la nostra espressione e restituire un valore. Facciamolo noi al suo posto: partiamo da sinistra e valutiamo <expr 1> questa potrà avere valore vero o falso. Se <expr 1> è vera [3] per decidere che valore avrà l'intera espressione saremmo costretti a valutare anche <expr 2>. Se <expr 2> è vera allora abbiamo finito, l'intera espressione varrà il valore di <expr 2>. Se è falsa allora l'espressione varrà il valore che avrà <expr 3>. Finito.

Ovviamente queste non sono gli unici modi per risolvere il problema, nel forum di ogni problema ce ne sono per tutti i gusti e per tutti i linguaggi, ci sono soluzioni squisitamente matematiche e altre più computazionali. Una interessante utilizza i set di python che si riproduce le proprietà degli insiemi e dice semplicemente che il risultato e la somma dei multipli di tre range(3,1000,3) e di cinque range(5,1000,5) ovviamente senza ripetizioni.

Spero di aver stimolato un po' di curriosità nei lettori e vi consiglio di dare un'occhiata ai vari problemi di ProjectEuler.

CoderDojo

Nell'ultimo Linux Day (AViLUGLinuxDay2014), svoltosi lo scorso 25 ottobre, ho parlato dei CoderDojo, una realtà che sta crescendo in Europa e nel Mondo.

Cosa sono? Sono persone, luoghi e associazioni che si impegnano a far provare ai più piccoli la programmazioni utilizzano come strumenti la sperimentazione e la condivisione delle conoscenza.

Se volete saperne di più vi invito a dere un'occhiata alle mie slides e al video che AViLUG ha realizzato. Non di meno guardate il sito CoderDojo e cercate in internet e troverete.

Sito di riferimento: http://coderdojo.com/ // Sito italiano: http://coderdojoitalia.org/ // Materiale utile: http://kata.coderdojo.com/ // Fondazione: http://coderdojo.org/

Python Web Framework - piccola statistica

Ho fatto una piccola statistica (amatoriale) su alcuni web framework per python. Ho usato tre sorgenti di informazione diverse: il sistema di installazione pacchetti di python pip, il sistema di versionini on-line github e il sistema di indicizzazione del profetti FLOSS ohloh.

Per pip ho solo contato le righe che la ricerca ritorna.Semplice! Efficace? Semplice sicuremante, efficace non lo so, ma solo per avre un'idea della diffuzione del framework tra gli sviluppatori.

Ho aggiunto la ricerca da github sulle stelline, sui fork del progetto e i repository che corrispondono alla ricerca del termine corrispondete.

Infine ho riporatto anche un paio di parametri per ohloh.

zope2

django

flask

pyramid

web2py

righe pip search <term> | wc

822

5324

469

246

8

github star

11

8733

8364

1294

572

github fork

6

3239

2020

435

260

github search

567

29097

5021

1272

462

ohloh contributor

55

366

63

64

69

ohloh user

153

1044

69

0

27

L'unica cosa che voglio far notare è la rilevanza del progetto flask che pur essendo molto giovane senbra avere un grosso seguito tra gli sviluppatori.

Dicono di se...

Cosa dicono di se i principali web framework per Python? Dalle loro stesse "parole". E' una breve raccolta (senza pretesa di completezza) di testi estratti dai siti di riferimento.

Spero possa essere utile.

Django [1]

Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.

Developed by a fast-moving online-news operation, Django was designed to handle two challenges: the intensive deadlines of a newsroom and the stringent requirements of the experienced Web developers who wrote it. It lets you build high-performing, elegant Web applications quickly.

Django focuses on automating as much as possible and adhering to the DRY principle.

Pyramid [2]

Pyramid is a general, open source, Python web application development framework. Its primary goal is to make it easier for a Python developer to create web applications.

Pyramid attempts to follow these design and engineering principles:

Simplicity

Pyramid takes a “pay only for what you eat” approach. You can get results even if you have only a partial understanding of Pyramid. It doesn’t force you to use any particular technology to produce an application, and we try to keep the core set of concepts that you need to understand to a minimum.

Minimalism

Pyramid tries to solve only the fundamental problems of creating a web application: the mapping of URLs to code, templating, security and serving static assets. We consider these to be the core activities that are common to nearly all web applications.

Documentation

Pyramid’s minimalism means that it is easier for us to maintain complete and up-to-date documentation. It is our goal that no aspect of Pyramid is undocumented.

Speed

Pyramid is designed to provide noticeably fast execution for common tasks such as templating and simple response generation. Although “hardware is cheap”, the limits of this approach become painfully evident when one finds him or herself responsible for managing a great many machines.

Reliability

Pyramid is developed conservatively and tested exhaustively. Where Pyramid source code is concerned, our motto is: “If it ain’t tested, it’s broke”.

Openness

As with Python, the Pyramid software is distributed under a permissive open source license.

web2py [3]

Free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applications. Written and programmable in Python.

Batteries Included

Everything you need in one package including fast multi-threaded web server, SQL database and web-based interface. No third party dependencies but works with third party tools.

Web-Based IDE

Create, modify, deploy and manage application from anywhere using your browser. One web2py instance can run multiple web sites using different databases.

Extensive Docs

Start with some quick examples, then read the manual, watch videos, and join a user group for discussion. Take advantage of the layouts, plugins, appliances, and recipes.

Un sito statico perché?

Questo è il primo post di questo sito.

Cosa c'è di strano? Questo è un sito statico. Perché?

Nella mia attività quotidiano sviluppo applicazioni web, spesso mi capita di sviluppare anche siti web. E' da qualche anno che i siti sono dinamici, cioè ogni pagina è generata al momento della richiesta. Io stesso propongo ai miei clienti dei siti dinamici, perché, con applicazioni come Drupal, Joomla, Plone, WordPress, solo per citarne alcuni, chi si occupa della redazione di testi non deve o non può occuparsi di tutti gli aspetti tecnologici che stanno sotto a un sito web.

Quindi perché statico?

risorse

le pagine di un sito dinamico vengono rigenerate ogni volta che vengono richieste utilizzando CPU, memoria ed in ultima istanza energia, in un sito statico invece tutte le pagine del sito sono già pronte per essere inviate, tutta la fase di costruzione e generazione viene fatta una volta sola;

prestazioni

per lo stesso motivo inlustrato ne punto precedente, in un sito statico non vengono sprecato tempo per generare la pagina richiesta, l'invio è immediato;

sicurezza

nessun programma in esecuzione sul server web implica che non ci sono bug che un possibile intruso possa sfruttare per intrufolarsi nel nostro sito.

Ovviamente si perdono form, multiutenza, concorrenza, ecc.

Per ultimo il software con qui è fatto questo sito si chiama Nikola , mi è parso un bel nome :) ed è fatto in Python. Mi sono sembrati due buoni motivi per provarlo.