S4A Robótica para niños: liderar y trabajar en equipo

He iniciado un proyecto personal para enseñar a los niños robótica y programación. Lo cierto es que es algo que me lleva rondando la cabeza desde hace tiempo. Lo mínimo que se necesita para aprender todo esto es leer, escribir y un poco de álgebra muy básica, nada que no se pueda aprender sobre la marcha. Es decir, para niños de entre 7-8 años creo que iría bastante bien, aunque pienso que a partir de 8 años sería óptimo. Casualmente he encontrado varias personas interesadas en lo mismo, Juan Daniel Toledano Ferrera, Keeponfresh Moopy (es un alias) y Diego Manso,  con los que espero tener una estrecha colaboración.  Juan Daniel incluso ha avanzado en asuntos de recursos como aulas y equipos informáticos, contactos interesantes de varias universidades y del MIT. Yo estoy avanzando desde la parte más práctica: arduino y programación con Scratch, además de diseñar un plan de estudios.

arduino

Como todos sabemos, los niños nacidos en esta década son nativos digitales. Usan los ordenadores, tabletas y móviles con una absoluta y pasmosa facilidad. Sin duda, es una gran ayuda en su futuro y una gran ventaja sobre las anteriores generaciones quienes tienen que volver a reaprender el  mundo que les rodea. Sin embargo, estas nuevas generaciones sólo son consumidores digitales puros. No entienden como funciona la tecnología. Para ellos es natural que funcione así, no han visto la evolución de la tecnología y ni se plantean el por qué funcionan ni cómo funciona. Si queremos que nuestros niños y jóvenes construyan un futuro mejor para todos, con más riqueza compartida, tenemos que enseñarlos a dejar de ser meros consumidores y fomentar su creatividad para diseñar sus propias tecnologías.

El proyecto que quiero llevar a cabo, consiste en desarrollar un mini curso que permita programar robots con herramientas sencillas, divertidas y muy baratas, para que sean capaces mediante el juego de:

  • trabajar en equipo
  • liderar proyectos
  • pensar con lógica
  • aprender a programar
  • Dar solución a un gran problema, dividiéndolo en muchos pequeños.
  • Potenciar la creatividad

La idea por tanto sería enseñarles en un par de horas la base para jugar con los robots y luego plantear los retos que les permita desarrollar todas estas habilidades. Pero no sólo quiero enseñarles tecnología y cómo desarrollarla, que está muy bien en cuanto a espectativas para su futuro, sino que quiero que aprendan a pensar en procesos, en crear y seguir métodos, en compartir el conocimiento, a dirigir proyectos de cualquier tipo y en definitiva, a darle habilidades que generen riqueza para todo el mundo.

Así que lo primero que vamos a hacer para iniciar el proyecto es tomar contacto con la plataforma Arduino y S4A. Este último es una modificación de  Scratch que se “habla” con la placa Arduino. Más información sobre S4A en la web oficial del proyecto 

Para que podáis comprobar lo sencillo que es esta tecnología, os pongo un vídeo con mi primera toma de contacto. He invertido un par de horas entre instalar el software necesario, conectar los cables diseñar el circuito y aprender lo básico para conseguir el resultado que se puede ver en el video.

 

Ahora vamos a por el plan de estudios :-)

tuvozlegal.es mi primer proyecto público con web2py

Llevo años programando aplicaciones web con interfaces bastante complejos de tipo gestión empresarial y para gestión de sistemas, siempre en las intranet de las empresas que me han contratado. He desarrollado en PHP y frameworks como Ruby on Rails, Web2Py y Django, pero esta es la primera web que hago con Web2py y que coloco en abierto en internet. Por supuesto sí que he entregado muchas webs basados en Joomla, Drupal (casi me pego un tiro), WordPress, TikiWiki, OpenCart, Magento (casi me pego otro tiro) y también con Web2py pero privada (protegida con login/pass sólo para la empresa) pero hasta el momento nunca había escrito mi propio código Web2py para una aplicación en Internet pública. Está desarrollada además con jQuery y TwitterBootstrap; le podéis echar un vistazo en www.tuvozlegal.es. En realidad ya está publicada y en producción, pero sólo es la primera iteración del proyecto. Falta una segunda que se publicará aproximadamente en un mes y medio.

