dimarts, 29 d’octubre del 2013
Com fer-te el teu propi notificador disponibilitat de Nexus 5
Necessitarem:
- Una màquina linux connectada a internet les 24h i amb el correu configurat
- Un dispositiu que pugui rebre correu electrònic per rebre l'alerta.
Primer crees una carpeta per al projecte:
mkdir /directori_de/disponibiliatatNexus
Després et baixes la pàgina de Google on encara no apareix el Nexus 5:
/usr/bin/wget -o /dev/null -O - https://play.google.com/store/devices \
| grep -v page-load-indicator > no.html
I ara escrius aquest script, li direm comprova.sh:
#!/bin/bash
cd /directori_de/disponibiliatatNexus
/usr/bin/wget -o /dev/null -O - https://play.google.com/store/devices \
| grep -v page-load-indicator > potser.html
diff no.html potser.html > /dev/null
if [ -a nomore ]
then
exit
fi
if [ $? -eq 1 ]
then
touch nomore
echo "Subject:Comprova diponibilitat nexus" | /usr/bin/sendmail el_teu@correu.cat
fi
Poses l'script al cron:
3,altres minuts,57 * * * * \
/directori_de/disponibiliatatNexus/comprova.sh 2>> \
/directori_de/disponibiliatatNexus/errors.log
I t'esperes a rebre l'avís.
That's all!
dissabte, 26 d’octubre del 2013
Autoavaluació MÒDUL 7: DESENVOLUPAMENT WEB EN ENTORN SERVIDOR
Autoavaluació
MÒDUL 7: DESENVOLUPAMENT WEB EN ENTORN SERVIDOR
Aquest és el resultat de l'autoavaluació anònima dels alumnes a la primera unitat formativa del mòdul professional DESENVOLUPAMENT WEB EN ENTORN SERVIDOR
La valoració de cada ítem és del 1 al 5, essent 5 perfecte i 1 molt malament. A la representació gràfica la puntuació 3 ( corresponent a la nota de 'un 5' ) és considerada negativa i li assigno el color groc. La puntuació 4 i 5, són possitives i els assigno el color verd. El taronja i el vermell representen les pitjors puntuacions, el 4 i el 5.
Les conclusions al llegir els resultats és que la UF ha anat prou bé. No haver modificat cap CMS ha fet baixar molt la valoració del resultat d'aprenentatge 4. Els alumnes estan contents de l'esforç que han realitzat durant aquesta unitat formatica i, al marge de l'autoavaluació, jo també estic satisfet de l'interés que han mostrat a classe i el treball que han realitzat.
Hi ha hagut un despistat que ha valorat molt possitivament el resultat d'aprenentatge 4.6. Ho podeu veure en detall punxant a la pestanya 'D.Detall'
Espero que aquesta UF hagi servit per assentar els conceptes bàsics de la programació web: session-less, cookies, POST, GET, etc.
Visualutzació de dades amb la tècnica Net stacked distribution – a better way to visualize Likert datadilluns, 12 d’agost del 2013
Retention Visualization
![]() |
MySQL user retention and day to day |
- No disposa de taules de pivotació ( per transposar les dates a columnes tal com es veu a la imatge)
- No disposa de funcions analítiques.
- No disposa de generadors de dates ( ni tans sols generadors d'enters )
- No disposa de CTE per poder trencar la consulta en consultes més fàcils.
- Subqueries de subqueries.
- Passar format datetime a date com string.
- Generador d'enters fet a mà
dimecres, 7 d’agost del 2013
Google Trends: Recerques sobre estudis superiors.
Indicador:
He assenyalat en taronja els mesos de maig i juny que són els mesos en que els alumnes busquen informació per a la matrícula. També el setembre en verd.
Interpretació:
La meva pregunta sobre el gràfic és per què al setembre hi ha més recerques que al juny (o maig) sent aquestes dates quan els alumnes decideixen els estudis que faran. D'altre banda, no sembla que el gràfic tingui relació amb l'interés o matriculacions dels alumnes a la Universitat (no he buscat dades comparatives) però seria interessant saber per què hi ha aquest descens de les cerques sobre el terme 'Universitat'. D'altre banda, queda clar que el pitjor moment per invertir en una campanya publicitària online seria el Nadal.
He descarregat de l'INE les dades de presentats i aprovats de les PAU. Sembla un bon indicador per a comparar-ho amb les recerques a google de la paraula 'Universitat'. Observem que no hi ha una correlació entre les recerques entre el mot 'Universitat' i la gent que es prepara per als estudis universitatis:
Nota: L'any 2013 no és comparable doncs hi ha dades només fins agost.
dimarts, 14 de maig del 2013
GHAP-BI: OLAP project with only open source tools
Previous GHAP feature was the ability to predict students attendance, a mix of Knime decision tree model and python lxml module to read resulting PMML.
The new GHAP big feature is the Business Intelligence module. GHAP is for public schools, for this (and other) reason only free software tools should be included. I'm used to develop BI projects but this is my first one with open software tools. In this post I explain GHAP-BI software components and experience.
As any BI solution GHAP-BI incorporates ETL and Data Analysis and visualization software.
ETL is splitted as E+TL. The Extraction phase is made directly by GHAP application (django) and Transform and Load is made with pygrametl. This tool, pygrametl is praiseworthy: it is easy, fast and powerful and also clear documentation is available.
I prefer OLAP solutions over Reporting solutions, I appreciate metadata layer with measures and dimensions, for this reason I have included Saiku software as viz software. I found Saiku through a post in stackoverflow.
ETL development: GHAP generates each night a 91MB text file (>500K lines), it takes over 4 hours to complete export. This file contains 1 course attendance controls full detailed. Then, a little python code load this data into Warehouse database. In 2 minutes all data is imported over 5 tables in snow-flock design. pygrametl is the piece that makes this possible combining dimension cache with bulk facts import. Notice that pygrametl could reduce drastically also export time avoiding database lookups, but I prefer to generate first text file.
Viz: Saiku is the front end for the users. You can learn about Saiku Pros and Cons reading @twn08 post, but this is my experience: I send GHAP-BI url, user and passwd to manager, 20 minutes later I move to manager's office to know if connection was successful and my surprise was to see Saiku page with a combination on filters, dimensions and measures and also with some sorted data! When user see me the question was: "how can I export this viz?" I realized than Saiku is a very friendly tool. Install Saiku is easy, I have apt-get installed tomcat6 and copy Saiku "binary" files into tomcat webapps folder, then change connections and schema.
DataWarehouse backend: Saiku perform MDX queries to Mondrian and Mondrian translate it to Relational Database. I have test with both MySQL and Postgres, this one, Postgres, is definitely the option adopted. Postgres serves in seconds queries that run forever in MySQL.
Cubes: I have wrote cube schema initially with Pentaho Schema Workbench, but I have left it when I have transformed dimensions to shared dimensions.
Summarizing, In 20 hours my open software BI solution was successfully running, thanks to: python, django, Saiku, Postgres and pygrametl.
dissabte, 6 d’abril del 2013
Em sento afortunat - Arbres de decisió
Per facilitar la tasca del professor a l'hora de passar llista l'aplicatiu disposa de l'opció 'copiar assistència de l'hora anterior'. Aquesta opció funciona molt bé però depen de que el professor anterior hagi passat llista.
Amb l'esperit de facilitar la tasca del professorat, i d'entretenir-me jo mateix, he afegit la opció 'Em sento afortunat'. Triant aquesta opció l'aplicatiu fa una proposta de passar llista (a partir de la seva predicció).
Però, quina lògica hi ha d'arrera d'aquesta opció?
Els models cal contrastar-los per saber si estan funcionant correctament. Normalment es reserva un 20% de les mostres per, en comptes de donar de menjar al programa que apren, s'utilitzin per contrastar el model. Jo aquest pas no l'he fet, però procuraré, d'aquí tres setmanes, comprovar la bondat del model amb els nous controls que es realitzin. Mentrestant animo als companys a sentir-se afortunats.
dilluns, 28 de gener del 2013
Corva epidèmica de la grip v.s. assistència a l'Institut
Ara que estem a 3 setmanes del pic màxim de grip, he volgut mirar com ens afectarà l'epidèmia en relació a l'assistència dels alumnes a les aules tot comparant-ho amb pics històrics.
Utilitzant les dades obertes i les dades tencades he elaborat el següent gràfic. En blau representat el número de faltes per setmana i en vermell les taxes setmanals de grip. Les puntes d'absència en blau segurament són vagues.
Obviament una sèrie de un curs acadèmic no ens aporta gran informació,
La sorpresa ha estat observar com les absències dels alumnes són inversament proporcionals a les taxes de grip.
Aquesta priàmide de taxa de grip per edats ens pot argumentar en part els resultats observats:
La segona explicació a la correlació inversa és que els professors de guardia no passen llista.
Per últim un gràfic incloent la temporada 2010-2011 en la que vam fer servir el programari de l'Institut Brugulat per a dur el control de presència. En aquella temporada el pic de grip va caure a la setmana 2.
dilluns, 31 de desembre del 2012
Exercicis de Primària amb Python V
Plantejament
- Identifiquem cada vertex amb una lletra.
- Construim un diccionari python amb una 'cassella' per a cada vertex.
- Fem una 'llista' (és una tupla en realitat) amb els parells de nodes adjacents.
- Provem totes les permutacions de digits tot imprimint les que compleixen amb els requeriments de l'enunciat.
El codi del programa
from itertools import permutations, combinations_with_replacement
vertex = {}
for identificador in ( 'A','B','C','D','E','F' ):
vertex[identificador] = None
adjacents = (
( 'A', 'B' ), ( 'A', 'D' ), ( 'A', 'E' ), ( 'A', 'F' ),
( 'B', 'A' ), ( 'B', 'D' ), ( 'B', 'C' ),
( 'C', 'B' ), ( 'C', 'D' ), ( 'C', 'F' ),
( 'D', 'A' ), ( 'D', 'B' ), ( 'D', 'C' ), ('D', 'E'),
( 'E', 'A' ), ( 'E', 'D' ), ( 'E', 'F' ),
( 'F', 'A' ), ( 'F', 'C' ), ( 'F', 'E' ),
)
digits = ( 5,6,7,8,9,10 )
for (vertex['A'], vertex['B'], vertex['C'],
vertex['D'], vertex['E'], vertex['F'], ) in permutations ( digits ):
if all( vertex[ v1 ] - vertex[v2] != 1 for ( v1, v2) in adjacents ):
print ( 'A:', vertex['A'], 'B:', vertex['B'], 'C:', vertex['C'],
'D:', vertex['D'], 'E:', vertex['E'], 'F:', vertex['F'] )
El resultat
dani@egg-v3:~/tmp/llu$ python vertexs.py
('A:', 5, 'B:', 8, 'C:', 6, 'D:', 10, 'E:', 7, 'F:', 9)
('A:', 10, 'B:', 7, 'C:', 9, 'D:', 5, 'E:', 8, 'F:', 6)
Altres Exercicis
http://beutil.blogspot.com.es/search/label/python_i_exercicis_matesdiumenge, 30 de desembre del 2012
Exercicis de Primària amb Python IV
Enunciat
Aquest exercici no té enunciat. Nomès apareix aquesta imatge:Entenc que és un exercici tipus 'xifres i lletres' i cal obtenir el resultat indicat amb una combinació d'operacions amb tots els dígits disponibles.
Recordo que aquests exercicis són de Nou i mig 8 és un llibre de l'editorial Teide.
Resolució:
- Creo les operacions com diccionaris per tal de tenir el nom i la operació.
- Faig una tupla amb les operacions que intervenen.
- Faig una llista amb els dígits disponibles.
- Poso en una variable el resultat desitjat.
- Per últim, busco totes les possibles combinacions d'operacions preses de 4 en 4. Per a cada combinació busco totes les seves permutacions i les combino amb totes les permutacions dels dígits disponibles.
- El resultat el comparo amb el resultat desitjat
El programa:
from itertools import permutations, combinations_with_replacement
operacions = {}
operacions['+'] = lambda x,y: x+y
operacions['-'] = lambda x,y: x-y
operacions['*'] = lambda x,y: x*y
operacions['/'] = lambda x,y: x/y
numeros = ( 22, 2, 10, 6, 11 )
resultat_desitjat = 201
for (A, B, C, D, E ) in permutations ( numeros ):
for combinacio_operacio in combinations_with_replacement( operacions, 4 ):
for ( op1, op2, op3, op4 ) in permutations( combinacio_operacio ):
r1 = operacions[op1]( float( A ), float( B ) )
r2 = operacions[op2]( float( r1 ), float( C ) )
r3 = operacions[op3]( float( r2 ), float( D ) )
r4 = operacions[op4]( float( r3 ), float( E ) )
if r4 == resultat_desitjat and r1 > 0 and r2 > 0 and r3 > 0 and r4 > 0:
print A, op1, B, op2, C, op3, D, op4, E
Els resultats:
dani@egg-v3:~/tmp/llu$ python batedora.py | more
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11
22 * 10 - 2 - 6 - 11






















