Trabajo:Cómo colaborar con el ayuntamiento
El Ayuntamiento de Madrid está desarrollado dos nuevas aplicaciones de participación y transparencia fomentando el desarrollo colaborativo y abierto. Estas aplicaciones están hechas enteramente en software libre para que luego puedan ser usadas en cualquier parte del mundo. Las aplicaciones están desarrolladas completamente en Ruby on Rails.
El Ayuntamiento va a organizar el evento #CodingMadrid el 2º jueves de cada mes de 12:00 a 15:00 (aunque se pueden sugerir otros horarios), en el Medialab-Prado, con todos aquellos que quieran unirse a trabajar en las nuevas aplicaciones de participación y transparencia: http://diario.madrid.es/blog/2015/11/16/desarrollo-colaborativo-y-abierto-en-codingmadrid/
Contenido
Trabajo realizado por
- Ana María Martínez Gómez (Doble Grado Ingeniería Informática - Matemáticas 5º)
- Jakub Holubanský (Grado en Ingeniería Informática 4ºA)
¿Cómo puedo colaborar con el ayuntamiento?
Donde más ayuda se necesita es en el desarrollo.
Para quienes no se animen a programar, se puede colaborar de de otras formas:
- Pensando mejoras y cómo implementarlas, y proponerlas sin programarlas.
- Se puede colaborar con análisis de datos. Ya hay un grupo que está realizando análisis de datos de cómo participa la gente en el Portal de Participación. Por ej, la vida media de una propuesta, el uso que tiene, lo que atrae cada propuesta por tipo... hacen scrapping y analytics. Ese grupo se reune regularmente en el Medialab, y está abierto a cualquiera que quiera unirse y colaborar.
- Se puede ayudar a repensar los algoritmos de ordenación de las propuestas. Es decir, al usuario se le muestra una lista de propuestas en portada. ¿Cuáles deberían subir/bajar y en qué casos? Ahora mismo se usa uno como el de Reddit pero simplificado. Hay muchos posibles, y un análisis de los que hay para elegir otro mejor sería algo muy útil.
Participar en el desarrollo
¿Qué necesito saber para poder participar en el desarrollo?
El ayuntamiento de Madrid utiliza Ruby on Rails en todo su software, por tanto si no sabes Ruby on Rails lo primero que debes hacer es aprender. Para ellos puedes utilizar este artículo: Trabajo: Cómo aprender Ruby on Rails
También necesitaras tener un cuenta en Github. Puedes crearla aquí si no la tienes ya: https://github.com/join
Deberás además saber usar Github y Git. Para ellos puedes utilizar la siguiente guía: https://git-scm.com/doc
Manos a la obra
El portal de participación se encuentra en: https://github.com/consul/consul
El portal de transparencia de encuentra en: https://github.com/AyuntamientoMadrid/transparencia
Requisitos previos
Para colaborar en ambos proyectos lo primero que debes hacer es instalar git, Ruby 2.2.3, la gema bundler y PostgreSQL (9.4 o superior). Además para el de participación también necesitarás ghostscript.
Git
Si estás en linux para instalar git basta con:
sudo apt-get install git
Ruby 2.2.3
Si estás usando Ubuntu o debian NO utilices
sudo apt-get install ruby-full
Esto intalará la versión 1.9.3 que no es válida para este proyecto.
Puedes descargar la versión 2.2.3 en formato .gz aquí:
https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz
Luego ejecuta desde la consola lo siguiente:
sudo apt-get update
sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison nodejs subversion
Desde la carpeta donde esté la descarga haz:
tar xvfz ruby-2.2.3.tar.gz
cd ruby-2.2.3
./configure
make
sudo make install
sudo gem update --system
En algunos sistemas operativos hay formas más sencillas:
CentOS, Fedora, or RHEL: sudo yum install ruby
OS X: brew install ruby
Windows: Usando el siguiente instalador http://rubyinstaller.org/
Puedes encontrar más información sobre como instalar Ruby aquí: https://www.ruby-lang.org/en/documentation/installation/
Gema bundler
Si estás en linux basta con:
gem install bundler
Si necesitas más información: http://bundler.io/
ghostscript
En Debian basta con
sudo apt-get install ghostscript
PostgreSQL (9.4 o superior)
Esto es lo más dificil de instalar y configurar.
En Debian tienes la siguiente guía detallada: https://wiki.debian.org/es/PostgreSql
Para evitar problemas es recomendable instalar también: apt-get install postgresql-9.4-postgis-scripts
Descargar y configurar proyecto
Descarga el proyecto de Github y sigue las instrucciones. Lo más adecuado es bajarlo usando el comando git. Para esto, visita el enlace del repositorio y copia el enlace del .git (aparece entre los botones, junto al botón HTTPS). Tras esto, ejecuta (cambiando el enlace en caso de que uses un repositorio distinto):
git clone https://github.com/consul/consul.git
Si al hacer bundler install te da problemas la gema pg en Ubuntu o Debian prueba lo siguiente:
sudo apt-get install libpq-dev
gem install pg
Debes crear un usuario en PostgreSQL (por ejemplo consul) con una contraseña (por ejemplo 000) y modificar el fichero config/database.yml antes de hacer bin/rake db:setup. Lo que debes modificar en el fichero es lo siguiente:
username: consul password: '000'
No olvides darle permisos al usuario, sino seguramente bin/rake db:setup te dará errores. La siguiente documentación puede serte de utilidad: http://www.postgresql.org/docs/8.2/static/sql-alterrole.html
Si obtienes un error similar a este:
ActiveRecord::StatementInvalid: PG::UndefinedFile: ERROR: could not open extension control file "/usr/share/postgresql/9.4/extension/unaccent.control": No such file or directory
Lo más probable es que tengas un error con tu instalación de postgis. Prueba con:
apt-get install postgresql-9.4-postgis-scripts
Issues
GitHub utiliza un sistema de tickets para manejar los avisos de bugs y peticiones de nuevas funcionalidades, llamados aquí issues. Un usuario comienza abriendo un issue informando del problema o proponiendo cambios, y otros usuarios pueden comentar el issue para discutir cambios o informar de que han decidido trabajar en él. En issues complejos (principalmente funcionalidades nuevas), se sigue el siguiente proceso:
- Se abre el issue sugiriendo los nuevos cambios.
- Los usuarios comentan el cambio, incluyendo a veces bocetos.
- Uno o más usuarios se encargan de hacer el informe de los cambios. Publican el informe.
- Uno o más usuarios se encargan de llevar a cabo la implementación.
- El código se publica en una Pull Request (una solicitud para incluir el nuevo código en el repositorio principal).
- Se acepta la Pull Request y se cierra el issue.
En caso de issues menores como bugs, es posible pasar directamente a la parte de implementación. En la lista de issues, habitualmente veremos etiquetas que avisan del estado del issue y de si se encuentra asignado a algún colaborador. En el caso de querer ayudar con alguna implementación, lo ideal es buscar aquellos issues que no estén asignados y se encuentren marcados como PRs-welcome, puesto que esta etiqueta indica que está esperando a que algún programador aporte el código para solucionar el issue. Aquellos issues marcados como Not-ready no tienen los nuevos cambios todavía definidos del todo, por lo que es mejor no comenzar a implementarlos aún.
Es posible también colaborar sin contribuir código, abriendo nuevos issues en los que se informe de un bug o se proponga una nueva funcionalidad. Es de mucha ayuda ser descriptivos en estos casos, incluyendo información sobre el sistema operativo y navegador en caso de informar de un bug, por ejemplo.
Proceso para llevar a cabo una Pull Request
En caso de querer aportar el código para un issue, el primer paso (normalmente) es pedir que te asignen el issue. Tras esto, toca hacer un fork del repositorio, creando así un repositorio en nuestra cuenta en el que iremos poco a poco añadiendo el código necesario hasta haber terminado. Para esto, seguimos los siguientes pasos:
- Abrimos la página de GitHub principal del repositorio.
- Hacemos click en el botón de Fork y tendremos ahora un nuevo repositorio en nuestro perfil personal.
- Cogemos el enlace .git del nuevo repositorio (suele salir al lado de un botón que pone HTTPS) y hacemos clone del repositorio en nuestro ordenador:
- git clone <https://-----.git>
- Configuramos los archivos database.yml y secret.yml usando las instrucciones que hemos visto anteriormente.
- (Bucle) Realizamos cambios en el código en nuestro ordenador. Para subirlos a nuestro repositorio, los agrupamos en un nuevo commit en git y luego lo subimos mediante push:
- git commit -m <descripción sobre los nuevos cambios
- git push (pide usuario y contraseña de GitHub)
- Repetimos el bucle hasta tener el código listo. Antes de realizar el Pull Request, nos aseguramos de que cumpla los tests Spec:
- bin/rspec (en Windows podemos usar bundle rspec, aunque es más aconsejable no usar Windows para esto)
Ahora que ya tenemos el código listo, toca pedir que sea añadido al repositorio principal. Para ello, creamos un Pull Request:
- Nos dirigimos al repositorio principal y elegimos New Pull Request
- Pulsamos "compare across forks", pues queremos añadir el código de nuestro fork.
- En base fork dejamos el repositorio original. En head fork, elegimos el repositorio de nuestro usuario (por ejemplo, <usuario/consul> y master, aunque podemos usar otros nombres).
- Añadimos un título y una descripción al Pull Request (informando además de qué issue estamos resolviendo), y hacemos click en Create Pull Request
Con esto, nuestro Pull Request aparecerá en el repositorio principal, y en él la lista de cambios al código que queremos realizar. Al principio, se ejecutarán automáticamente tests sobre nuestro código para comprobar que cumple los requisitos (no deberíamos tener problemas si hemos ejecutado rspec antes y nos salía todo correcto). Por supuesto, el código no será incluido hasta que uno de los administradores del repositorio decida hacer un merge (unir el código). Mientras el pull request siga disponible, podemos añadirle más código subiendo nuevos commits al repositorio.
Nota: a la hora de escribir nuevo código, intenta seguir las buenas prácticas de Ruby que aparecen en este enlace: https://github.com/styleguide/ruby