¿Y por qué he usado web2py os estaréis preguntando y no otros frameworks de desarrollo infinitamente más populares, como Django y Ruby on Rails? Principalmente por el DAL y los HELPERS de Web2py. El DAL es una capa de abstracción para la programación de bases de datos relacionales, no relacionales, basadas en documento y de diccionario y hasta el protocolo IMAP. La lista completa es esta:

    • database drivers (source)
    • SQLite sqlite3 or pysqlite2 or zxJDBC [zxjdbc] (on Jython)
    • PostgreSQL psycopg2 [psycopg2] or pg8000 [pg8000] or zxJDBC [zxjdbc] (on Jython)
    • MySQL pymysql [pymysql] or MySQLdb [mysqldb]
    • Oracle cx_Oracle [cxoracle]
    • MSSQL pyodbc [pyodbc]
    • FireBird kinterbasdb [kinterbasdb] or fdb or pyodbc
    • DB2 pyodbc [pyodbc]
    • Informix informixdb [informixdb]
    • Ingres ingresdbi [ingresdbi]
    • Cubrid cubriddb [cubridb] [cubridb]
    • Sybase Sybase [Sybase]
    • Teradata pyodbc [Teradata]
    • SAPDB sapdb [SAPDB]
    • MongoDB pymongo [pymongo]
    • IMAP imaplib [IMAP]

DJango y Ruby on Rails utilizan algo parecido denominado ORM. El ORM es un poco diferente, te abstrae del lenguaje de la base de datos pero no a nivel de mapeo de las sentencias del lenguaje, sino que trata como objetos los datos de la base de datos. Esta idea es muy buena, porque te permite generar un código muy orientado a objetos y por lo tanto muy limpio y elegante, pero tiene la desventaja que cuando hay que hacer operaciones sobre grandes volúmenes de datos, se vuelve muy ineficiente, teniendo que bajar al nivel del lenguaje de la base de datos concreta. DAL en cambio es muy eficiente porque mapea/traduce su lenguaje al propio de la base de datos en cuestión. Se podría decir que ORM es una capa que da acceso a su propio DAL y este traduce a la base de datos, como si ORM fuese otra capa encima de DAL; no es exacto pero “gráficamente” lo ilustra bastante bien.

El otro motivo son los HELPERS. No es ya por velocidad de desarrollo, la potencia, la limpieza que te permite trabajar con formularios, tags html y todo tipo de inputs, sino la integración que tienen los HELPERS con el framework en cualquier parte del código de la aplicación, desde el modelo, al controlador o la vista y por supuesto el nivel de seguridad que te aporta para la interfaz de usuario que da al saber que cumple con los problemas de seguridad listados en OWASP. En Django y Ruby on Rails he probado muchos tipos de herramientas para la vista, erb, haml, etc, pero no he encontrado la agilidad y potencia que con los HELPERS de web2py

Y por último hay algo que hace a Web2py imbatible: la retrocompatibilidad hacia atrás

la primera aplicación que escribí con web2py (nada serio) fue en 2008. Ese mismo código lo puedes coger y calzar en la última versión de web2py y funciona 100%. En Rails por ejemplo esto es ciencia ficción. En definitiva, este framework es muy ligero, de rápido desarrollo, muy potente y altamente escalable. Evidentemente los otros frameworks también aportan ventajas superiores a web2py, por lo pronto sus comunidades son infinitamente más amplias. En cualquier caso es imposible saber cual es le mejor framework y como en todas las disputas informáticas de cual es la mejor tecnologia, nunca hay una respuesta clara, así que podríamos decir que en ocasiones es subjetivo y en ocasiones es según el tipo de proyecto y con el equipo de gente y tecnologías que tengas que integrar el proyecto. En este momento y en este contexto el que más me encaja y con el que más cómo me siento es con web2py :-)

Y ahora en secreto, todo este rollo me lo he marcado para que google indexe un poco mejor a www.tuvozlegal.es ;-P

Gestión Experta CRM en GitHub

Ayer por la noche generé mi primer proyecto en gitHub:

https://github.com/FreeMEM/gestionexpertacrm

Este proyecto pretender matar dos pájaros de un tiro:

    • Que un amigo se ponga las pilas con la programación, la programación web con el framework web2py, python y la ingeniería de software.
    • Tener un CRM para mi empresa en http://www.gestionexperta.com. Los objetivos de la aplicación serán:
      • Controlar los contratos de servicios de los clientes. Fecha de inicio y fin.
      • Una herramienta de helpdesk mediante tickets
      • Herramienta para hacer presupuestos
      • Herramienta para facturar
      • Herramienta para hacer newsletter masivos a suscritos

La licencia libre que tendrá todavía no la he decidido, aunque por ahora tiene una GPL V.3.

¿Y por qué no uso CRMs de proyectos ya creados? ahorraría costos. Bueno, eso es lo primero que piensas, sin embargo en mi entorno empresarial esto no ocurre así.
Instalar, configurar y entender cómo funciona un CRM, no es algo rápido. Tengo que adaptarme a sus excesos y limitaciones y por lo tanto, tengo que adaptar mi empresa tal como los desarrolladores del CRM en cuestión han imaginado. Luego vienen los problemas de integración con otras herramientas, como pueden ser herramientas de helpdesk, emailings, marketing, facturación, contabilidad, etc. Mi entorno empresarial gira alrededor de tecnologías escritas en python con el framework web2py. Este entorno de programación incluye un poderoso y versátil sistema de gestión de usarios que me permite integrar todos los desarrollos que voy haciendo en un único gran paradigma. Es decir, que puedo compartir datos e información con una facilidad pasmosa entre aplicaciones. Pero lo mejor es su sistema de formularios. Para herramientas internas, que no necesiten un acabado visual exquisito, me permite crear aplicaciones de gestión a muy alta velocidad. Es casi como programar en Clipper en cuanto términos de productividad. En una mañana puedo terminarme el módulo de helpdesk y en otra el de los contratos. En una semana puedo tener terminados los objetivos marcados.

Ahora necesito encontrar un hueco para implementarlo. El código que hay ahora mismo (que no hace casi nada) lo escribí en 20 minutos mientras le explicaba, para poner en raíles al  amigo  que está enganchándose a la programación. Digamos que lo creamos sólo para que pudiese aprender con un “proyecto” real. Después de eso, pensé que quizá había sentado las bases para crear mi primera aplicación de software libre. Vamos a ver qué tal evoluciona.

Condiciones de una sola línea en ruby y en python

Para hacer condiciones de una sóla línea, se pueden usar en ruby y python estructuras de este tipo

Ruby:

resultado = condicion ? si_verdadero : si_falso

Python:

resultado = (si_falso,si_verdadero)[condicion]

De este modo podríamos sustituir todas estas líneas

if True:
n=0
else:
n=1

Contructores múltiples en Python y PHP

python y php

Mae mía, ni en python 2.6.x ni en php 5.x se pueden escribir clases con contructores multiples, como se hace con toda normalidad en C# por ejemplo. Hace tiempo pensé un par de trucos parecidos para cuando estoy con lenguajes con esta particularidad y que me gustaría compartir, pero vamos que hay mil formas de hacerlo.

Python:

class Clase():
_id=None</code>

def __init__(self,*args):
if len(args) != 1:
if isinstance(args[0], str):
self.__constructor_uno (int(args[0]))
else:
self.__constructor_dos()

def __constructor_uno(self, id):
self._id=id

def __constructor_dos(self):
self._id=0

PHP:

class Clase {</code>

private $id;

function __construct() {
$args = func_get_args();
$nargs = func_num_args();
switch($nargs) {
case 1:
self::__constructor_uno($args[0]);
break;
case 2:
self::__constructor_dos();
break;
}
}

function __constructor_uno($get) {
$id=$get;
}

function __constructor_dos() {
$id=0;
}
}

web2py’s examples: helpers, validators y expresiones regulares

No me voy a explicar demasiado. Sólo un ejemplo de vista de formulario con web2py en el que interviene un input html, que limito con expresión regular palabras de entre  3 y 15 letras alfanuméricos, incluyendo “ñ”s, tildes y algo más, con una longitud máxima de 128 caracteres y 10 palabras. Incluye además un mensaje de error traducible. Ese mensaje de error luego se puede capturar con jquery y mostrarse cómodamente en un bonito efecto. Todo en una única línea, mu cómodo oiga.

1
INPUT (_value='', _name='tags', _id='tags', requires=(IS_NOT_EMPTY(error_message = T('Tags are required')), IS_MATCH('^([\wáéíóúÁÉÍÓÚñÑçÇàèìòùÀÈÌÒÙâêôûÂÊÎÔÛ]{3,15}\ ?){1,10}, error_message=T('only allowed words of third to fifteen characters')), IS_LENGTH(128)))

Python’s examples: quitar palabras repetidas de una cadena

Si algo me gustaba de php era lo sencillo que resultaba tirar código a toda velocidad y sin pensar. Desde el verano pasado me he aficionado a python por lo mismo y  sobre todo por la facilidades que tiene para trabajar con él en cualquier entorno operativo, ya sea de escritorio, consola o web. Muestra de ello, os dejo un ejemplo de cómo en una sola línea se pueden quitar las palabras repetidas de una cadena de texto:



1
2
3
4
>>> import string
>>> cadena=”hola esto es una lista lista de de cadenas hola repetidas”
>>> print string.join(set(string.split(cadena,’ ‘)),’ ‘)
esto repetidas de una hola cadenas lista es

Logo, mucho más de lo que parece

Evidentemente, el conocimiento estándar que se le aporta a nuestros hijos en la escuela pública es más que suficiente, pero es inevitable pensar en complementarlo con algún extra que le aporte alguna ventaja en su futura autosufiencia. Hay quien refuerza este aprendizaje con clases de apoyo escolar, de inglés, informática, música o  deportes. Todas estas disciplinas aportan sus propios patrones cognitivos que configuran su personalidad adulta, aunque nada como los tres primeros años de vida. Hace poco, he ido a fijarme en una que quisiera investigar con más detenimiento y aunque es demasiado  pronto para decidir, el tiempo vuela.

Hará un par de años un familiar  me habló de Kumon,  una empresa que “vende” un  método de aprendizaje que así se describe en su web:

“Kumon es una actividad extraescolar diseñada para desarrollar al máximo el potencial de cada niño a través de las matemáticas. Gracias a nuestro programa individualizado nuestros alumnos desarrollan confianza, concentración, responsabilidad y hábito de estudio que los acompañan durante toda la vida.”

Del mensaje me caló que las habilidades adquiridas le acompañarían toda la vida y ese es al fin y al cabo el objetivo, habilidades que le permitan desarrollarse con soltura. Aunque una disciplina matemática es dura, los críos motivados son esponjas, pero no estoy seguro que sea esto lo que busco para Eva. De rebote, he encontrado una alternativa parecida que me convence algo más,  aunque tampoco creo que sea la panacea. Se llama Logo, un lenguaje de programación derivado de LISP (un lenguaje de programación para inteligencia artificial) usado para aprender mediante el juego y la experimentación y que busca ofrecerles las ventajas de ser capaces de desarrollar estrategias basadas en pequeñas metas y objetivos que en su conjunto,  sirvan para resolver problemas complicados  de la vida y les permita desarrollarse con seguridad en cualquier tipo de disciplina, ya sea artística, científica, humanística o empresarial.

Había oído hablar de este lenguaje cuando era niño, pero nunca tuve la oportunidad de usarlo; los ordenadores no estaban al alcance de los mortales y cuando tuve ordenador, no conseguí hacerme con este programa (internet no existía), aunque si he de ser sincero, no estaba demasiado interesado por lo que creía ser un método de iniciación a la programación  para niños y yo, por aquellos entonces, me creía mayor aprendiendo Basic, QuickBasic y TurboPascal. El panorama ha cambiado mucho desde aquel entonces en el que el hecho de tener un ordenador ya era de por sí friki.  No estoy seguro, pero cuando mi hija llegue a secundaria, probablemente deba usar ya ordenadores en clase así que su normalización habrá que aprovechar. Esto no quita, que  otras actividades de habilidad social, deban tener un gran papel en su etapa de formación, de hecho, en ello irá su felicidad.

Lo único malo es que no tengo un plan de ejercicios… un plan de seguimiento o un objetivo concreto,  como ocurre con kumon, aunque lo mismo existen planes, es cuestión de investigar. Por lo pronto, aquí dejo un enlace que parece interesante al respecto. Os iré comentando.

git para usuarios de svn

En el trabajo hemos tenido algunos problemas con el sistema control  de versiones que usamos, svn, en cuanto al mantenimiento de las distintas branch. Un compañero (Karl) ha comentado que usar git, podría ayudarnos  con el mantenimiento de las branches, trunk y los merges entre ellos. En git, cada commit genera en una base de datos un identificador único en forma de hash. Esto ayudaría en cualquier momento a conocer en que branches está disponible un commit concreto y administrar correctamente el código por las distintas ramas del árbol.

Se da la circunstancia que estoy desarrollando un proyecto personal con un amigo, por el gusto de aprender bien python y jquery (y las malas artes del 2.0 famoso). y ya nos hemos visto en la necesidad de disponer de un sistema control de versiones, así que, con el objeto de  probar y conocer mejor git, ambos hemos decidido instalarlo: bah!, pasando de svn.

La primera impresión ha sido bastante buena. La gestión de las branch parece “mágica” (sí he escrito mágica y no magia; algún día explicaré qué es eso de mágica). Sin moverte del mismo path del sistema de archivos, puedes cambiar de branch (git checkout  [branch_name]) y mágicamente si haces un ls, descubres que la estructura de ficheros se ha modificado a la de la branch elegida.

En fin, menos introducciones y más al tajo.

Lo primero es crear el repositorio. En git los repositorios no tienen por qué estar centralizados en un servidor, es más un “cliente” puede actuar de servidor para sí mismo o para otros. Cuando termine la explicación de cómo se usa, os daréis cuenta de esto. En cualquier caso, voy  a seguir el modelo de cliente-servidor, tal como funciona en svn para que quede más claro.

Comencemos. En el servidor (host.dominio.com) crear un usuario devel (por ejemplo):

adduser devel

Loguearse con ese usuario y hacer

mkdir -p git/nombre_proyecto.git
cd git/nombre_proyecto.git
git init --bare

ya está creado el repositorio sin código de nuestro proyecto. Para subir el código, lo vamos hacer desde nuestro sistema cliente (nuestro estación de trabajo). Para ello vamos a usar de capa de transporte, ssh, de tal modo que pase cifrado. Aconsejo subir tu clave pública al servidor para no tener que estar escribiendo user y pass todo el tiempo. Nos vamos al directorio donde tangamos ya nuestro código y le pasamos los siguientes comandos:

cd proyecto
git init
git remote add origin ssh://devel@host.dominio.com/home/devel/git/nombre_proyecto.git
git add .
git commit -m "Apertura del repositorio"

Este commit, no escribe en el servidor, sino que lo hace en local generando su correspondiente entrada hash (el identificador único que identifica la operación) en la bbdd de git.

git push origin master

finalmente, con push, lo empujamos al servidor

Si por lo que sea, queremos obtener una copia del repositorio en otro ordenador o path, podemos optar por traerlo clonado desde el servidor. Esto es algo parecido a un checkout, sólo que se trae toda la base de datos de todo lo sucedido en el repositorio. Es decir, que en un momento dado este clon, podría convertirse en el repositorio raiz.

Clonar un repositorio ya creado:

mkdir proyecto
cd proyecto
git clone ssh://devel@host.dominio.zona/home/devel/git/nombre_proyecto.git

Para crear una branch del proyecto es pasmosamente fácil:

git branch branch_proyecto

Donde branch_proyecto es el nombre de la branch del repositorio

Para ver la branch en la que estás:

git status

Para añadir ficheros al proyecto (svn add, svn commit). Lo primero es asegurarse que la branch en la principal :

git checkout master

y ahora sí a añadir:

git add README
git commit

Y finalmente hay que hacer un push, si quieres que llegue el cambio al repositorio del servidor. De esta forma, otros usuario podrán usar tus cambios:

git push

Para tener actualizado tu  repositorio local con el remoto:

git pull --rebase

Equivale a svn update y el –rebase es para revisar si otro usuario ha hecho antes un push

Más o menos con esto te puedes hacer una idea y manejarte con git. Más información en la página del proyecto oficial.

En cuanto a gestores de tickets para git, se puede usar el clásico Trac con el plugin correspondiente, aunque en realidad me gustaría probar http://www.redmine.org/ un trac para git. Intentaré hablaros pronto de redmine

El hallazgo: itextdotnet

Estaba practicando algunos ejemplos del uso de itextsharp en C# para poder generar informes en pdf, cuando me he topado con una nueva librería que proviene también de la original escrita en java, itext. Esta nueva, que parece no ser demasiado conocida, al menos en las listas de mono-hispano, se llama itext .Net o itextdotnet para los amigos. En esta dirección se encuentra una magnífica documentación del proyecto, al menos en lo que a ejemplos se refiere. Utiliza los mismos ejemplos del proyecto original itext en java, pero escritos en C#, una copia de los mismos en J# de la plataforma .NET o IKVM si se usa Mono (mi caso) y por último en VB.Net (y que supongo que funcionará también en Mono). Lo bueno de esta librería es que puedes utilizar Mono o .Net para escribir el código en Java, C# o VB.net, algo que hará las delicias de muchos. Yo con que esté en C# me conformo.

¿Y por qué tanto jaleo con una librería para generar pdfs?. Los programadores de Mono que queremos hacer aplicaciones multiplataforma tenemos algunas dificultades extras que nos obligan a complicarnos un poco más, unas veces por carencias de software como Crystal Report y otras por minimizar las dependencias de sistemas operativos concretos. Para la generación de informes a partir de XML y que además se puedan imprimir independientemente del gestor de impresoras del sistema operativo concreto en el que corra la aplicación, ayuda bastante la generación de documentos pdf en vez de enviarlos directamente a la impresora. Los documentos pdf, son un formato muy extendido y que cualquier S.O. actual soporta. A modo de introducción de como se pueden leer XML y convertirlos a pdf, aquí enlazo un ejemplo que hace un tiempo comentamos en mono-hispano.

Esta web utiliza cookies puedes ver aquí la política de cookies. Si continuas navegando estás aceptándola