├── .gitmodules ├── README.md ├── charla_1 ├── GLabs_1.pdf ├── README.md ├── codigos │ ├── LICENSE │ ├── modulo.py │ ├── object_stack.py │ ├── pila.py │ └── vigenere.py ├── img │ ├── bitbucket.png │ ├── centralizado.png │ ├── compilacion.png │ ├── descentralizado.png │ ├── flujo-git.png │ ├── github.jpg │ ├── gitlab.png │ ├── interpretacion.png │ ├── local.png │ ├── logo-git.png │ ├── logo-labs.png │ ├── mercurial.png │ ├── python-logo.png │ └── svn.png └── presentacion │ ├── GLabs_1.tex │ ├── cvs.tex │ ├── github.tex │ └── python.tex ├── charla_10 ├── PluginGpul │ ├── Makefile │ ├── README.html │ ├── README.txt │ ├── __init__.py │ ├── __init__.pyc │ ├── help │ │ ├── Makefile │ │ ├── make.bat │ │ └── source │ │ │ ├── conf.py │ │ │ └── index.rst │ ├── i18n │ │ └── af.ts │ ├── icon.png │ ├── metadata.txt │ ├── pb_tool.cfg │ ├── plugin_gpul.py │ ├── plugin_gpul.pyc │ ├── plugin_gpul_dialog.py │ ├── plugin_gpul_dialog.pyc │ ├── plugin_gpul_dialog_base.ui │ ├── plugin_upload.py │ ├── pylintrc │ ├── resources.py │ ├── resources.pyc │ ├── resources.qrc │ ├── scripts │ │ ├── compile-strings.sh │ │ ├── run-env-linux.sh │ │ └── update-strings.sh │ └── test │ │ ├── __init__.py │ │ ├── qgis_interface.py │ │ ├── tenbytenraster.asc │ │ ├── tenbytenraster.asc.aux.xml │ │ ├── tenbytenraster.keywords │ │ ├── tenbytenraster.lic │ │ ├── tenbytenraster.prj │ │ ├── tenbytenraster.qml │ │ ├── test_init.py │ │ ├── test_plugin_gpul_dialog.py │ │ ├── test_qgis_environment.py │ │ ├── test_resources.py │ │ ├── test_translations.py │ │ └── utilities.py └── PyQGIS-GPULLab-Coruña-20160413.pdf ├── charla_11 ├── LICENSE ├── README.md ├── css │ ├── print │ │ ├── paper.css │ │ └── pdf.css │ ├── reveal.css │ ├── reveal.scss │ └── theme │ │ ├── README.md │ │ ├── beige.css │ │ ├── black.css │ │ ├── blood.css │ │ ├── league.css │ │ ├── moon.css │ │ ├── night.css │ │ ├── serif.css │ │ ├── simple.css │ │ ├── sky.css │ │ ├── solarized.css │ │ ├── source │ │ ├── beige.scss │ │ ├── black.scss │ │ ├── blood.scss │ │ ├── league.scss │ │ ├── moon.scss │ │ ├── night.scss │ │ ├── serif.scss │ │ ├── simple.scss │ │ ├── sky.scss │ │ ├── solarized.scss │ │ └── white.scss │ │ ├── template │ │ ├── mixins.scss │ │ ├── settings.scss │ │ └── theme.scss │ │ └── white.css ├── index.html ├── js │ └── reveal.js ├── lib │ ├── css │ │ └── zenburn.css │ ├── font │ │ ├── league-gothic │ │ │ ├── LICENSE │ │ │ ├── league-gothic.css │ │ │ ├── league-gothic.eot │ │ │ ├── league-gothic.ttf │ │ │ └── league-gothic.woff │ │ └── source-sans-pro │ │ │ ├── LICENSE │ │ │ ├── source-sans-pro-italic.eot │ │ │ ├── source-sans-pro-italic.ttf │ │ │ ├── source-sans-pro-italic.woff │ │ │ ├── source-sans-pro-regular.eot │ │ │ ├── source-sans-pro-regular.ttf │ │ │ ├── source-sans-pro-regular.woff │ │ │ ├── source-sans-pro-semibold.eot │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ ├── source-sans-pro-semibold.woff │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ └── source-sans-pro.css │ └── js │ │ ├── classList.js │ │ ├── head.min.js │ │ └── html5shiv.js ├── pdf │ ├── containerizacion_con_docker.pdf │ └── docker_intro.pdf └── plugin │ ├── highlight │ └── highlight.js │ ├── markdown │ ├── example.html │ ├── example.md │ ├── markdown.js │ └── marked.js │ ├── math │ └── math.js │ ├── multiplex │ ├── client.js │ ├── index.js │ ├── master.js │ └── package.json │ ├── notes-server │ ├── client.js │ ├── index.js │ └── notes.html │ ├── notes │ ├── notes.html │ └── notes.js │ ├── print-pdf │ └── print-pdf.js │ ├── search │ └── search.js │ └── zoom-js │ └── zoom.js ├── charla_2 ├── Presentation.odp ├── Presentation.pdf ├── README.md ├── code │ ├── button.py │ ├── hall.py │ ├── led.py │ └── pir.py ├── images │ ├── Raspberry_Pi_Logo.svg.png │ ├── hall.svg │ ├── led.svg │ ├── pi.svg │ ├── pi2.jpeg │ ├── pir.svg │ └── tact_switch.svg └── summary.md ├── charla_3 ├── GLabs_3.pdf ├── README.md ├── img │ ├── David_al_microfono.jpg │ ├── Graham.jpg │ ├── automation.png │ ├── commit_push_run.jpg │ ├── conway.png │ ├── dubidas.jpg │ ├── ego.jpg │ ├── ephemeral.jpg │ ├── flujo-git.png │ ├── git_not_hard.png │ ├── happy_monkey.jpg │ ├── ingrediente_secreto.jpg │ ├── little_bugs.jpg │ ├── logo-git.png │ ├── logo-labs.png │ ├── mars_climate_orbiter.jpg │ ├── metrics.jpeg │ ├── not_a_meeting.png │ ├── old_code_review.png │ ├── optimism.png │ ├── petrov.jpg │ ├── pull_request.jpg │ ├── pyramid_vs_lego.jpg │ ├── review_checklist.png │ ├── sad_developer.jpg │ ├── tabs_vs_spaces.png │ ├── tags.png │ ├── tired.jpg │ ├── triviality.png │ ├── vgaltes.png │ ├── your_domain.png │ └── zen_developer.jpg └── presentacion │ ├── GLabs_3.tex │ ├── advanced_git.tex │ └── code_reviews.tex ├── charla_4 ├── README.md ├── presentacion.htm └── presentacion_files │ ├── 1896_Olympic_marathon.jpg │ ├── 2000px-Laurasia-Gondwana.svg.png │ ├── 6860096164_42ee93598a_b.jpg │ ├── 7623398360_4263b7bbf9_b.jpg │ ├── Dialog_face_to_face.JPG │ ├── Galuel_RMS_-_free_as_free_speech,_not_as_free_beer.png │ ├── IMG_1616.JPG │ ├── Kanban_board_example.jpg │ ├── Oriente_Station_Lisboa_roof.jpg │ ├── PUBhwXP.jpg │ ├── PostItNotePad.JPG │ ├── RC_Race_Car_SST2000.jpg │ ├── Scrum_Framework.png │ ├── The_triad_constraints.jpg │ ├── X7BrdNg.png │ ├── YyOJJaA.jpg │ ├── analytics.js │ ├── backgroundClasses.css │ ├── bespoke-plugins.js │ ├── bespoke.js │ ├── daily-paper-464015_960_720.jpg │ ├── default-reset.css │ ├── default.css │ ├── demo.css │ ├── loadPresentation.js │ ├── main.css │ ├── onready.js │ ├── rWYCRwm.jpg │ ├── surfaceClasses.css │ ├── themes.css │ └── web-fonts.css ├── charla_5 ├── Django con Raspberries.pdf ├── README.md ├── core │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── static │ │ └── core │ │ │ ├── css │ │ │ └── style.css │ │ │ └── js │ │ │ └── smoothie.js │ ├── templates │ │ └── core │ │ │ ├── index.html │ │ │ ├── raspberry-data-stored.html │ │ │ ├── raspberry-detail.html │ │ │ ├── raspberry-led-color.html │ │ │ └── raspberry-list.html │ ├── tests.py │ ├── urls.py │ └── views.py ├── djangoGpul │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── manage.py └── raspberry │ └── gpul │ ├── rgb │ ├── colorlib.py │ ├── colors.py │ └── fserver.py │ └── temperature │ ├── dht11.py │ ├── dht11_example.py │ └── temperature.py ├── charla_6 ├── README.md ├── public │ └── doc │ │ ├── img │ │ ├── hateoas-1.png │ │ ├── hateoas-2.png │ │ ├── json.png │ │ ├── patch.png │ │ ├── post-put.png │ │ ├── simplified-api.png │ │ └── standard-api.png │ │ ├── restful-apis-public.pdf │ │ └── server.sh └── restful-apis.tar.gz ├── docs ├── Dossier-patrocinio.pdf ├── codigodeconducta.md └── inventario_cacharrada.ods ├── hackathon_1 ├── Arduino para programadores (Hackathon IOT 2016).pdf └── Sensores_pi.odp └── img ├── carteles ├── cartel-amarillo.svg └── cartel-blanco.svg ├── logo-labs.png ├── logo-labs.svg └── partners ├── agilegalicia.jpg ├── boundless.png ├── gpul.png ├── icarto.jpg ├── prefapp.png ├── setpay.png └── trabe.png /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/.gitmodules -------------------------------------------------------------------------------- /charla_1/GLabs_1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/GLabs_1.pdf -------------------------------------------------------------------------------- /charla_1/README.md: -------------------------------------------------------------------------------- 1 | # Charla 1: Introducción a Python, Git e GitHub 2 | 3 | ## Guión 4 | 5 | Nesta charla farase unha introducción á linguaxe de programación Python e o 6 | funcionamento de Git, usando GitHub como plataforma de programación colectiva. 7 | A charla tratará os seguintes puntos: 8 | 9 | ### Python 10 | - Breve historia e factores que propiciaron a aparición de Python. 11 | - Uso do intérprete de comandos 12 | - Tipos de datos básicos 13 | - Estructuras de datos:listas e diccionarios 14 | - Estructuras de control 15 | - Scripting: guías de estilo. 16 | - Uso de modulos 17 | 18 | ### Git 19 | - Qué é un CVS e que utilidade ten 20 | - Caso práctico de un CVS: Git 21 | - Estructura de workspaces,stages e funcionamento de git 22 | - Seguimento de ficheiros: add e rm 23 | - Gardar cambos: commit 24 | - Log e navegación entre commits: log e revert 25 | 26 | ### Github 27 | - Funcionamento de github: contas e repositorios 28 | - Repositorios remotos: engadir repositorios remotos 29 | - Clonar repositorios: clone 30 | - Repositorio remoto persoal: pull, push e fetch 31 | 32 | ## Documentación 33 | 34 | A documentación dispoñible para o seguimento da charla é o seguinte: 35 | - Enlace para a máquina virtual de Ubuntu: https://mega.nz/#!9sRzRaxT!cmT0wEdK0JE8kM2EvdKIDjEFvDBLUa5fZHiyOrVlLD0 36 | - **Transparencias**: Diapositivas empregadas durante a charla para un mellor 37 | seguimento da mesma. 38 | - Códigos de exemplo:(aínda sen definir) 39 | - Implementación de unha pila con listas en paradigma imperativo. 40 | - Implementación de unha pila facendo uso de orientación a obxectos 41 | - Módulo de implementación de diferentes métodos de ordenación. 42 | - Implementación do algoritmo de cifrado de Vigenère. 43 | -------------------------------------------------------------------------------- /charla_1/codigos/modulo.py: -------------------------------------------------------------------------------- 1 | 2 | from random import randint 3 | 4 | 5 | def generate_random_list(a, b): 6 | """Xenera unha lista de 'a' enteiros entre 0 e 'b' """ 7 | l = [] 8 | for ent in range(0, a): 9 | l.append(randint(0, b)) 10 | return l 11 | 12 | 13 | def verify_sort(l): 14 | """Verifica si unha lista está ordenada """ 15 | for i in range(0, len(l)-1): 16 | if l[i] > l[i+1]: 17 | return False 18 | return True 19 | 20 | 21 | def insert_sort(l): 22 | """Ordenación por inserción """ 23 | s = [] 24 | for e in l: 25 | t = 0 26 | while(t <= len(s)): 27 | if (t == len(s)): 28 | s.append(e) 29 | break 30 | elif(e < s[t]): 31 | s.insert(t, e) 32 | break 33 | else: 34 | t += 1 35 | return s 36 | 37 | 38 | def selection_sort(l): 39 | """Ordenación por selección """ 40 | s = [] 41 | while(l): 42 | minimo = l[0] 43 | for d in l: 44 | if d < minimo: 45 | minimo = d 46 | s.append(minimo) 47 | l.remove(minimo) 48 | return s 49 | 50 | 51 | def shell_sort(l): 52 | raise NotImplementedError 53 | 54 | 55 | def quicksort(l): 56 | raise NotImplementedError 57 | -------------------------------------------------------------------------------- /charla_1/codigos/object_stack.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Implementación de unha pila facendo uso de programacion orientada a 4 | # obxectos. 5 | 6 | 7 | class Stack: 8 | """Implementacion de unha pila facendo uso de obxectos """ 9 | 10 | def __init__(self): 11 | self.items = [] 12 | 13 | def vacia(self): 14 | return self.items == [] 15 | 16 | def apilar(self, item): 17 | self.items.append(item) 18 | 19 | def cima(self): 20 | if self.vacia(): 21 | return [] 22 | return self.items[-1] 23 | 24 | def desapilar(self): 25 | del self.items[-1] 26 | 27 | def tam(self): 28 | return len(self.items) 29 | -------------------------------------------------------------------------------- /charla_1/codigos/pila.py: -------------------------------------------------------------------------------- 1 | 2 | # Exemplo de implementacion de una pila 3 | 4 | 5 | def crear(): 6 | return [] 7 | 8 | 9 | def tam(s): 10 | return len(s) 11 | 12 | 13 | def apilar(s, e): 14 | s.append(e) 15 | 16 | 17 | def desapilar(s): 18 | t = s[-1] 19 | del s[-1] 20 | return t 21 | 22 | 23 | def cima(s): 24 | return s[-1] 25 | 26 | 27 | def vacia(s): 28 | if len(s): 29 | return False 30 | else: 31 | return True 32 | -------------------------------------------------------------------------------- /charla_1/codigos/vigenere.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | # Autor: Fran Rúa 5 | # Implementación en python do algoritmo de Vigenere 6 | # Máis info en: 7 | # https://es.wikipedia.org/wiki/Cifrado_de_Vigenère 8 | 9 | 10 | from sys import argv 11 | from getopt import getopt, GetoptError 12 | from string import ascii_lowercase 13 | from itertools import cycle 14 | 15 | 16 | # definimos o alfabeto como variable global 17 | ALPH = list(ascii_lowercase) 18 | 19 | 20 | def usage(): 21 | print 'Programa de cifrado mediante algoritmo de Vigenere\n. Uso:' 22 | print '-h, --help: mostra esta axuda' 23 | print '-i, --input: especifica un ficheiro de texto de entrada,'\ 24 | 'na ruta actual' 25 | print '-o, --output: especifica un ficheiro de saida' 26 | print '-d: desencripta un texto de entrada' 27 | print '-e: encripta un ficheiro de entrada' 28 | print '-k: establece unha clave para encriptar/desencriptar' 29 | exit(2) 30 | 31 | 32 | def len_error(num): 33 | print 'Error, a lonxitude da clave debe ser como mínimo 3' 34 | exit(2) 35 | 36 | 37 | def parse_options(argv): 38 | options = {'input_file': '', 'output_file': 'cyphertext.txt'} 39 | try: 40 | opts, args = getopt(argv, 'dehi:o:k:', ['input', 'output', 41 | 'help', 'key']) 42 | except GetoptError: 43 | print('Invalid Argument\nWrite --help for usage information') 44 | usage() 45 | for opt, arg in opts: 46 | if opt in ("-h", "--help"): 47 | usage() 48 | elif opt in ("-i", "--input"): 49 | options['input_file'] = arg 50 | elif opt in ("-o", "--output"): 51 | options['output_file'] = arg 52 | elif opt in ('-k', '--key'): 53 | if(len(arg) < 3): 54 | len_error(len(arg)) 55 | else: 56 | options['key'] = arg 57 | elif opt in ('-e', '-d'): 58 | options['operation'] = opt 59 | return options 60 | 61 | 62 | def invalid_argument(arg): 63 | print 'Opción inválida: ' + arg 64 | usage() 65 | 66 | 67 | def read_file(path): 68 | try: 69 | file = open(path, 'r') 70 | except IOError as e: 71 | print 'Error ({0}), {1}:{2}.'.format(e.errno, path, e.strerror) 72 | exit(1) 73 | text = file.read() 74 | file.close 75 | return text 76 | 77 | 78 | def write_file(text, path): 79 | try: 80 | file = open(path, 'w+') 81 | except IOError as e: 82 | print 'Error ({0}), {1}:{2}.'.format(e.errno, path, e.strerror) 83 | exit(1) 84 | file.write(text) 85 | file.close 86 | 87 | 88 | def encrypt_text(options): 89 | cleartext = read_file(options['input_file']) 90 | cleartext = cleartext.lower() 91 | cyphertext = '' 92 | key = [] 93 | for k in options['key']: 94 | key.append(ALPH.index(k)) 95 | pool = cycle(key) 96 | for e in cleartext: 97 | if e == ' ': 98 | cyphertext += ' ' 99 | elif e == '\n': 100 | continue 101 | else: 102 | cyphertext += ALPH[(ALPH.index(e) + next(pool)) % len(ALPH)] 103 | write_file(cyphertext, options['output_file']) 104 | 105 | 106 | def decrypt_text(options): 107 | cyphertext = read_file(options['input_file']) 108 | cyphertext = cyphertext.lower() 109 | cleartext = '' 110 | key = [] 111 | for k in options['key']: 112 | key.append(ALPH.index(k)) 113 | pool = cycle(key) 114 | for e in cyphertext: 115 | if e == ' ': 116 | cleartext += ' ' 117 | elif e == '\n': 118 | continue 119 | else: 120 | cleartext += ALPH[(ALPH.index(e) - next(pool)) % len(ALPH)] 121 | write_file(cleartext, options['output_file']) 122 | 123 | 124 | def main(argv): 125 | options = parse_options(argv) 126 | if(len(argv) < 6): 127 | print 'Numero de parametros insuficiente' 128 | usage() 129 | if options['operation'] == '-e': 130 | encrypt_text(options) 131 | elif options['operation'] == '-d': 132 | decrypt_text(options) 133 | else: 134 | invalid_argument(options['operation']) 135 | exit(0) 136 | 137 | 138 | if __name__ == '__main__': 139 | main(argv[1:]) # O primeiro elemento da lista e o nome do 140 | # propio programa, así que ignoramolo 141 | -------------------------------------------------------------------------------- /charla_1/img/bitbucket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/bitbucket.png -------------------------------------------------------------------------------- /charla_1/img/centralizado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/centralizado.png -------------------------------------------------------------------------------- /charla_1/img/compilacion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/compilacion.png -------------------------------------------------------------------------------- /charla_1/img/descentralizado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/descentralizado.png -------------------------------------------------------------------------------- /charla_1/img/flujo-git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/flujo-git.png -------------------------------------------------------------------------------- /charla_1/img/github.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/github.jpg -------------------------------------------------------------------------------- /charla_1/img/gitlab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/gitlab.png -------------------------------------------------------------------------------- /charla_1/img/interpretacion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/interpretacion.png -------------------------------------------------------------------------------- /charla_1/img/local.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/local.png -------------------------------------------------------------------------------- /charla_1/img/logo-git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/logo-git.png -------------------------------------------------------------------------------- /charla_1/img/logo-labs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/logo-labs.png -------------------------------------------------------------------------------- /charla_1/img/mercurial.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/mercurial.png -------------------------------------------------------------------------------- /charla_1/img/python-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/python-logo.png -------------------------------------------------------------------------------- /charla_1/img/svn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_1/img/svn.png -------------------------------------------------------------------------------- /charla_1/presentacion/GLabs_1.tex: -------------------------------------------------------------------------------- 1 | %% Preambulo, paquetes a cargar por compilador latex 2 | \documentclass[12pt]{beamer} 3 | \mode{ 4 | % selección de tema y color 5 | \usetheme{Copenhagen} 6 | \usecolortheme{orchid} 7 | } 8 | 9 | \usepackage[utf8]{inputenc} 10 | \usepackage[spanish]{babel} 11 | \usepackage{float} 12 | \usepackage{graphicx} 13 | \usepackage{caption} 14 | \usepackage{verbatim} 15 | \usepackage{url} 16 | \usepackage[export]{adjustbox} 17 | \usepackage{listings} 18 | \usepackage{tcolorbox} 19 | \usepackage{tikz} 20 | \usepackage{cclicenses} 21 | \usepackage{multicol} 22 | \lstdefinestyle{mystyle}{ 23 | basicstyle=\tiny, 24 | language=Python 25 | } 26 | \lstset{style=mystyle} 27 | 28 | %% Automatizar localización de las imágenes 29 | \graphicspath{{../img/}} 30 | 31 | \title{Introdución a Python, Git e Github} 32 | \author[Fran Rúa/Breixo Camiña]{Fran Rúa \\ Breixo Camiña} 33 | \institute[GPUL-Labs]{Grupo de Programadores e Usuarios Linux} 34 | \date{\today} 35 | 36 | \begin{document} 37 | 38 | \begin{frame} 39 | \titlepage 40 | \begin{tcolorbox}[] 41 | \centering 42 | {\small \bysa}\\ 43 | {\tiny Esta obra está suxeita á licencia 44 | Recoñecemento-CompartirIgual 4.0 Internacional de Creative 45 | Commons. Para ver unha copia desta licencia, visite 46 | http://creativecommons.org/licenses/by-sa/4.0/.} 47 | \end{tcolorbox} 48 | \end{frame} 49 | 50 | \begin{frame} 51 | \frametitle{Índice} 52 | \tableofcontents 53 | \end{frame} 54 | 55 | \usebackgroundtemplate{% 56 | \tikz[overlay,remember picture] 57 | \node[opacity=0.3 , at=(current page.south east),anchor=south east] { 58 | \includegraphics[]{logo-labs}}; 59 | } 60 | 61 | \input{python.tex} % introducción a python 62 | \input{cvs.tex} % uso de git 63 | \input{github.tex} % coñecendo github 64 | 65 | \end{document} -------------------------------------------------------------------------------- /charla_10/PluginGpul/README.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Plugin Builder Results

4 | 5 | Congratulations! You just built a plugin for QGIS!

6 | 7 |
8 | Your plugin PluginGpul was created in:
9 |   /home/ginetto/.qgis2/python/plugins/PluginGpul 10 |

11 | Your QGIS plugin directory is located at:
12 |   /home/ginetto/.qgis2/python/plugins 13 |

14 |

What's Next

15 |
    16 |
  1. In your plugin directory, compile the resources file using pyrcc4 (simply run make if you have automake or use pb_tool) 17 |
  2. Test the generated sources using make test (or run tests from your IDE) 18 |
  3. Copy the entire directory containing your new plugin to the QGIS plugin directory (see Notes below) 19 |
  4. Test the plugin by enabling it in the QGIS plugin manager 20 |
  5. Customize it by editing the implementation file plugin_gpul.py 21 |
  6. Create your own custom icon, replacing the default icon.png 22 |
  7. Modify your user interface by opening plugin_gpul_dialog_base.ui in Qt Designer 23 |
24 | Notes: 25 | 32 |
33 |
34 |

35 | For information on writing PyQGIS code, see http://loc8.cc/pyqgis_resources for a list of resources. 36 |

37 |
38 | GeoApt LLC 39 | ©2011-2015 GeoApt LLC - geoapt.com 40 | 41 | 42 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/README.txt: -------------------------------------------------------------------------------- 1 | Plugin Builder Results 2 | 3 | Your plugin PluginGpul was created in: 4 | /home/ginetto/.qgis2/python/plugins/PluginGpul 5 | 6 | Your QGIS plugin directory is located at: 7 | /home/ginetto/.qgis2/python/plugins 8 | 9 | What's Next: 10 | 11 | * Copy the entire directory containing your new plugin to the QGIS plugin 12 | directory 13 | 14 | * Compile the resources file using pyrcc4 15 | 16 | * Run the tests (``make test``) 17 | 18 | * Test the plugin by enabling it in the QGIS plugin manager 19 | 20 | * Customize it by editing the implementation file: ``plugin_gpul.py`` 21 | 22 | * Create your own custom icon, replacing the default icon.png 23 | 24 | * Modify your user interface by opening PluginGpul.ui in Qt Designer 25 | 26 | * You can use the Makefile to compile your Ui and resource files when 27 | you make changes. This requires GNU make (gmake) 28 | 29 | For more information, see the PyQGIS Developer Cookbook at: 30 | http://www.qgis.org/pyqgis-cookbook/index.html 31 | 32 | (C) 2011-2014 GeoApt LLC - geoapt.com 33 | Git revision : $Format:%H$ 34 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | /*************************************************************************** 4 | PluginGpul 5 | A QGIS plugin 6 | plugin desarrollado en GRUP LAb 7 | ------------------- 8 | begin : 2016-04-13 9 | copyright : (C) 2016 by Bundless 10 | email : lpirelli@boundlessgeo.com 11 | git sha : $Format:%H$ 12 | ***************************************************************************/ 13 | 14 | /*************************************************************************** 15 | * * 16 | * This program is free software; you can redistribute it and/or modify * 17 | * it under the terms of the GNU General Public License as published by * 18 | * the Free Software Foundation; either version 2 of the License, or * 19 | * (at your option) any later version. * 20 | * * 21 | ***************************************************************************/ 22 | This script initializes the plugin, making it known to QGIS. 23 | """ 24 | 25 | 26 | # noinspection PyPep8Naming 27 | def classFactory(iface): # pylint: disable=invalid-name 28 | """Load PluginGpul class from file PluginGpul. 29 | 30 | :param iface: A QGIS interface instance. 31 | :type iface: QgsInterface 32 | """ 33 | # 34 | from .plugin_gpul import PluginGpul 35 | return PluginGpul(iface) 36 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/__init__.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_10/PluginGpul/__init__.pyc -------------------------------------------------------------------------------- /charla_10/PluginGpul/help/Makefile: -------------------------------------------------------------------------------- 1 | # Makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | PAPER = 8 | BUILDDIR = build 9 | 10 | # Internal variables. 11 | PAPEROPT_a4 = -D latex_paper_size=a4 12 | PAPEROPT_letter = -D latex_paper_size=letter 13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source 14 | 15 | .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest 16 | 17 | help: 18 | @echo "Please use \`make ' where is one of" 19 | @echo " html to make standalone HTML files" 20 | @echo " dirhtml to make HTML files named index.html in directories" 21 | @echo " singlehtml to make a single large HTML file" 22 | @echo " pickle to make pickle files" 23 | @echo " json to make JSON files" 24 | @echo " htmlhelp to make HTML files and a HTML help project" 25 | @echo " qthelp to make HTML files and a qthelp project" 26 | @echo " devhelp to make HTML files and a Devhelp project" 27 | @echo " epub to make an epub" 28 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" 29 | @echo " latexpdf to make LaTeX files and run them through pdflatex" 30 | @echo " text to make text files" 31 | @echo " man to make manual pages" 32 | @echo " changes to make an overview of all changed/added/deprecated items" 33 | @echo " linkcheck to check all external links for integrity" 34 | @echo " doctest to run all doctests embedded in the documentation (if enabled)" 35 | 36 | clean: 37 | -rm -rf $(BUILDDIR)/* 38 | 39 | html: 40 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html 41 | @echo 42 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." 43 | 44 | dirhtml: 45 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml 46 | @echo 47 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." 48 | 49 | singlehtml: 50 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml 51 | @echo 52 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." 53 | 54 | pickle: 55 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle 56 | @echo 57 | @echo "Build finished; now you can process the pickle files." 58 | 59 | json: 60 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json 61 | @echo 62 | @echo "Build finished; now you can process the JSON files." 63 | 64 | htmlhelp: 65 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp 66 | @echo 67 | @echo "Build finished; now you can run HTML Help Workshop with the" \ 68 | ".hhp project file in $(BUILDDIR)/htmlhelp." 69 | 70 | qthelp: 71 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp 72 | @echo 73 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \ 74 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:" 75 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/template_class.qhcp" 76 | @echo "To view the help file:" 77 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/template_class.qhc" 78 | 79 | devhelp: 80 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp 81 | @echo 82 | @echo "Build finished." 83 | @echo "To view the help file:" 84 | @echo "# mkdir -p $$HOME/.local/share/devhelp/template_class" 85 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/template_class" 86 | @echo "# devhelp" 87 | 88 | epub: 89 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub 90 | @echo 91 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub." 92 | 93 | latex: 94 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 95 | @echo 96 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." 97 | @echo "Run \`make' in that directory to run these through (pdf)latex" \ 98 | "(use \`make latexpdf' here to do that automatically)." 99 | 100 | latexpdf: 101 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex 102 | @echo "Running LaTeX files through pdflatex..." 103 | make -C $(BUILDDIR)/latex all-pdf 104 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." 105 | 106 | text: 107 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text 108 | @echo 109 | @echo "Build finished. The text files are in $(BUILDDIR)/text." 110 | 111 | man: 112 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man 113 | @echo 114 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man." 115 | 116 | changes: 117 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes 118 | @echo 119 | @echo "The overview file is in $(BUILDDIR)/changes." 120 | 121 | linkcheck: 122 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck 123 | @echo 124 | @echo "Link check complete; look for any errors in the above output " \ 125 | "or in $(BUILDDIR)/linkcheck/output.txt." 126 | 127 | doctest: 128 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest 129 | @echo "Testing of doctests in the sources finished, look at the " \ 130 | "results in $(BUILDDIR)/doctest/output.txt." 131 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/help/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | REM Command file for Sphinx documentation 4 | 5 | if "%SPHINXBUILD%" == "" ( 6 | set SPHINXBUILD=sphinx-build 7 | ) 8 | set BUILDDIR=build 9 | set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source 10 | if NOT "%PAPER%" == "" ( 11 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% 12 | ) 13 | 14 | if "%1" == "" goto help 15 | 16 | if "%1" == "help" ( 17 | :help 18 | echo.Please use `make ^` where ^ is one of 19 | echo. html to make standalone HTML files 20 | echo. dirhtml to make HTML files named index.html in directories 21 | echo. singlehtml to make a single large HTML file 22 | echo. pickle to make pickle files 23 | echo. json to make JSON files 24 | echo. htmlhelp to make HTML files and a HTML help project 25 | echo. qthelp to make HTML files and a qthelp project 26 | echo. devhelp to make HTML files and a Devhelp project 27 | echo. epub to make an epub 28 | echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter 29 | echo. text to make text files 30 | echo. man to make manual pages 31 | echo. changes to make an overview over all changed/added/deprecated items 32 | echo. linkcheck to check all external links for integrity 33 | echo. doctest to run all doctests embedded in the documentation if enabled 34 | goto end 35 | ) 36 | 37 | if "%1" == "clean" ( 38 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i 39 | del /q /s %BUILDDIR%\* 40 | goto end 41 | ) 42 | 43 | if "%1" == "html" ( 44 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html 45 | echo. 46 | echo.Build finished. The HTML pages are in %BUILDDIR%/html. 47 | goto end 48 | ) 49 | 50 | if "%1" == "dirhtml" ( 51 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml 52 | echo. 53 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. 54 | goto end 55 | ) 56 | 57 | if "%1" == "singlehtml" ( 58 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml 59 | echo. 60 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. 61 | goto end 62 | ) 63 | 64 | if "%1" == "pickle" ( 65 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle 66 | echo. 67 | echo.Build finished; now you can process the pickle files. 68 | goto end 69 | ) 70 | 71 | if "%1" == "json" ( 72 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json 73 | echo. 74 | echo.Build finished; now you can process the JSON files. 75 | goto end 76 | ) 77 | 78 | if "%1" == "htmlhelp" ( 79 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp 80 | echo. 81 | echo.Build finished; now you can run HTML Help Workshop with the ^ 82 | .hhp project file in %BUILDDIR%/htmlhelp. 83 | goto end 84 | ) 85 | 86 | if "%1" == "qthelp" ( 87 | %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp 88 | echo. 89 | echo.Build finished; now you can run "qcollectiongenerator" with the ^ 90 | .qhcp project file in %BUILDDIR%/qthelp, like this: 91 | echo.^> qcollectiongenerator %BUILDDIR%\qthelp\template_class.qhcp 92 | echo.To view the help file: 93 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\template_class.ghc 94 | goto end 95 | ) 96 | 97 | if "%1" == "devhelp" ( 98 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp 99 | echo. 100 | echo.Build finished. 101 | goto end 102 | ) 103 | 104 | if "%1" == "epub" ( 105 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub 106 | echo. 107 | echo.Build finished. The epub file is in %BUILDDIR%/epub. 108 | goto end 109 | ) 110 | 111 | if "%1" == "latex" ( 112 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex 113 | echo. 114 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. 115 | goto end 116 | ) 117 | 118 | if "%1" == "text" ( 119 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text 120 | echo. 121 | echo.Build finished. The text files are in %BUILDDIR%/text. 122 | goto end 123 | ) 124 | 125 | if "%1" == "man" ( 126 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man 127 | echo. 128 | echo.Build finished. The manual pages are in %BUILDDIR%/man. 129 | goto end 130 | ) 131 | 132 | if "%1" == "changes" ( 133 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes 134 | echo. 135 | echo.The overview file is in %BUILDDIR%/changes. 136 | goto end 137 | ) 138 | 139 | if "%1" == "linkcheck" ( 140 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck 141 | echo. 142 | echo.Link check complete; look for any errors in the above output ^ 143 | or in %BUILDDIR%/linkcheck/output.txt. 144 | goto end 145 | ) 146 | 147 | if "%1" == "doctest" ( 148 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest 149 | echo. 150 | echo.Testing of doctests in the sources finished, look at the ^ 151 | results in %BUILDDIR%/doctest/output.txt. 152 | goto end 153 | ) 154 | 155 | :end 156 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/help/source/index.rst: -------------------------------------------------------------------------------- 1 | .. PluginGpul documentation master file, created by 2 | sphinx-quickstart on Sun Feb 12 17:11:03 2012. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to PluginGpul's documentation! 7 | ============================================ 8 | 9 | Contents: 10 | 11 | .. toctree:: 12 | :maxdepth: 2 13 | 14 | Indices and tables 15 | ================== 16 | 17 | * :ref:`genindex` 18 | * :ref:`modindex` 19 | * :ref:`search` 20 | 21 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/i18n/af.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | @default 5 | 6 | 7 | Good morning 8 | Goeie more 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_10/PluginGpul/icon.png -------------------------------------------------------------------------------- /charla_10/PluginGpul/metadata.txt: -------------------------------------------------------------------------------- 1 | # This file contains metadata for your plugin. Since 2 | # version 2.0 of QGIS this is the proper way to supply 3 | # information about a plugin. The old method of 4 | # embedding metadata in __init__.py will 5 | # is no longer supported since version 2.0. 6 | 7 | # This file should be included when you package your plugin.# Mandatory items: 8 | 9 | [general] 10 | name=El plugin de GPUL 11 | qgisMinimumVersion=2.0 12 | description=plugin desarrollado en GRUP LAb 13 | version=0.1 14 | author=Bundless 15 | email=lpirelli@boundlessgeo.com 16 | 17 | about=escripcion del plugin que se entienda en plugin manager 18 | 19 | tracker=bug tracker 20 | repository=donde esta el codigo 21 | # End of mandatory metadata 22 | 23 | # Recommended items: 24 | 25 | # Uncomment the following line and add your changelog: 26 | # changelog= 27 | 28 | # Tags are comma separated with spaces allowed 29 | tags=analysis, attribute, cadastre, csv, delimitation, geocoding 30 | 31 | homepage=home page 32 | category=Plugins 33 | icon=icon.png 34 | # experimental flag 35 | experimental=True 36 | 37 | # deprecated flag (applies to the whole plugin, not just a single version) 38 | deprecated=False 39 | 40 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/pb_tool.cfg: -------------------------------------------------------------------------------- 1 | #/*************************************************************************** 2 | # PluginGpul 3 | # 4 | # Configuration file for plugin builder tool (pb_tool) 5 | # ------------------- 6 | # begin : 2016-04-13 7 | # copyright : (C) 2016 by Bundless 8 | # email : lpirelli@boundlessgeo.com 9 | # ***************************************************************************/ 10 | # 11 | #/*************************************************************************** 12 | # * * 13 | # * This program is free software; you can redistribute it and/or modify * 14 | # * it under the terms of the GNU General Public License as published by * 15 | # * the Free Software Foundation; either version 2 of the License, or * 16 | # * (at your option) any later version. * 17 | # * * 18 | # ***************************************************************************/ 19 | # 20 | # 21 | # You can install pb_tool using: 22 | # pip install http://geoapt.net/files/pb_tool.zip 23 | # 24 | # Consider doing your development (and install of pb_tool) in a virtualenv. 25 | # 26 | # For details on setting up and using pb_tool, see: 27 | # http://spatialgalaxy.net/qgis-plugin-development-with-pb_tool 28 | # 29 | # Issues and pull requests here: 30 | # https://github.com/g-sherman/plugin_build_tool: 31 | # 32 | # Sane defaults for your plugin generated by the Plugin Builder are 33 | # already set below. 34 | # 35 | # As you add Python source files and UI files to your plugin, add 36 | # them to the appropriate [files] section below. 37 | 38 | [plugin] 39 | # Name of the plugin. This is the name of the directory that will 40 | # be created in .qgis2/python/plugins 41 | name: PluginGpul 42 | 43 | [files] 44 | # Python files that should be deployed with the plugin 45 | python_files: __init__.py plugin_gpul.py plugin_gpul_dialog.py 46 | 47 | # The main dialog file that is loaded (not compiled) 48 | main_dialog: plugin_gpul_dialog_base.ui 49 | 50 | # Other ui files for dialogs you create (these will be compiled) 51 | compiled_ui_files: 52 | 53 | # Resource file(s) that will be compiled 54 | resource_files: resources.qrc 55 | 56 | # Other files required for the plugin 57 | extras: metadata.txt icon.png 58 | 59 | # Other directories to be deployed with the plugin. 60 | # These must be subdirectories under the plugin directory 61 | extra_dirs: 62 | 63 | # ISO code(s) for any locales (translations), separated by spaces. 64 | # Corresponding .ts files must exist in the i18n directory 65 | locales: 66 | 67 | [help] 68 | # the built help directory that should be deployed with the plugin 69 | dir: help/build/html 70 | # the name of the directory to target in the deployed plugin 71 | target: help 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/plugin_gpul.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_10/PluginGpul/plugin_gpul.pyc -------------------------------------------------------------------------------- /charla_10/PluginGpul/plugin_gpul_dialog.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | /*************************************************************************** 4 | PluginGpulDialog 5 | A QGIS plugin 6 | plugin desarrollado en GRUP LAb 7 | ------------------- 8 | begin : 2016-04-13 9 | git sha : $Format:%H$ 10 | copyright : (C) 2016 by Bundless 11 | email : lpirelli@boundlessgeo.com 12 | ***************************************************************************/ 13 | 14 | /*************************************************************************** 15 | * * 16 | * This program is free software; you can redistribute it and/or modify * 17 | * it under the terms of the GNU General Public License as published by * 18 | * the Free Software Foundation; either version 2 of the License, or * 19 | * (at your option) any later version. * 20 | * * 21 | ***************************************************************************/ 22 | """ 23 | 24 | import os 25 | 26 | from PyQt4 import QtGui, uic 27 | 28 | FORM_CLASS, _ = uic.loadUiType(os.path.join( 29 | os.path.dirname(__file__), 'plugin_gpul_dialog_base.ui')) 30 | 31 | 32 | class PluginGpulDialog(QtGui.QDialog, FORM_CLASS): 33 | def __init__(self, parent=None): 34 | """Constructor.""" 35 | super(PluginGpulDialog, self).__init__(parent) 36 | # Set up the user interface from Designer. 37 | # After setupUI you can access any designer object by doing 38 | # self., and you can use autoconnect slots - see 39 | # http://qt-project.org/doc/qt-4.8/designer-using-a-ui-file.html 40 | # #widgets-and-dialogs-with-auto-connect 41 | self.setupUi(self) 42 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/plugin_gpul_dialog.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_10/PluginGpul/plugin_gpul_dialog.pyc -------------------------------------------------------------------------------- /charla_10/PluginGpul/plugin_gpul_dialog_base.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | PluginGpulDialogBase 4 | 5 | 6 | 7 | 0 8 | 0 9 | 283 10 | 157 11 | 12 | 13 | 14 | El plugin de GPUL 15 | 16 | 17 | 18 | 19 | 20 | vectors 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | trasters 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | Qt::Horizontal 41 | 42 | 43 | QDialogButtonBox::Cancel|QDialogButtonBox::Ok 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | button_box 53 | accepted() 54 | PluginGpulDialogBase 55 | accept() 56 | 57 | 58 | 20 59 | 20 60 | 61 | 62 | 20 63 | 20 64 | 65 | 66 | 67 | 68 | button_box 69 | rejected() 70 | PluginGpulDialogBase 71 | reject() 72 | 73 | 74 | 20 75 | 20 76 | 77 | 78 | 20 79 | 20 80 | 81 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/plugin_upload.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | """This script uploads a plugin package on the server. 4 | Authors: A. Pasotti, V. Picavet 5 | git sha : $TemplateVCSFormat 6 | """ 7 | 8 | import sys 9 | import getpass 10 | import xmlrpclib 11 | from optparse import OptionParser 12 | 13 | # Configuration 14 | PROTOCOL = 'http' 15 | SERVER = 'plugins.qgis.org' 16 | PORT = '80' 17 | ENDPOINT = '/plugins/RPC2/' 18 | VERBOSE = False 19 | 20 | 21 | def main(parameters, arguments): 22 | """Main entry point. 23 | 24 | :param parameters: Command line parameters. 25 | :param arguments: Command line arguments. 26 | """ 27 | address = "%s://%s:%s@%s:%s%s" % ( 28 | PROTOCOL, 29 | parameters.username, 30 | parameters.password, 31 | parameters.server, 32 | parameters.port, 33 | ENDPOINT) 34 | print "Connecting to: %s" % hide_password(address) 35 | 36 | server = xmlrpclib.ServerProxy(address, verbose=VERBOSE) 37 | 38 | try: 39 | plugin_id, version_id = server.plugin.upload( 40 | xmlrpclib.Binary(open(arguments[0]).read())) 41 | print "Plugin ID: %s" % plugin_id 42 | print "Version ID: %s" % version_id 43 | except xmlrpclib.ProtocolError, err: 44 | print "A protocol error occurred" 45 | print "URL: %s" % hide_password(err.url, 0) 46 | print "HTTP/HTTPS headers: %s" % err.headers 47 | print "Error code: %d" % err.errcode 48 | print "Error message: %s" % err.errmsg 49 | except xmlrpclib.Fault, err: 50 | print "A fault occurred" 51 | print "Fault code: %d" % err.faultCode 52 | print "Fault string: %s" % err.faultString 53 | 54 | 55 | def hide_password(url, start=6): 56 | """Returns the http url with password part replaced with '*'. 57 | 58 | :param url: URL to upload the plugin to. 59 | :type url: str 60 | 61 | :param start: Position of start of password. 62 | :type start: int 63 | """ 64 | start_position = url.find(':', start) + 1 65 | end_position = url.find('@') 66 | return "%s%s%s" % ( 67 | url[:start_position], 68 | '*' * (end_position - start_position), 69 | url[end_position:]) 70 | 71 | 72 | if __name__ == "__main__": 73 | parser = OptionParser(usage="%prog [options] plugin.zip") 74 | parser.add_option( 75 | "-w", "--password", dest="password", 76 | help="Password for plugin site", metavar="******") 77 | parser.add_option( 78 | "-u", "--username", dest="username", 79 | help="Username of plugin site", metavar="user") 80 | parser.add_option( 81 | "-p", "--port", dest="port", 82 | help="Server port to connect to", metavar="80") 83 | parser.add_option( 84 | "-s", "--server", dest="server", 85 | help="Specify server name", metavar="plugins.qgis.org") 86 | options, args = parser.parse_args() 87 | if len(args) != 1: 88 | print "Please specify zip file.\n" 89 | parser.print_help() 90 | sys.exit(1) 91 | if not options.server: 92 | options.server = SERVER 93 | if not options.port: 94 | options.port = PORT 95 | if not options.username: 96 | # interactive mode 97 | username = getpass.getuser() 98 | print "Please enter user name [%s] :" % username, 99 | res = raw_input() 100 | if res != "": 101 | options.username = res 102 | else: 103 | options.username = username 104 | if not options.password: 105 | # interactive mode 106 | options.password = getpass.getpass() 107 | main(options, args) 108 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/resources.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | # Resource object code 4 | # 5 | # Created by: The Resource Compiler for PyQt4 (Qt v4.8.6) 6 | # 7 | # WARNING! All changes made in this file will be lost! 8 | 9 | from PyQt4 import QtCore 10 | 11 | qt_resource_data = "\ 12 | \x00\x00\x04\x0a\ 13 | \x89\ 14 | \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ 15 | \x00\x00\x17\x00\x00\x00\x18\x08\x06\x00\x00\x00\x11\x7c\x66\x75\ 16 | \x00\x00\x00\x01\x73\x52\x47\x42\x00\xae\xce\x1c\xe9\x00\x00\x00\ 17 | \x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\ 18 | \x00\x00\x09\x70\x48\x59\x73\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\ 19 | \x00\x9a\x9c\x18\x00\x00\x00\x07\x74\x49\x4d\x45\x07\xd9\x02\x15\ 20 | \x16\x11\x2c\x9d\x48\x83\xbb\x00\x00\x03\x8a\x49\x44\x41\x54\x48\ 21 | \xc7\xad\x95\x4b\x68\x5c\x55\x18\xc7\x7f\xe7\xdc\x7b\x67\xe6\xce\ 22 | \x4c\x66\x26\x49\xd3\x24\x26\xa6\xc6\xf8\x40\x21\xa5\x04\xb3\x28\ 23 | \xda\x98\x20\xa5\x0b\xad\x55\xa8\x2b\xc5\x50\x1f\xa0\x6e\x34\x2b\ 24 | \x45\x30\x14\x02\xba\x52\x69\x15\x17\x66\x63\x45\x97\x95\xa0\xad\ 25 | \x0b\xfb\xc0\x06\x25\xb6\x71\x61\x12\x41\x50\xdb\x2a\x21\xd1\xe2\ 26 | \x24\xf3\x9e\xc9\xcc\xbd\xe7\x1c\x17\x35\x43\x1e\x33\x21\xb6\xfd\ 27 | \x56\x87\xf3\x9d\xfb\xfb\x1e\xf7\xff\x9d\x23\x8c\x31\x43\x95\xf4\ 28 | \x85\x1e\x3f\x3b\x35\xac\xfd\xcc\x43\xdc\xa4\x49\x3b\xfe\x9d\x1d\ 29 | \xdb\x7b\x22\x90\x78\xf8\xb2\x28\xa7\xbe\x7d\xc1\x4b\x9d\x79\xdf\ 30 | \x18\x15\xe5\x16\x99\x10\x56\xde\x69\xdc\x3f\x22\xfd\xec\xd4\xf0\ 31 | \xad\x04\x03\x18\xa3\xa2\x7e\x76\x6a\x58\xde\x68\x2b\xb4\x36\xf8\ 32 | \xbe\xc6\x18\x53\xdb\xef\xe7\xfa\xec\xed\x67\x63\x10\x42\x00\xf0\ 33 | \xfb\xd5\x65\x2a\x15\x45\xc7\x6d\x0d\x00\xc4\xa2\xc1\xaa\x6f\x0d\ 34 | \x3e\x6c\xab\xc2\x1c\x56\xa4\x77\x4b\xb0\xf2\x35\x15\x5f\x21\x85\ 35 | \xe0\xc8\x6b\x5f\x92\x2d\x37\x33\x39\xf9\x03\x27\x8e\x1f\xa2\xf7\ 36 | \xbe\x9d\x04\x1c\x0b\x37\xe4\xac\xff\xa6\x30\x87\xbd\xba\x00\x6a\ 37 | \x06\x79\xe5\xf5\xaf\x89\xd9\x92\xc5\xcc\x0a\xd9\x7c\x19\xcf\xe9\ 38 | \xe2\xe4\xa9\x2f\x78\x7c\xff\x01\x72\x85\x0a\x2b\x65\x1f\xa5\x4c\ 39 | \xb5\xb2\x55\x16\x80\xbd\x31\xda\xda\x20\x1f\x7d\x3e\xcd\xc2\xfd\ 40 | \x59\xa6\x93\x39\x92\xd1\x22\xea\x9b\x16\xce\x9d\x3f\xce\xe0\x83\ 41 | \x03\x24\x82\x59\x3a\xdb\x7b\x88\xc7\x82\x68\x63\x58\xc9\xcc\x62\ 42 | \x8c\x21\x18\xb0\x6a\xc3\x37\x06\x49\x16\xff\x24\x6b\xa5\x49\xbb\ 43 | \x25\xbc\xa2\xa6\x21\xbb\x40\x7f\xdf\x00\x83\xbd\x01\x8e\x3c\xd5\ 44 | \x45\xd7\x8e\x6b\x9c\x9c\x98\x25\x1a\xb6\xe8\xbe\x3d\xc2\xdd\x77\ 45 | \x44\x48\xc4\x1c\x22\xe1\xeb\x58\x59\xaf\xcf\xd3\x33\x29\x2e\x34\ 46 | \x2d\x91\x93\x3e\xbe\x34\x78\x01\xc5\xe2\x61\xc5\xae\x72\x8e\x70\ 47 | \xc8\xc2\x0d\x5a\xbc\xf5\xee\x2f\x9c\xfa\x3e\x86\x69\x7a\x8e\xcf\ 48 | \x26\xe6\xf9\x63\xa1\x44\xa1\xa4\xd0\xda\x6c\x0d\x2f\x15\x7c\xb4\ 49 | \x67\x28\x59\x0a\xcf\xd6\x54\xe2\x06\x13\x87\x2b\x6f\x68\xa6\x27\ 50 | \xaf\x31\x32\x36\xc7\xb2\x7f\x17\xef\x7d\x7c\x8c\x33\x67\xcf\x12\ 51 | \x70\x24\x4a\x69\xd6\x6a\x46\xd6\xd3\x70\x72\xa9\x82\x67\x34\x45\ 52 | \xad\x28\xdb\x1a\x15\x34\x98\xff\x46\xed\xef\x37\x0d\x99\xbf\x4a\ 53 | \x3c\x30\x38\xc0\xc8\x4b\xaf\x92\x5a\x9c\xe2\xe0\x23\x6d\x74\xb4\ 54 | \xba\x84\x5d\x0b\x29\x45\x7d\xb8\x94\x82\x96\xb6\x10\xf3\xc5\x12\ 55 | \x2a\xef\x53\x11\x1a\x63\xad\x3f\x93\x19\x85\xf1\xb1\x77\x58\x5a\ 56 | \xf8\x99\x97\x9f\xe9\xa6\x75\x47\x90\xc6\xb8\x43\xd8\xb5\xb6\xce\ 57 | \xfc\xfa\xfd\x00\xfb\x3e\xf4\xc8\x05\x35\xba\x5e\xeb\x46\x21\xf9\ 58 | \xcf\x0a\xa9\x8c\x87\xe3\x48\xdc\x90\xb5\x6e\x98\x6a\xaa\x65\xf2\ 59 | \x52\x92\x43\x2f\x5e\xc2\x8c\x02\x1a\x10\xf5\x07\xac\xc3\x75\x70\ 60 | \x83\x92\x80\xb3\xf9\xd0\x26\xf8\x8f\xb3\x29\xc6\x3e\xb8\x8c\x19\ 61 | \x35\x75\x6b\x7b\x7e\x3c\xca\x45\x0c\x7e\x49\x31\xf4\x58\x3b\xf7\ 62 | \xf6\x34\x90\x88\x39\x04\x1c\x59\x1f\xfe\xdb\xd5\x3c\x5f\x9d\x4b\ 63 | \x32\xfd\x44\xb2\xba\xd7\xfa\xb6\x60\xcf\xde\x16\xdc\x90\x45\x4c\ 64 | \x4a\x2a\x9e\x62\xfe\x4e\xc5\xc8\xc1\x4e\xda\x76\x86\xe8\xe9\x0a\ 65 | \xe3\xd8\x92\x58\xd4\xc6\xb2\x44\x6d\x78\x2a\x53\xe1\xca\x7c\x99\ 66 | \x63\x5d\xbf\x56\x9d\xbd\x9f\x44\x18\x7a\xba\x95\x27\x0f\xb4\xd3\ 67 | \xdc\x18\xc0\xf3\x0d\x52\x40\xd8\xb5\xb0\xa4\x20\x14\xb2\x70\x6c\ 68 | \x81\x63\xcb\xaa\x42\xd6\xfd\xb7\xf4\xec\xa3\x06\xa0\x50\x52\xd8\ 69 | \x4e\x1b\x7e\x4a\xd3\x31\xf9\x29\xcf\xfe\xd4\x49\x7f\x5f\x13\xfb\ 70 | \xfa\x9b\x71\x43\x92\x58\xd4\x21\x18\x90\xac\xde\xb0\x42\x50\x13\ 71 | \x58\x33\xf3\x88\x6b\xa1\xfd\x65\x96\xf2\x79\xc6\x43\x7b\xd8\x75\ 72 | \x38\xcc\x3d\xdd\xd1\xaa\xcf\x71\xe4\xff\x7f\x91\x56\x33\xaf\xea\ 73 | \x37\xe7\xa1\x94\x21\x16\xb5\xd1\x06\x2c\x29\x36\xf5\x72\x9b\x96\ 74 | \x95\xc0\xc4\xda\x9d\x78\x83\x43\x53\x22\x80\x65\x09\x1c\xfb\x86\ 75 | \xc1\x00\xe7\x25\x70\x14\x48\x6f\x1e\x22\x51\xe3\x75\xd9\xb6\xa5\ 76 | \x81\xa3\x32\xb1\xfb\xf4\x0c\x30\xb8\xb1\x82\x9b\xb0\x09\x60\x30\ 77 | \xb1\xfb\xf4\xcc\xbf\xa0\xe9\x6e\xae\x5a\xdf\x4b\x81\x00\x00\x00\ 78 | \x00\x49\x45\x4e\x44\xae\x42\x60\x82\ 79 | " 80 | 81 | qt_resource_name = "\ 82 | \x00\x07\ 83 | \x07\x3b\xe0\xb3\ 84 | \x00\x70\ 85 | \x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x73\ 86 | \x00\x0a\ 87 | \x0e\x08\x00\xdc\ 88 | \x00\x50\ 89 | \x00\x6c\x00\x75\x00\x67\x00\x69\x00\x6e\x00\x47\x00\x70\x00\x75\x00\x6c\ 90 | \x00\x08\ 91 | \x0a\x61\x5a\xa7\ 92 | \x00\x69\ 93 | \x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ 94 | " 95 | 96 | qt_resource_struct = "\ 97 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ 98 | \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ 99 | \x00\x00\x00\x14\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\ 100 | \x00\x00\x00\x2e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ 101 | " 102 | 103 | def qInitResources(): 104 | QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) 105 | 106 | def qCleanupResources(): 107 | QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) 108 | 109 | qInitResources() 110 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/resources.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_10/PluginGpul/resources.pyc -------------------------------------------------------------------------------- /charla_10/PluginGpul/resources.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | icon.png 4 | 5 | 6 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/scripts/compile-strings.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | LRELEASE=$1 3 | LOCALES=$2 4 | 5 | 6 | for LOCALE in ${LOCALES} 7 | do 8 | echo "Processing: ${LOCALE}.ts" 9 | # Note we don't use pylupdate with qt .pro file approach as it is flakey 10 | # about what is made available. 11 | $LRELEASE i18n/${LOCALE}.ts 12 | done 13 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/scripts/run-env-linux.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | QGIS_PREFIX_PATH=/usr/local/qgis-2.0 4 | if [ -n "$1" ]; then 5 | QGIS_PREFIX_PATH=$1 6 | fi 7 | 8 | echo ${QGIS_PREFIX_PATH} 9 | 10 | 11 | export QGIS_PREFIX_PATH=${QGIS_PREFIX_PATH} 12 | export QGIS_PATH=${QGIS_PREFIX_PATH} 13 | export LD_LIBRARY_PATH=${QGIS_PREFIX_PATH}/lib 14 | export PYTHONPATH=${QGIS_PREFIX_PATH}/share/qgis/python:${QGIS_PREFIX_PATH}/share/qgis/python/plugins:${PYTHONPATH} 15 | 16 | echo "QGIS PATH: $QGIS_PREFIX_PATH" 17 | export QGIS_DEBUG=0 18 | export QGIS_LOG_FILE=/tmp/inasafe/realtime/logs/qgis.log 19 | 20 | export PATH=${QGIS_PREFIX_PATH}/bin:$PATH 21 | 22 | echo "This script is intended to be sourced to set up your shell to" 23 | echo "use a QGIS 2.0 built in $QGIS_PREFIX_PATH" 24 | echo 25 | echo "To use it do:" 26 | echo "source $BASH_SOURCE /your/optional/install/path" 27 | echo 28 | echo "Then use the make file supplied here e.g. make guitest" 29 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/scripts/update-strings.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | LOCALES=$* 3 | 4 | # Get newest .py files so we don't update strings unnecessarily 5 | 6 | CHANGED_FILES=0 7 | PYTHON_FILES=`find . -regex ".*\(ui\|py\)$" -type f` 8 | for PYTHON_FILE in $PYTHON_FILES 9 | do 10 | CHANGED=$(stat -c %Y $PYTHON_FILE) 11 | if [ ${CHANGED} -gt ${CHANGED_FILES} ] 12 | then 13 | CHANGED_FILES=${CHANGED} 14 | fi 15 | done 16 | 17 | # Qt translation stuff 18 | # for .ts file 19 | UPDATE=false 20 | for LOCALE in ${LOCALES} 21 | do 22 | TRANSLATION_FILE="i18n/$LOCALE.ts" 23 | if [ ! -f ${TRANSLATION_FILE} ] 24 | then 25 | # Force translation string collection as we have a new language file 26 | touch ${TRANSLATION_FILE} 27 | UPDATE=true 28 | break 29 | fi 30 | 31 | MODIFICATION_TIME=$(stat -c %Y ${TRANSLATION_FILE}) 32 | if [ ${CHANGED_FILES} -gt ${MODIFICATION_TIME} ] 33 | then 34 | # Force translation string collection as a .py file has been updated 35 | UPDATE=true 36 | break 37 | fi 38 | done 39 | 40 | if [ ${UPDATE} == true ] 41 | # retrieve all python files 42 | then 43 | print ${PYTHON_FILES} 44 | # update .ts 45 | echo "Please provide translations by editing the translation files below:" 46 | for LOCALE in ${LOCALES} 47 | do 48 | echo "i18n/"${LOCALE}".ts" 49 | # Note we don't use pylupdate with qt .pro file approach as it is flakey 50 | # about what is made available. 51 | pylupdate4 -noobsolete ${PYTHON_FILES} -ts i18n/${LOCALE}.ts 52 | done 53 | else 54 | echo "No need to edit any translation files (.ts) because no python files" 55 | echo "has been updated since the last update translation. " 56 | fi 57 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/__init__.py: -------------------------------------------------------------------------------- 1 | # import qgis libs so that ve set the correct sip api version 2 | import qgis # pylint: disable=W0611 # NOQA -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/tenbytenraster.asc: -------------------------------------------------------------------------------- 1 | NCOLS 10 2 | NROWS 10 3 | XLLCENTER 1535380.000000 4 | YLLCENTER 5083260.000000 5 | DX 10 6 | DY 10 7 | NODATA_VALUE -9999 8 | 0 1 2 3 4 5 6 7 8 9 9 | 0 1 2 3 4 5 6 7 8 9 10 | 0 1 2 3 4 5 6 7 8 9 11 | 0 1 2 3 4 5 6 7 8 9 12 | 0 1 2 3 4 5 6 7 8 9 13 | 0 1 2 3 4 5 6 7 8 9 14 | 0 1 2 3 4 5 6 7 8 9 15 | 0 1 2 3 4 5 6 7 8 9 16 | 0 1 2 3 4 5 6 7 8 9 17 | 0 1 2 3 4 5 6 7 8 9 18 | CRS 19 | NOTES 20 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/tenbytenraster.asc.aux.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Point 4 | 5 | 6 | 7 | 9 8 | 4.5 9 | 0 10 | 2.872281323269 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/tenbytenraster.keywords: -------------------------------------------------------------------------------- 1 | title: Tenbytenraster 2 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/tenbytenraster.lic: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Tim Sutton, Linfiniti Consulting CC 5 | 6 | 7 | 8 | tenbytenraster.asc 9 | 2700044251 10 | Yes 11 | Tim Sutton 12 | Tim Sutton (QGIS Source Tree) 13 | Tim Sutton 14 | This data is publicly available from QGIS Source Tree. The original 15 | file was created and contributed to QGIS by Tim Sutton. 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/tenbytenraster.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/tenbytenraster.qml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 0 26 | 27 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/test_init.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | """Tests QGIS plugin init.""" 3 | 4 | __author__ = 'Tim Sutton ' 5 | __revision__ = '$Format:%H$' 6 | __date__ = '17/10/2010' 7 | __license__ = "GPL" 8 | __copyright__ = 'Copyright 2012, Australia Indonesia Facility for ' 9 | __copyright__ += 'Disaster Reduction' 10 | 11 | import os 12 | import unittest 13 | import logging 14 | import ConfigParser 15 | 16 | LOGGER = logging.getLogger('QGIS') 17 | 18 | 19 | class TestInit(unittest.TestCase): 20 | """Test that the plugin init is usable for QGIS. 21 | 22 | Based heavily on the validator class by Alessandro 23 | Passoti available here: 24 | 25 | http://github.com/qgis/qgis-django/blob/master/qgis-app/ 26 | plugins/validator.py 27 | 28 | """ 29 | 30 | def test_read_init(self): 31 | """Test that the plugin __init__ will validate on plugins.qgis.org.""" 32 | 33 | # You should update this list according to the latest in 34 | # https://github.com/qgis/qgis-django/blob/master/qgis-app/ 35 | # plugins/validator.py 36 | 37 | required_metadata = [ 38 | 'name', 39 | 'description', 40 | 'version', 41 | 'qgisMinimumVersion', 42 | 'email', 43 | 'author'] 44 | 45 | file_path = os.path.abspath(os.path.join( 46 | os.path.dirname(__file__), os.pardir, 47 | 'metadata.txt')) 48 | LOGGER.info(file_path) 49 | metadata = [] 50 | parser = ConfigParser.ConfigParser() 51 | parser.optionxform = str 52 | parser.read(file_path) 53 | message = 'Cannot find a section named "general" in %s' % file_path 54 | assert parser.has_section('general'), message 55 | metadata.extend(parser.items('general')) 56 | 57 | for expectation in required_metadata: 58 | message = ('Cannot find metadata "%s" in metadata source (%s).' % ( 59 | expectation, file_path)) 60 | 61 | self.assertIn(expectation, dict(metadata), message) 62 | 63 | if __name__ == '__main__': 64 | unittest.main() 65 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/test_plugin_gpul_dialog.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | """Dialog test. 3 | 4 | .. note:: This program is free software; you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation; either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | """ 10 | 11 | __author__ = 'lpirelli@boundlessgeo.com' 12 | __date__ = '2016-04-13' 13 | __copyright__ = 'Copyright 2016, Bundless' 14 | 15 | import unittest 16 | 17 | from PyQt4.QtGui import QDialogButtonBox, QDialog 18 | 19 | from plugin_gpul_dialog import PluginGpulDialog 20 | 21 | from utilities import get_qgis_app 22 | QGIS_APP = get_qgis_app() 23 | 24 | 25 | class PluginGpulDialogTest(unittest.TestCase): 26 | """Test dialog works.""" 27 | 28 | def setUp(self): 29 | """Runs before each test.""" 30 | self.dialog = PluginGpulDialog(None) 31 | 32 | def tearDown(self): 33 | """Runs after each test.""" 34 | self.dialog = None 35 | 36 | def test_dialog_ok(self): 37 | """Test we can click OK.""" 38 | 39 | button = self.dialog.button_box.button(QDialogButtonBox.Ok) 40 | button.click() 41 | result = self.dialog.result() 42 | self.assertEqual(result, QDialog.Accepted) 43 | 44 | def test_dialog_cancel(self): 45 | """Test we can click cancel.""" 46 | button = self.dialog.button_box.button(QDialogButtonBox.Cancel) 47 | button.click() 48 | result = self.dialog.result() 49 | self.assertEqual(result, QDialog.Rejected) 50 | 51 | if __name__ == "__main__": 52 | suite = unittest.makeSuite(PluginGpulDialogTest) 53 | runner = unittest.TextTestRunner(verbosity=2) 54 | runner.run(suite) 55 | 56 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/test_qgis_environment.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | """Tests for QGIS functionality. 3 | 4 | 5 | .. note:: This program is free software; you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation; either version 2 of the License, or 8 | (at your option) any later version. 9 | 10 | """ 11 | __author__ = 'tim@linfiniti.com' 12 | __date__ = '20/01/2011' 13 | __copyright__ = ('Copyright 2012, Australia Indonesia Facility for ' 14 | 'Disaster Reduction') 15 | 16 | import os 17 | import unittest 18 | from qgis.core import ( 19 | QgsProviderRegistry, 20 | QgsCoordinateReferenceSystem, 21 | QgsRasterLayer) 22 | 23 | from utilities import get_qgis_app 24 | QGIS_APP = get_qgis_app() 25 | 26 | 27 | class QGISTest(unittest.TestCase): 28 | """Test the QGIS Environment""" 29 | 30 | def test_qgis_environment(self): 31 | """QGIS environment has the expected providers""" 32 | 33 | r = QgsProviderRegistry.instance() 34 | self.assertIn('gdal', r.providerList()) 35 | self.assertIn('ogr', r.providerList()) 36 | self.assertIn('postgres', r.providerList()) 37 | 38 | def test_projection(self): 39 | """Test that QGIS properly parses a wkt string. 40 | """ 41 | crs = QgsCoordinateReferenceSystem() 42 | wkt = ( 43 | 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",' 44 | 'SPHEROID["WGS_1984",6378137.0,298.257223563]],' 45 | 'PRIMEM["Greenwich",0.0],UNIT["Degree",' 46 | '0.0174532925199433]]') 47 | crs.createFromWkt(wkt) 48 | auth_id = crs.authid() 49 | expected_auth_id = 'EPSG:4326' 50 | self.assertEqual(auth_id, expected_auth_id) 51 | 52 | # now test for a loaded layer 53 | path = os.path.join(os.path.dirname(__file__), 'tenbytenraster.asc') 54 | title = 'TestRaster' 55 | layer = QgsRasterLayer(path, title) 56 | auth_id = layer.crs().authid() 57 | self.assertEqual(auth_id, expected_auth_id) 58 | 59 | if __name__ == '__main__': 60 | unittest.main() 61 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/test_resources.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | """Resources test. 3 | 4 | .. note:: This program is free software; you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation; either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | """ 10 | 11 | __author__ = 'lpirelli@boundlessgeo.com' 12 | __date__ = '2016-04-13' 13 | __copyright__ = 'Copyright 2016, Bundless' 14 | 15 | import unittest 16 | 17 | from PyQt4.QtGui import QIcon 18 | 19 | 20 | 21 | class PluginGpulDialogTest(unittest.TestCase): 22 | """Test rerources work.""" 23 | 24 | def setUp(self): 25 | """Runs before each test.""" 26 | pass 27 | 28 | def tearDown(self): 29 | """Runs after each test.""" 30 | pass 31 | 32 | def test_icon_png(self): 33 | """Test we can click OK.""" 34 | path = ':/plugins/PluginGpul/icon.png' 35 | icon = QIcon(path) 36 | self.assertFalse(icon.isNull()) 37 | 38 | if __name__ == "__main__": 39 | suite = unittest.makeSuite(PluginGpulResourcesTest) 40 | runner = unittest.TextTestRunner(verbosity=2) 41 | runner.run(suite) 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/test_translations.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | """Safe Translations Test. 3 | 4 | .. note:: This program is free software; you can redistribute it and/or modify 5 | it under the terms of the GNU General Public License as published by 6 | the Free Software Foundation; either version 2 of the License, or 7 | (at your option) any later version. 8 | 9 | """ 10 | from utilities import get_qgis_app 11 | 12 | __author__ = 'ismailsunni@yahoo.co.id' 13 | __date__ = '12/10/2011' 14 | __copyright__ = ('Copyright 2012, Australia Indonesia Facility for ' 15 | 'Disaster Reduction') 16 | import unittest 17 | import os 18 | 19 | from PyQt4.QtCore import QCoreApplication, QTranslator 20 | 21 | QGIS_APP = get_qgis_app() 22 | 23 | 24 | class SafeTranslationsTest(unittest.TestCase): 25 | """Test translations work.""" 26 | 27 | def setUp(self): 28 | """Runs before each test.""" 29 | if 'LANG' in os.environ.iterkeys(): 30 | os.environ.__delitem__('LANG') 31 | 32 | def tearDown(self): 33 | """Runs after each test.""" 34 | if 'LANG' in os.environ.iterkeys(): 35 | os.environ.__delitem__('LANG') 36 | 37 | def test_qgis_translations(self): 38 | """Test that translations work.""" 39 | parent_path = os.path.join(__file__, os.path.pardir, os.path.pardir) 40 | dir_path = os.path.abspath(parent_path) 41 | file_path = os.path.join( 42 | dir_path, 'i18n', 'af.qm') 43 | translator = QTranslator() 44 | translator.load(file_path) 45 | QCoreApplication.installTranslator(translator) 46 | 47 | expected_message = 'Goeie more' 48 | real_message = QCoreApplication.translate("@default", 'Good morning') 49 | self.assertEqual(real_message, expected_message) 50 | 51 | 52 | if __name__ == "__main__": 53 | suite = unittest.makeSuite(SafeTranslationsTest) 54 | runner = unittest.TextTestRunner(verbosity=2) 55 | runner.run(suite) 56 | -------------------------------------------------------------------------------- /charla_10/PluginGpul/test/utilities.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | """Common functionality used by regression tests.""" 3 | 4 | import sys 5 | import logging 6 | 7 | 8 | LOGGER = logging.getLogger('QGIS') 9 | QGIS_APP = None # Static variable used to hold hand to running QGIS app 10 | CANVAS = None 11 | PARENT = None 12 | IFACE = None 13 | 14 | 15 | def get_qgis_app(): 16 | """ Start one QGIS application to test against. 17 | 18 | :returns: Handle to QGIS app, canvas, iface and parent. If there are any 19 | errors the tuple members will be returned as None. 20 | :rtype: (QgsApplication, CANVAS, IFACE, PARENT) 21 | 22 | If QGIS is already running the handle to that app will be returned. 23 | """ 24 | 25 | try: 26 | from PyQt4 import QtGui, QtCore 27 | from qgis.core import QgsApplication 28 | from qgis.gui import QgsMapCanvas 29 | from qgis_interface import QgisInterface 30 | except ImportError: 31 | return None, None, None, None 32 | 33 | global QGIS_APP # pylint: disable=W0603 34 | 35 | if QGIS_APP is None: 36 | gui_flag = True # All test will run qgis in gui mode 37 | #noinspection PyPep8Naming 38 | QGIS_APP = QgsApplication(sys.argv, gui_flag) 39 | # Make sure QGIS_PREFIX_PATH is set in your env if needed! 40 | QGIS_APP.initQgis() 41 | s = QGIS_APP.showSettings() 42 | LOGGER.debug(s) 43 | 44 | global PARENT # pylint: disable=W0603 45 | if PARENT is None: 46 | #noinspection PyPep8Naming 47 | PARENT = QtGui.QWidget() 48 | 49 | global CANVAS # pylint: disable=W0603 50 | if CANVAS is None: 51 | #noinspection PyPep8Naming 52 | CANVAS = QgsMapCanvas(PARENT) 53 | CANVAS.resize(QtCore.QSize(400, 400)) 54 | 55 | global IFACE # pylint: disable=W0603 56 | if IFACE is None: 57 | # QgisInterface is a stub implementation of the QGIS plugin interface 58 | #noinspection PyPep8Naming 59 | IFACE = QgisInterface(CANVAS) 60 | 61 | return QGIS_APP, CANVAS, IFACE, PARENT 62 | -------------------------------------------------------------------------------- /charla_10/PyQGIS-GPULLab-Coruña-20160413.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_10/PyQGIS-GPULLab-Coruña-20160413.pdf -------------------------------------------------------------------------------- /charla_11/LICENSE: -------------------------------------------------------------------------------- 1 | Licencia y reconocimientos 2 | 3 | Los logotipos son propiedad de sus respectivas empresas y asociaciones. 4 | 5 | reveal.js tiene licencia MIT con Copyright (C) 2016 Hakim El Hattab, http://hakim.se 6 | https://github.com/hakimel/reveal.js/blob/master/LICENSE 7 | 8 | Licencia 9 | 10 | Creative Commons BY-SA. 11 | 12 | Autores 13 | 14 | Francisco Maseda Muiño 15 | Javier Gómez Rodríguez 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /charla_11/README.md: -------------------------------------------------------------------------------- 1 | # Charla 11: Introducción á containerización e Docker 2 | 3 | ## Guión 4 | 5 | ### Parte teórica 6 | 7 | Onde se fala do impacto que a nova técnica da virtualización con containers ten na arquitecturación dos sistemas e no desenvolvemento de software. 8 | 9 | - Introducción 10 | - Containers en cifras 11 | - Unha visión clásica dos SO 12 | - Funcións do SO 13 | - Procesos e ficheiros 14 | - Limitacións do SO tradicional 15 | - Virtualización 16 | - Concepto 17 | - Problemas da virtualización 18 | - Containerización 19 | - Concepto 20 | - Os namespaces: o corazón dos containers 21 | - Docker 22 | - Presentación 23 | - Fundamentos: as imaxes e os containers 24 | - Conclusións 25 | 26 | ### Parte práctica 27 | 28 | - Historia de Docker 29 | - 12 factors app 30 | - Docker toolbox 31 | - Docker Engine 32 | - Comandos básicos 33 | - Práctica: correndo unha aplicación 34 | - Dockerfile e docker build 35 | - Docker compose 36 | - Práctica: correndo unha app en varios containers 37 | 38 | ## Recursos: 39 | 40 | - [Slides sobre containerización e docker](pdf/containerizacion_con_docker.pdf) 41 | - [Introduccion a docker, exemplos prácticos](pdf/docker_intro.pdf) 42 | 43 | -------------------------------------------------------------------------------- /charla_11/css/print/paper.css: -------------------------------------------------------------------------------- 1 | /* Default Print Stylesheet Template 2 | by Rob Glazebrook of CSSnewbie.com 3 | Last Updated: June 4, 2008 4 | 5 | Feel free (nay, compelled) to edit, append, and 6 | manipulate this file as you see fit. */ 7 | 8 | 9 | @media print { 10 | 11 | /* SECTION 1: Set default width, margin, float, and 12 | background. This prevents elements from extending 13 | beyond the edge of the printed page, and prevents 14 | unnecessary background images from printing */ 15 | html { 16 | background: #fff; 17 | width: auto; 18 | height: auto; 19 | overflow: visible; 20 | } 21 | body { 22 | background: #fff; 23 | font-size: 20pt; 24 | width: auto; 25 | height: auto; 26 | border: 0; 27 | margin: 0 5%; 28 | padding: 0; 29 | overflow: visible; 30 | float: none !important; 31 | } 32 | 33 | /* SECTION 2: Remove any elements not needed in print. 34 | This would include navigation, ads, sidebars, etc. */ 35 | .nestedarrow, 36 | .controls, 37 | .fork-reveal, 38 | .share-reveal, 39 | .state-background, 40 | .reveal .progress, 41 | .reveal .backgrounds { 42 | display: none !important; 43 | } 44 | 45 | /* SECTION 3: Set body font face, size, and color. 46 | Consider using a serif font for readability. */ 47 | body, p, td, li, div { 48 | font-size: 20pt!important; 49 | font-family: Georgia, "Times New Roman", Times, serif !important; 50 | color: #000; 51 | } 52 | 53 | /* SECTION 4: Set heading font face, sizes, and color. 54 | Differentiate your headings from your body text. 55 | Perhaps use a large sans-serif for distinction. */ 56 | h1,h2,h3,h4,h5,h6 { 57 | color: #000!important; 58 | height: auto; 59 | line-height: normal; 60 | font-family: Georgia, "Times New Roman", Times, serif !important; 61 | text-shadow: 0 0 0 #000 !important; 62 | text-align: left; 63 | letter-spacing: normal; 64 | } 65 | /* Need to reduce the size of the fonts for printing */ 66 | h1 { font-size: 28pt !important; } 67 | h2 { font-size: 24pt !important; } 68 | h3 { font-size: 22pt !important; } 69 | h4 { font-size: 22pt !important; font-variant: small-caps; } 70 | h5 { font-size: 21pt !important; } 71 | h6 { font-size: 20pt !important; font-style: italic; } 72 | 73 | /* SECTION 5: Make hyperlinks more usable. 74 | Ensure links are underlined, and consider appending 75 | the URL to the end of the link for usability. */ 76 | a:link, 77 | a:visited { 78 | color: #000 !important; 79 | font-weight: bold; 80 | text-decoration: underline; 81 | } 82 | /* 83 | .reveal a:link:after, 84 | .reveal a:visited:after { 85 | content: " (" attr(href) ") "; 86 | color: #222 !important; 87 | font-size: 90%; 88 | } 89 | */ 90 | 91 | 92 | /* SECTION 6: more reveal.js specific additions by @skypanther */ 93 | ul, ol, div, p { 94 | visibility: visible; 95 | position: static; 96 | width: auto; 97 | height: auto; 98 | display: block; 99 | overflow: visible; 100 | margin: 0; 101 | text-align: left !important; 102 | } 103 | .reveal pre, 104 | .reveal table { 105 | margin-left: 0; 106 | margin-right: 0; 107 | } 108 | .reveal pre code { 109 | padding: 20px; 110 | border: 1px solid #ddd; 111 | } 112 | .reveal blockquote { 113 | margin: 20px 0; 114 | } 115 | .reveal .slides { 116 | position: static !important; 117 | width: auto !important; 118 | height: auto !important; 119 | 120 | left: 0 !important; 121 | top: 0 !important; 122 | margin-left: 0 !important; 123 | margin-top: 0 !important; 124 | padding: 0 !important; 125 | zoom: 1 !important; 126 | 127 | overflow: visible !important; 128 | display: block !important; 129 | 130 | text-align: left !important; 131 | -webkit-perspective: none; 132 | -moz-perspective: none; 133 | -ms-perspective: none; 134 | perspective: none; 135 | 136 | -webkit-perspective-origin: 50% 50%; 137 | -moz-perspective-origin: 50% 50%; 138 | -ms-perspective-origin: 50% 50%; 139 | perspective-origin: 50% 50%; 140 | } 141 | .reveal .slides section { 142 | visibility: visible !important; 143 | position: static !important; 144 | width: auto !important; 145 | height: auto !important; 146 | display: block !important; 147 | overflow: visible !important; 148 | 149 | left: 0 !important; 150 | top: 0 !important; 151 | margin-left: 0 !important; 152 | margin-top: 0 !important; 153 | padding: 60px 20px !important; 154 | z-index: auto !important; 155 | 156 | opacity: 1 !important; 157 | 158 | page-break-after: always !important; 159 | 160 | -webkit-transform-style: flat !important; 161 | -moz-transform-style: flat !important; 162 | -ms-transform-style: flat !important; 163 | transform-style: flat !important; 164 | 165 | -webkit-transform: none !important; 166 | -moz-transform: none !important; 167 | -ms-transform: none !important; 168 | transform: none !important; 169 | 170 | -webkit-transition: none !important; 171 | -moz-transition: none !important; 172 | -ms-transition: none !important; 173 | transition: none !important; 174 | } 175 | .reveal .slides section.stack { 176 | padding: 0 !important; 177 | } 178 | .reveal section:last-of-type { 179 | page-break-after: avoid !important; 180 | } 181 | .reveal section .fragment { 182 | opacity: 1 !important; 183 | visibility: visible !important; 184 | 185 | -webkit-transform: none !important; 186 | -moz-transform: none !important; 187 | -ms-transform: none !important; 188 | transform: none !important; 189 | } 190 | .reveal section img { 191 | display: block; 192 | margin: 15px 0px; 193 | background: rgba(255,255,255,1); 194 | border: 1px solid #666; 195 | box-shadow: none; 196 | } 197 | 198 | .reveal section small { 199 | font-size: 0.8em; 200 | } 201 | 202 | } -------------------------------------------------------------------------------- /charla_11/css/print/pdf.css: -------------------------------------------------------------------------------- 1 | /** 2 | * This stylesheet is used to print reveal.js 3 | * presentations to PDF. 4 | * 5 | * https://github.com/hakimel/reveal.js#pdf-export 6 | */ 7 | 8 | * { 9 | -webkit-print-color-adjust: exact; 10 | } 11 | 12 | body { 13 | margin: 0 auto !important; 14 | border: 0; 15 | padding: 0; 16 | float: none !important; 17 | overflow: visible; 18 | } 19 | 20 | html { 21 | width: 100%; 22 | height: 100%; 23 | overflow: visible; 24 | } 25 | 26 | /* Remove any elements not needed in print. */ 27 | .nestedarrow, 28 | .reveal .controls, 29 | .reveal .progress, 30 | .reveal .playback, 31 | .reveal.overview, 32 | .fork-reveal, 33 | .share-reveal, 34 | .state-background { 35 | display: none !important; 36 | } 37 | 38 | h1, h2, h3, h4, h5, h6 { 39 | text-shadow: 0 0 0 #000 !important; 40 | } 41 | 42 | .reveal pre code { 43 | overflow: hidden !important; 44 | font-family: Courier, 'Courier New', monospace !important; 45 | } 46 | 47 | ul, ol, div, p { 48 | visibility: visible; 49 | position: static; 50 | width: auto; 51 | height: auto; 52 | display: block; 53 | overflow: visible; 54 | margin: auto; 55 | } 56 | .reveal { 57 | width: auto !important; 58 | height: auto !important; 59 | overflow: hidden !important; 60 | } 61 | .reveal .slides { 62 | position: static; 63 | width: 100%; 64 | height: auto; 65 | 66 | left: auto; 67 | top: auto; 68 | margin: 0 !important; 69 | padding: 0 !important; 70 | 71 | overflow: visible; 72 | display: block; 73 | 74 | -webkit-perspective: none; 75 | -moz-perspective: none; 76 | -ms-perspective: none; 77 | perspective: none; 78 | 79 | -webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */ 80 | -moz-perspective-origin: 50% 50%; 81 | -ms-perspective-origin: 50% 50%; 82 | perspective-origin: 50% 50%; 83 | } 84 | 85 | .reveal .slides section { 86 | page-break-after: always !important; 87 | 88 | visibility: visible !important; 89 | position: relative !important; 90 | display: block !important; 91 | position: relative !important; 92 | 93 | margin: 0 !important; 94 | padding: 0 !important; 95 | box-sizing: border-box !important; 96 | min-height: 1px; 97 | 98 | opacity: 1 !important; 99 | 100 | -webkit-transform-style: flat !important; 101 | -moz-transform-style: flat !important; 102 | -ms-transform-style: flat !important; 103 | transform-style: flat !important; 104 | 105 | -webkit-transform: none !important; 106 | -moz-transform: none !important; 107 | -ms-transform: none !important; 108 | transform: none !important; 109 | } 110 | 111 | .reveal section.stack { 112 | margin: 0 !important; 113 | padding: 0 !important; 114 | page-break-after: avoid !important; 115 | height: auto !important; 116 | min-height: auto !important; 117 | } 118 | 119 | .reveal img { 120 | box-shadow: none; 121 | } 122 | 123 | .reveal .roll { 124 | overflow: visible; 125 | line-height: 1em; 126 | } 127 | 128 | /* Slide backgrounds are placed inside of their slide when exporting to PDF */ 129 | .reveal section .slide-background { 130 | display: block !important; 131 | position: absolute; 132 | top: 0; 133 | left: 0; 134 | width: 100%; 135 | z-index: -1; 136 | } 137 | 138 | /* All elements should be above the slide-background */ 139 | .reveal section>* { 140 | position: relative; 141 | z-index: 1; 142 | } 143 | 144 | /* Display slide speaker notes when 'showNotes' is enabled */ 145 | .reveal .speaker-notes-pdf { 146 | display: block; 147 | width: 100%; 148 | max-height: none; 149 | left: auto; 150 | top: auto; 151 | z-index: 100; 152 | } 153 | 154 | /* Display slide numbers when 'slideNumber' is enabled */ 155 | .reveal .slide-number-pdf { 156 | display: block; 157 | position: absolute; 158 | font-size: 14px; 159 | } 160 | 161 | -------------------------------------------------------------------------------- /charla_11/css/theme/README.md: -------------------------------------------------------------------------------- 1 | ## Dependencies 2 | 3 | Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup 4 | 5 | ## Creating a Theme 6 | 7 | To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`. 8 | 9 | Each theme file does four things in the following order: 10 | 11 | 1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)** 12 | Shared utility functions. 13 | 14 | 2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)** 15 | Declares a set of custom variables that the template file (step 4) expects. Can be overridden in step 3. 16 | 17 | 3. **Override** 18 | This is where you override the default theme. Either by specifying variables (see [settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss) for reference) or by adding any selectors and styles you please. 19 | 20 | 4. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)** 21 | The template theme file which will generate final CSS output based on the currently defined variables. 22 | -------------------------------------------------------------------------------- /charla_11/css/theme/source/beige.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Beige theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | 15 | // Include theme-specific fonts 16 | @import url(../../lib/font/league-gothic/league-gothic.css); 17 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 18 | 19 | 20 | // Override theme settings (see ../template/settings.scss) 21 | $mainColor: #333; 22 | $headingColor: #333; 23 | $headingTextShadow: none; 24 | $backgroundColor: #f7f3de; 25 | $linkColor: #8b743d; 26 | $linkColorHover: lighten( $linkColor, 20% ); 27 | $selectionBackgroundColor: rgba(79, 64, 28, 0.99); 28 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 29 | 30 | // Background generator 31 | @mixin bodyBackground() { 32 | @include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) ); 33 | } 34 | 35 | 36 | 37 | // Theme template ------------------------------ 38 | @import "../template/theme"; 39 | // --------------------------------------------- -------------------------------------------------------------------------------- /charla_11/css/theme/source/black.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. This is the opposite of the 'white' theme. 3 | * 4 | * By Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css); 16 | 17 | 18 | // Override theme settings (see ../template/settings.scss) 19 | $backgroundColor: #222; 20 | 21 | $mainColor: #fff; 22 | $headingColor: #fff; 23 | 24 | $mainFontSize: 38px; 25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif; 26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif; 27 | $headingTextShadow: none; 28 | $headingLetterSpacing: normal; 29 | $headingTextTransform: uppercase; 30 | $headingFontWeight: 600; 31 | $linkColor: #42affa; 32 | $linkColorHover: lighten( $linkColor, 15% ); 33 | $selectionBackgroundColor: lighten( $linkColor, 25% ); 34 | 35 | $heading1Size: 2.5em; 36 | $heading2Size: 1.6em; 37 | $heading3Size: 1.3em; 38 | $heading4Size: 1.0em; 39 | 40 | section.has-light-background { 41 | &, h1, h2, h3, h4, h5, h6 { 42 | color: #222; 43 | } 44 | } 45 | 46 | 47 | // Theme template ------------------------------ 48 | @import "../template/theme"; 49 | // --------------------------------------------- -------------------------------------------------------------------------------- /charla_11/css/theme/source/blood.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Blood theme for reveal.js 3 | * Author: Walther http://github.com/Walther 4 | * 5 | * Designed to be used with highlight.js theme 6 | * "monokai_sublime.css" available from 7 | * https://github.com/isagalaev/highlight.js/ 8 | * 9 | * For other themes, change $codeBackground accordingly. 10 | * 11 | */ 12 | 13 | // Default mixins and settings ----------------- 14 | @import "../template/mixins"; 15 | @import "../template/settings"; 16 | // --------------------------------------------- 17 | 18 | // Include theme-specific fonts 19 | 20 | @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic); 21 | 22 | // Colors used in the theme 23 | $blood: #a23; 24 | $coal: #222; 25 | $codeBackground: #23241f; 26 | 27 | $backgroundColor: $coal; 28 | 29 | // Main text 30 | $mainFont: Ubuntu, 'sans-serif'; 31 | $mainFontSize: 36px; 32 | $mainColor: #eee; 33 | 34 | // Headings 35 | $headingFont: Ubuntu, 'sans-serif'; 36 | $headingTextShadow: 2px 2px 2px $coal; 37 | 38 | // h1 shadow, borrowed humbly from 39 | // (c) Default theme by Hakim El Hattab 40 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 41 | 42 | // Links 43 | $linkColor: $blood; 44 | $linkColorHover: lighten( $linkColor, 20% ); 45 | 46 | // Text selection 47 | $selectionBackgroundColor: $blood; 48 | $selectionColor: #fff; 49 | 50 | 51 | // Theme template ------------------------------ 52 | @import "../template/theme"; 53 | // --------------------------------------------- 54 | 55 | // some overrides after theme template import 56 | 57 | .reveal p { 58 | font-weight: 300; 59 | text-shadow: 1px 1px $coal; 60 | } 61 | 62 | .reveal h1, 63 | .reveal h2, 64 | .reveal h3, 65 | .reveal h4, 66 | .reveal h5, 67 | .reveal h6 { 68 | font-weight: 700; 69 | } 70 | 71 | .reveal p code { 72 | background-color: $codeBackground; 73 | display: inline-block; 74 | border-radius: 7px; 75 | } 76 | 77 | .reveal small code { 78 | vertical-align: baseline; 79 | } -------------------------------------------------------------------------------- /charla_11/css/theme/source/league.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * League theme for reveal.js. 3 | * 4 | * This was the default theme pre-3.0.0. 5 | * 6 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | 9 | 10 | // Default mixins and settings ----------------- 11 | @import "../template/mixins"; 12 | @import "../template/settings"; 13 | // --------------------------------------------- 14 | 15 | 16 | 17 | // Include theme-specific fonts 18 | @import url(../../lib/font/league-gothic/league-gothic.css); 19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 20 | 21 | // Override theme settings (see ../template/settings.scss) 22 | $headingTextShadow: 0px 0px 6px rgba(0,0,0,0.2); 23 | $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15); 24 | 25 | // Background generator 26 | @mixin bodyBackground() { 27 | @include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) ); 28 | } 29 | 30 | 31 | 32 | // Theme template ------------------------------ 33 | @import "../template/theme"; 34 | // --------------------------------------------- -------------------------------------------------------------------------------- /charla_11/css/theme/source/moon.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Solarized Dark theme for reveal.js. 3 | * Author: Achim Staebler 4 | */ 5 | 6 | 7 | // Default mixins and settings ----------------- 8 | @import "../template/mixins"; 9 | @import "../template/settings"; 10 | // --------------------------------------------- 11 | 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/league-gothic/league-gothic.css); 16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 17 | 18 | /** 19 | * Solarized colors by Ethan Schoonover 20 | */ 21 | html * { 22 | color-profile: sRGB; 23 | rendering-intent: auto; 24 | } 25 | 26 | // Solarized colors 27 | $base03: #002b36; 28 | $base02: #073642; 29 | $base01: #586e75; 30 | $base00: #657b83; 31 | $base0: #839496; 32 | $base1: #93a1a1; 33 | $base2: #eee8d5; 34 | $base3: #fdf6e3; 35 | $yellow: #b58900; 36 | $orange: #cb4b16; 37 | $red: #dc322f; 38 | $magenta: #d33682; 39 | $violet: #6c71c4; 40 | $blue: #268bd2; 41 | $cyan: #2aa198; 42 | $green: #859900; 43 | 44 | // Override theme settings (see ../template/settings.scss) 45 | $mainColor: $base1; 46 | $headingColor: $base2; 47 | $headingTextShadow: none; 48 | $backgroundColor: $base03; 49 | $linkColor: $blue; 50 | $linkColorHover: lighten( $linkColor, 20% ); 51 | $selectionBackgroundColor: $magenta; 52 | 53 | 54 | 55 | // Theme template ------------------------------ 56 | @import "../template/theme"; 57 | // --------------------------------------------- 58 | -------------------------------------------------------------------------------- /charla_11/css/theme/source/night.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Black theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(https://fonts.googleapis.com/css?family=Montserrat:700); 16 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic); 17 | 18 | 19 | // Override theme settings (see ../template/settings.scss) 20 | $backgroundColor: #111; 21 | 22 | $mainFont: 'Open Sans', sans-serif; 23 | $linkColor: #e7ad52; 24 | $linkColorHover: lighten( $linkColor, 20% ); 25 | $headingFont: 'Montserrat', Impact, sans-serif; 26 | $headingTextShadow: none; 27 | $headingLetterSpacing: -0.03em; 28 | $headingTextTransform: none; 29 | $selectionBackgroundColor: #e7ad52; 30 | $mainFontSize: 30px; 31 | 32 | 33 | // Theme template ------------------------------ 34 | @import "../template/theme"; 35 | // --------------------------------------------- -------------------------------------------------------------------------------- /charla_11/css/theme/source/serif.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple theme for reveal.js presentations, similar 3 | * to the default theme. The accent color is brown. 4 | * 5 | * This theme is Copyright (C) 2012-2013 Owen Versteeg, http://owenversteeg.com - it is MIT licensed. 6 | */ 7 | 8 | 9 | // Default mixins and settings ----------------- 10 | @import "../template/mixins"; 11 | @import "../template/settings"; 12 | // --------------------------------------------- 13 | 14 | 15 | 16 | // Override theme settings (see ../template/settings.scss) 17 | $mainFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; 18 | $mainColor: #000; 19 | $headingFont: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif; 20 | $headingColor: #383D3D; 21 | $headingTextShadow: none; 22 | $headingTextTransform: none; 23 | $backgroundColor: #F0F1EB; 24 | $linkColor: #51483D; 25 | $linkColorHover: lighten( $linkColor, 20% ); 26 | $selectionBackgroundColor: #26351C; 27 | 28 | .reveal a { 29 | line-height: 1.3em; 30 | } 31 | 32 | 33 | // Theme template ------------------------------ 34 | @import "../template/theme"; 35 | // --------------------------------------------- 36 | -------------------------------------------------------------------------------- /charla_11/css/theme/source/simple.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * A simple theme for reveal.js presentations, similar 3 | * to the default theme. The accent color is darkblue. 4 | * 5 | * This theme is Copyright (C) 2012 Owen Versteeg, https://github.com/StereotypicalApps. It is MIT licensed. 6 | * reveal.js is Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 7 | */ 8 | 9 | 10 | // Default mixins and settings ----------------- 11 | @import "../template/mixins"; 12 | @import "../template/settings"; 13 | // --------------------------------------------- 14 | 15 | 16 | 17 | // Include theme-specific fonts 18 | @import url(https://fonts.googleapis.com/css?family=News+Cycle:400,700); 19 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 20 | 21 | 22 | // Override theme settings (see ../template/settings.scss) 23 | $mainFont: 'Lato', sans-serif; 24 | $mainColor: #000; 25 | $headingFont: 'News Cycle', Impact, sans-serif; 26 | $headingColor: #000; 27 | $headingTextShadow: none; 28 | $headingTextTransform: none; 29 | $backgroundColor: #fff; 30 | $linkColor: #00008B; 31 | $linkColorHover: lighten( $linkColor, 20% ); 32 | $selectionBackgroundColor: rgba(0, 0, 0, 0.99); 33 | 34 | 35 | 36 | // Theme template ------------------------------ 37 | @import "../template/theme"; 38 | // --------------------------------------------- -------------------------------------------------------------------------------- /charla_11/css/theme/source/sky.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Sky theme for reveal.js. 3 | * 4 | * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | 15 | // Include theme-specific fonts 16 | @import url(https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic); 17 | @import url(https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700); 18 | 19 | 20 | // Override theme settings (see ../template/settings.scss) 21 | $mainFont: 'Open Sans', sans-serif; 22 | $mainColor: #333; 23 | $headingFont: 'Quicksand', sans-serif; 24 | $headingColor: #333; 25 | $headingLetterSpacing: -0.08em; 26 | $headingTextShadow: none; 27 | $backgroundColor: #f7fbfc; 28 | $linkColor: #3b759e; 29 | $linkColorHover: lighten( $linkColor, 20% ); 30 | $selectionBackgroundColor: #134674; 31 | 32 | // Fix links so they are not cut off 33 | .reveal a { 34 | line-height: 1.3em; 35 | } 36 | 37 | // Background generator 38 | @mixin bodyBackground() { 39 | @include radial-gradient( #add9e4, #f7fbfc ); 40 | } 41 | 42 | 43 | 44 | // Theme template ------------------------------ 45 | @import "../template/theme"; 46 | // --------------------------------------------- 47 | -------------------------------------------------------------------------------- /charla_11/css/theme/source/solarized.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * Solarized Light theme for reveal.js. 3 | * Author: Achim Staebler 4 | */ 5 | 6 | 7 | // Default mixins and settings ----------------- 8 | @import "../template/mixins"; 9 | @import "../template/settings"; 10 | // --------------------------------------------- 11 | 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/league-gothic/league-gothic.css); 16 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 17 | 18 | 19 | /** 20 | * Solarized colors by Ethan Schoonover 21 | */ 22 | html * { 23 | color-profile: sRGB; 24 | rendering-intent: auto; 25 | } 26 | 27 | // Solarized colors 28 | $base03: #002b36; 29 | $base02: #073642; 30 | $base01: #586e75; 31 | $base00: #657b83; 32 | $base0: #839496; 33 | $base1: #93a1a1; 34 | $base2: #eee8d5; 35 | $base3: #fdf6e3; 36 | $yellow: #b58900; 37 | $orange: #cb4b16; 38 | $red: #dc322f; 39 | $magenta: #d33682; 40 | $violet: #6c71c4; 41 | $blue: #268bd2; 42 | $cyan: #2aa198; 43 | $green: #859900; 44 | 45 | // Override theme settings (see ../template/settings.scss) 46 | $mainColor: $base00; 47 | $headingColor: $base01; 48 | $headingTextShadow: none; 49 | $backgroundColor: $base3; 50 | $linkColor: $blue; 51 | $linkColorHover: lighten( $linkColor, 20% ); 52 | $selectionBackgroundColor: $magenta; 53 | 54 | // Background generator 55 | // @mixin bodyBackground() { 56 | // @include radial-gradient( rgba($base3,1), rgba(lighten($base3, 20%),1) ); 57 | // } 58 | 59 | 60 | 61 | // Theme template ------------------------------ 62 | @import "../template/theme"; 63 | // --------------------------------------------- 64 | -------------------------------------------------------------------------------- /charla_11/css/theme/source/white.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * White theme for reveal.js. This is the opposite of the 'black' theme. 3 | * 4 | * By Hakim El Hattab, http://hakim.se 5 | */ 6 | 7 | 8 | // Default mixins and settings ----------------- 9 | @import "../template/mixins"; 10 | @import "../template/settings"; 11 | // --------------------------------------------- 12 | 13 | 14 | // Include theme-specific fonts 15 | @import url(../../lib/font/source-sans-pro/source-sans-pro.css); 16 | 17 | 18 | // Override theme settings (see ../template/settings.scss) 19 | $backgroundColor: #fff; 20 | 21 | $mainColor: #222; 22 | $headingColor: #222; 23 | 24 | $mainFontSize: 38px; 25 | $mainFont: 'Source Sans Pro', Helvetica, sans-serif; 26 | $headingFont: 'Source Sans Pro', Helvetica, sans-serif; 27 | $headingTextShadow: none; 28 | $headingLetterSpacing: normal; 29 | $headingTextTransform: uppercase; 30 | $headingFontWeight: 600; 31 | $linkColor: #2a76dd; 32 | $linkColorHover: lighten( $linkColor, 15% ); 33 | $selectionBackgroundColor: lighten( $linkColor, 25% ); 34 | 35 | $heading1Size: 2.5em; 36 | $heading2Size: 1.6em; 37 | $heading3Size: 1.3em; 38 | $heading4Size: 1.0em; 39 | 40 | section.has-dark-background { 41 | &, h1, h2, h3, h4, h5, h6 { 42 | color: #fff; 43 | } 44 | } 45 | 46 | 47 | // Theme template ------------------------------ 48 | @import "../template/theme"; 49 | // --------------------------------------------- -------------------------------------------------------------------------------- /charla_11/css/theme/template/mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin vertical-gradient( $top, $bottom ) { 2 | background: $top; 3 | background: -moz-linear-gradient( top, $top 0%, $bottom 100% ); 4 | background: -webkit-gradient( linear, left top, left bottom, color-stop(0%,$top), color-stop(100%,$bottom) ); 5 | background: -webkit-linear-gradient( top, $top 0%, $bottom 100% ); 6 | background: -o-linear-gradient( top, $top 0%, $bottom 100% ); 7 | background: -ms-linear-gradient( top, $top 0%, $bottom 100% ); 8 | background: linear-gradient( top, $top 0%, $bottom 100% ); 9 | } 10 | 11 | @mixin horizontal-gradient( $top, $bottom ) { 12 | background: $top; 13 | background: -moz-linear-gradient( left, $top 0%, $bottom 100% ); 14 | background: -webkit-gradient( linear, left top, right top, color-stop(0%,$top), color-stop(100%,$bottom) ); 15 | background: -webkit-linear-gradient( left, $top 0%, $bottom 100% ); 16 | background: -o-linear-gradient( left, $top 0%, $bottom 100% ); 17 | background: -ms-linear-gradient( left, $top 0%, $bottom 100% ); 18 | background: linear-gradient( left, $top 0%, $bottom 100% ); 19 | } 20 | 21 | @mixin radial-gradient( $outer, $inner, $type: circle ) { 22 | background: $outer; 23 | background: -moz-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 24 | background: -webkit-gradient( radial, center center, 0px, center center, 100%, color-stop(0%,$inner), color-stop(100%,$outer) ); 25 | background: -webkit-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 26 | background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 27 | background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 28 | background: radial-gradient( center, $type cover, $inner 0%, $outer 100% ); 29 | } -------------------------------------------------------------------------------- /charla_11/css/theme/template/settings.scss: -------------------------------------------------------------------------------- 1 | // Base settings for all themes that can optionally be 2 | // overridden by the super-theme 3 | 4 | // Background of the presentation 5 | $backgroundColor: #2b2b2b; 6 | 7 | // Primary/body text 8 | $mainFont: 'Lato', sans-serif; 9 | $mainFontSize: 36px; 10 | $mainColor: #eee; 11 | 12 | // Vertical spacing between blocks of text 13 | $blockMargin: 20px; 14 | 15 | // Headings 16 | $headingMargin: 0 0 $blockMargin 0; 17 | $headingFont: 'League Gothic', Impact, sans-serif; 18 | $headingColor: #eee; 19 | $headingLineHeight: 1.2; 20 | $headingLetterSpacing: normal; 21 | $headingTextTransform: uppercase; 22 | $headingTextShadow: none; 23 | $headingFontWeight: normal; 24 | $heading1TextShadow: $headingTextShadow; 25 | 26 | $heading1Size: 3.77em; 27 | $heading2Size: 2.11em; 28 | $heading3Size: 1.55em; 29 | $heading4Size: 1.00em; 30 | 31 | // Links and actions 32 | $linkColor: #13DAEC; 33 | $linkColorHover: lighten( $linkColor, 20% ); 34 | 35 | // Text selection 36 | $selectionBackgroundColor: #FF5E99; 37 | $selectionColor: #fff; 38 | 39 | // Generates the presentation background, can be overridden 40 | // to return a background image or gradient 41 | @mixin bodyBackground() { 42 | background: $backgroundColor; 43 | } -------------------------------------------------------------------------------- /charla_11/lib/css/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /charla_11/lib/font/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /charla_11/lib/font/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('league-gothic.eot'); 4 | src: url('league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('league-gothic.woff') format('woff'), 6 | url('league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } -------------------------------------------------------------------------------- /charla_11/lib/font/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /charla_11/lib/font/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /charla_11/lib/font/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License 2 | 3 | Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 4 | 5 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 6 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 7 | 8 | —————————————————————————————- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | —————————————————————————————- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. 14 | 15 | The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. 16 | 17 | DEFINITIONS 18 | “Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. 19 | 20 | “Reserved Font Name” refers to any names specified as such after the copyright statement(s). 21 | 22 | “Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s). 23 | 24 | “Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. 25 | 26 | “Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. 27 | 28 | PERMISSION & CONDITIONS 29 | Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 30 | 31 | 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 32 | 33 | 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 34 | 35 | 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 36 | 37 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 38 | 39 | 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. 40 | 41 | TERMINATION 42 | This license becomes null and void if any of the above conditions are not met. 43 | 44 | DISCLAIMER 45 | THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_11/lib/font/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /charla_11/lib/font/source-sans-pro/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | src: url('source-sans-pro-regular.eot'); 4 | src: url('source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), 5 | url('source-sans-pro-regular.woff') format('woff'), 6 | url('source-sans-pro-regular.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Source Sans Pro'; 13 | src: url('source-sans-pro-italic.eot'); 14 | src: url('source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), 15 | url('source-sans-pro-italic.woff') format('woff'), 16 | url('source-sans-pro-italic.ttf') format('truetype'); 17 | font-weight: normal; 18 | font-style: italic; 19 | } 20 | 21 | @font-face { 22 | font-family: 'Source Sans Pro'; 23 | src: url('source-sans-pro-semibold.eot'); 24 | src: url('source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), 25 | url('source-sans-pro-semibold.woff') format('woff'), 26 | url('source-sans-pro-semibold.ttf') format('truetype'); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: 'Source Sans Pro'; 33 | src: url('source-sans-pro-semibolditalic.eot'); 34 | src: url('source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), 35 | url('source-sans-pro-semibolditalic.woff') format('woff'), 36 | url('source-sans-pro-semibolditalic.ttf') format('truetype'); 37 | font-weight: 600; 38 | font-style: italic; 39 | } -------------------------------------------------------------------------------- /charla_11/lib/js/classList.js: -------------------------------------------------------------------------------- 1 | /*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ 2 | if(typeof document!=="undefined"&&!("classList" in document.createElement("a"))){(function(j){var a="classList",f="prototype",m=(j.HTMLElement||j.Element)[f],b=Object,k=String[f].trim||function(){return this.replace(/^\s+|\s+$/g,"")},c=Array[f].indexOf||function(q){var p=0,o=this.length;for(;p 2 | 3 | 4 | 5 | 6 | 7 | reveal.js - Markdown Demo 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 |
20 | 21 | 22 |
23 | 24 | 25 |
26 | 36 |
37 | 38 | 39 |
40 | 54 |
55 | 56 | 57 |
58 | 69 |
70 | 71 | 72 |
73 | 77 |
78 | 79 | 80 |
81 | 86 |
87 | 88 | 89 |
90 | 100 |
101 | 102 |
103 |
104 | 105 | 106 | 107 | 108 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /charla_11/plugin/markdown/example.md: -------------------------------------------------------------------------------- 1 | # Markdown Demo 2 | 3 | 4 | 5 | ## External 1.1 6 | 7 | Content 1.1 8 | 9 | Note: This will only appear in the speaker notes window. 10 | 11 | 12 | ## External 1.2 13 | 14 | Content 1.2 15 | 16 | 17 | 18 | ## External 2 19 | 20 | Content 2.1 21 | 22 | 23 | 24 | ## External 3.1 25 | 26 | Content 3.1 27 | 28 | 29 | ## External 3.2 30 | 31 | Content 3.2 32 | -------------------------------------------------------------------------------- /charla_11/plugin/math/math.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax. 4 | * 5 | * @author Hakim El Hattab 6 | */ 7 | var RevealMath = window.RevealMath || (function(){ 8 | 9 | var options = Reveal.getConfig().math || {}; 10 | options.mathjax = options.mathjax || 'https://cdn.mathjax.org/mathjax/latest/MathJax.js'; 11 | options.config = options.config || 'TeX-AMS_HTML-full'; 12 | 13 | loadScript( options.mathjax + '?config=' + options.config, function() { 14 | 15 | MathJax.Hub.Config({ 16 | messageStyle: 'none', 17 | tex2jax: { 18 | inlineMath: [['$','$'],['\\(','\\)']] , 19 | skipTags: ['script','noscript','style','textarea','pre'] 20 | }, 21 | skipStartupTypeset: true 22 | }); 23 | 24 | // Typeset followed by an immediate reveal.js layout since 25 | // the typesetting process could affect slide height 26 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] ); 27 | MathJax.Hub.Queue( Reveal.layout ); 28 | 29 | // Reprocess equations in slides when they turn visible 30 | Reveal.addEventListener( 'slidechanged', function( event ) { 31 | 32 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] ); 33 | 34 | } ); 35 | 36 | } ); 37 | 38 | function loadScript( url, callback ) { 39 | 40 | var head = document.querySelector( 'head' ); 41 | var script = document.createElement( 'script' ); 42 | script.type = 'text/javascript'; 43 | script.src = url; 44 | 45 | // Wrapper for callback to make sure it only fires once 46 | var finish = function() { 47 | if( typeof callback === 'function' ) { 48 | callback.call(); 49 | callback = null; 50 | } 51 | } 52 | 53 | script.onload = finish; 54 | 55 | // IE 56 | script.onreadystatechange = function() { 57 | if ( this.readyState === 'loaded' ) { 58 | finish(); 59 | } 60 | } 61 | 62 | // Normal browsers 63 | head.appendChild( script ); 64 | 65 | } 66 | 67 | })(); 68 | -------------------------------------------------------------------------------- /charla_11/plugin/multiplex/client.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var multiplex = Reveal.getConfig().multiplex; 3 | var socketId = multiplex.id; 4 | var socket = io.connect(multiplex.url); 5 | 6 | socket.on(multiplex.id, function(data) { 7 | // ignore data from sockets that aren't ours 8 | if (data.socketId !== socketId) { return; } 9 | if( window.location.host === 'localhost:1947' ) return; 10 | 11 | Reveal.setState(data.state); 12 | }); 13 | }()); 14 | -------------------------------------------------------------------------------- /charla_11/plugin/multiplex/index.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | var express = require('express'); 3 | var fs = require('fs'); 4 | var io = require('socket.io'); 5 | var crypto = require('crypto'); 6 | 7 | var app = express(); 8 | var staticDir = express.static; 9 | var server = http.createServer(app); 10 | 11 | io = io(server); 12 | 13 | var opts = { 14 | port: process.env.PORT || 1948, 15 | baseDir : __dirname + '/../../' 16 | }; 17 | 18 | io.on( 'connection', function( socket ) { 19 | socket.on('multiplex-statechanged', function(data) { 20 | if (typeof data.secret == 'undefined' || data.secret == null || data.secret === '') return; 21 | if (createHash(data.secret) === data.socketId) { 22 | data.secret = null; 23 | socket.broadcast.emit(data.socketId, data); 24 | }; 25 | }); 26 | }); 27 | 28 | [ 'css', 'js', 'plugin', 'lib' ].forEach(function(dir) { 29 | app.use('/' + dir, staticDir(opts.baseDir + dir)); 30 | }); 31 | 32 | app.get("/", function(req, res) { 33 | res.writeHead(200, {'Content-Type': 'text/html'}); 34 | 35 | var stream = fs.createReadStream(opts.baseDir + '/index.html'); 36 | stream.on('error', function( error ) { 37 | res.write('

reveal.js multiplex server.

Generate token'); 38 | res.end(); 39 | }); 40 | stream.on('readable', function() { 41 | stream.pipe(res); 42 | }); 43 | }); 44 | 45 | app.get("/token", function(req,res) { 46 | var ts = new Date().getTime(); 47 | var rand = Math.floor(Math.random()*9999999); 48 | var secret = ts.toString() + rand.toString(); 49 | res.send({secret: secret, socketId: createHash(secret)}); 50 | }); 51 | 52 | var createHash = function(secret) { 53 | var cipher = crypto.createCipher('blowfish', secret); 54 | return(cipher.final('hex')); 55 | }; 56 | 57 | // Actually listen 58 | server.listen( opts.port || null ); 59 | 60 | var brown = '\033[33m', 61 | green = '\033[32m', 62 | reset = '\033[0m'; 63 | 64 | console.log( brown + "reveal.js:" + reset + " Multiplex running on port " + green + opts.port + reset ); -------------------------------------------------------------------------------- /charla_11/plugin/multiplex/master.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | // Don't emit events from inside of notes windows 4 | if ( window.location.search.match( /receiver/gi ) ) { return; } 5 | 6 | var multiplex = Reveal.getConfig().multiplex; 7 | 8 | var socket = io.connect( multiplex.url ); 9 | 10 | function post() { 11 | 12 | var messageData = { 13 | state: Reveal.getState(), 14 | secret: multiplex.secret, 15 | socketId: multiplex.id 16 | }; 17 | 18 | socket.emit( 'multiplex-statechanged', messageData ); 19 | 20 | }; 21 | 22 | // Monitor events that trigger a change in state 23 | Reveal.addEventListener( 'slidechanged', post ); 24 | Reveal.addEventListener( 'fragmentshown', post ); 25 | Reveal.addEventListener( 'fragmenthidden', post ); 26 | Reveal.addEventListener( 'overviewhidden', post ); 27 | Reveal.addEventListener( 'overviewshown', post ); 28 | Reveal.addEventListener( 'paused', post ); 29 | Reveal.addEventListener( 'resumed', post ); 30 | 31 | }()); -------------------------------------------------------------------------------- /charla_11/plugin/multiplex/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "reveal-js-multiplex", 3 | "version": "1.0.0", 4 | "description": "reveal.js multiplex server", 5 | "homepage": "http://lab.hakim.se/reveal-js", 6 | "scripts": { 7 | "start": "node index.js" 8 | }, 9 | "engines": { 10 | "node": "~4.1.1" 11 | }, 12 | "dependencies": { 13 | "express": "~4.13.3", 14 | "grunt-cli": "~0.1.13", 15 | "mustache": "~2.2.1", 16 | "socket.io": "~1.3.7" 17 | }, 18 | "license": "MIT" 19 | } 20 | -------------------------------------------------------------------------------- /charla_11/plugin/notes-server/client.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | 3 | // don't emit events from inside the previews themselves 4 | if( window.location.search.match( /receiver/gi ) ) { return; } 5 | 6 | var socket = io.connect( window.location.origin ), 7 | socketId = Math.random().toString().slice( 2 ); 8 | 9 | console.log( 'View slide notes at ' + window.location.origin + '/notes/' + socketId ); 10 | 11 | window.open( window.location.origin + '/notes/' + socketId, 'notes-' + socketId ); 12 | 13 | /** 14 | * Posts the current slide data to the notes window 15 | */ 16 | function post() { 17 | 18 | var slideElement = Reveal.getCurrentSlide(), 19 | notesElement = slideElement.querySelector( 'aside.notes' ); 20 | 21 | var messageData = { 22 | notes: '', 23 | markdown: false, 24 | socketId: socketId, 25 | state: Reveal.getState() 26 | }; 27 | 28 | // Look for notes defined in a slide attribute 29 | if( slideElement.hasAttribute( 'data-notes' ) ) { 30 | messageData.notes = slideElement.getAttribute( 'data-notes' ); 31 | } 32 | 33 | // Look for notes defined in an aside element 34 | if( notesElement ) { 35 | messageData.notes = notesElement.innerHTML; 36 | messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; 37 | } 38 | 39 | socket.emit( 'statechanged', messageData ); 40 | 41 | } 42 | 43 | // When a new notes window connects, post our current state 44 | socket.on( 'new-subscriber', function( data ) { 45 | post(); 46 | } ); 47 | 48 | // When the state changes from inside of the speaker view 49 | socket.on( 'statechanged-speaker', function( data ) { 50 | Reveal.setState( data.state ); 51 | } ); 52 | 53 | // Monitor events that trigger a change in state 54 | Reveal.addEventListener( 'slidechanged', post ); 55 | Reveal.addEventListener( 'fragmentshown', post ); 56 | Reveal.addEventListener( 'fragmenthidden', post ); 57 | Reveal.addEventListener( 'overviewhidden', post ); 58 | Reveal.addEventListener( 'overviewshown', post ); 59 | Reveal.addEventListener( 'paused', post ); 60 | Reveal.addEventListener( 'resumed', post ); 61 | 62 | // Post the initial state 63 | post(); 64 | 65 | }()); 66 | -------------------------------------------------------------------------------- /charla_11/plugin/notes-server/index.js: -------------------------------------------------------------------------------- 1 | var http = require('http'); 2 | var express = require('express'); 3 | var fs = require('fs'); 4 | var io = require('socket.io'); 5 | var Mustache = require('mustache'); 6 | 7 | var app = express(); 8 | var staticDir = express.static; 9 | var server = http.createServer(app); 10 | 11 | io = io(server); 12 | 13 | var opts = { 14 | port : 1947, 15 | baseDir : __dirname + '/../../' 16 | }; 17 | 18 | io.on( 'connection', function( socket ) { 19 | 20 | socket.on( 'new-subscriber', function( data ) { 21 | socket.broadcast.emit( 'new-subscriber', data ); 22 | }); 23 | 24 | socket.on( 'statechanged', function( data ) { 25 | delete data.state.overview; 26 | socket.broadcast.emit( 'statechanged', data ); 27 | }); 28 | 29 | socket.on( 'statechanged-speaker', function( data ) { 30 | delete data.state.overview; 31 | socket.broadcast.emit( 'statechanged-speaker', data ); 32 | }); 33 | 34 | }); 35 | 36 | [ 'css', 'js', 'images', 'plugin', 'lib' ].forEach( function( dir ) { 37 | app.use( '/' + dir, staticDir( opts.baseDir + dir ) ); 38 | }); 39 | 40 | app.get('/', function( req, res ) { 41 | 42 | res.writeHead( 200, { 'Content-Type': 'text/html' } ); 43 | fs.createReadStream( opts.baseDir + '/index.html' ).pipe( res ); 44 | 45 | }); 46 | 47 | app.get( '/notes/:socketId', function( req, res ) { 48 | 49 | fs.readFile( opts.baseDir + 'plugin/notes-server/notes.html', function( err, data ) { 50 | res.send( Mustache.to_html( data.toString(), { 51 | socketId : req.params.socketId 52 | })); 53 | }); 54 | 55 | }); 56 | 57 | // Actually listen 58 | server.listen( opts.port || null ); 59 | 60 | var brown = '\033[33m', 61 | green = '\033[32m', 62 | reset = '\033[0m'; 63 | 64 | var slidesLocation = 'http://localhost' + ( opts.port ? ( ':' + opts.port ) : '' ); 65 | 66 | console.log( brown + 'reveal.js - Speaker Notes' + reset ); 67 | console.log( '1. Open the slides at ' + green + slidesLocation + reset ); 68 | console.log( '2. Click on the link in your JS console to go to the notes page' ); 69 | console.log( '3. Advance through your slides and your notes will advance automatically' ); 70 | -------------------------------------------------------------------------------- /charla_11/plugin/notes/notes.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Handles opening of and synchronization with the reveal.js 3 | * notes window. 4 | * 5 | * Handshake process: 6 | * 1. This window posts 'connect' to notes window 7 | * - Includes URL of presentation to show 8 | * 2. Notes window responds with 'connected' when it is available 9 | * 3. This window proceeds to send the current presentation state 10 | * to the notes window 11 | */ 12 | var RevealNotes = (function() { 13 | 14 | function openNotes( notesFilePath ) { 15 | 16 | if( !notesFilePath ) { 17 | var jsFileLocation = document.querySelector('script[src$="notes.js"]').src; // this js file path 18 | jsFileLocation = jsFileLocation.replace(/notes\.js(\?.*)?$/, ''); // the js folder path 19 | notesFilePath = jsFileLocation + 'notes.html'; 20 | } 21 | 22 | var notesPopup = window.open( notesFilePath, 'reveal.js - Notes', 'width=1100,height=700' ); 23 | 24 | /** 25 | * Connect to the notes window through a postmessage handshake. 26 | * Using postmessage enables us to work in situations where the 27 | * origins differ, such as a presentation being opened from the 28 | * file system. 29 | */ 30 | function connect() { 31 | // Keep trying to connect until we get a 'connected' message back 32 | var connectInterval = setInterval( function() { 33 | notesPopup.postMessage( JSON.stringify( { 34 | namespace: 'reveal-notes', 35 | type: 'connect', 36 | url: window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search, 37 | state: Reveal.getState() 38 | } ), '*' ); 39 | }, 500 ); 40 | 41 | window.addEventListener( 'message', function( event ) { 42 | var data = JSON.parse( event.data ); 43 | if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) { 44 | clearInterval( connectInterval ); 45 | onConnected(); 46 | } 47 | } ); 48 | } 49 | 50 | /** 51 | * Posts the current slide data to the notes window 52 | */ 53 | function post() { 54 | 55 | var slideElement = Reveal.getCurrentSlide(), 56 | notesElement = slideElement.querySelector( 'aside.notes' ); 57 | 58 | var messageData = { 59 | namespace: 'reveal-notes', 60 | type: 'state', 61 | notes: '', 62 | markdown: false, 63 | whitespace: 'normal', 64 | state: Reveal.getState() 65 | }; 66 | 67 | // Look for notes defined in a slide attribute 68 | if( slideElement.hasAttribute( 'data-notes' ) ) { 69 | messageData.notes = slideElement.getAttribute( 'data-notes' ); 70 | messageData.whitespace = 'pre-wrap'; 71 | } 72 | 73 | // Look for notes defined in an aside element 74 | if( notesElement ) { 75 | messageData.notes = notesElement.innerHTML; 76 | messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; 77 | } 78 | 79 | notesPopup.postMessage( JSON.stringify( messageData ), '*' ); 80 | 81 | } 82 | 83 | /** 84 | * Called once we have established a connection to the notes 85 | * window. 86 | */ 87 | function onConnected() { 88 | 89 | // Monitor events that trigger a change in state 90 | Reveal.addEventListener( 'slidechanged', post ); 91 | Reveal.addEventListener( 'fragmentshown', post ); 92 | Reveal.addEventListener( 'fragmenthidden', post ); 93 | Reveal.addEventListener( 'overviewhidden', post ); 94 | Reveal.addEventListener( 'overviewshown', post ); 95 | Reveal.addEventListener( 'paused', post ); 96 | Reveal.addEventListener( 'resumed', post ); 97 | 98 | // Post the initial state 99 | post(); 100 | 101 | } 102 | 103 | connect(); 104 | 105 | } 106 | 107 | if( !/receiver/i.test( window.location.search ) ) { 108 | 109 | // If the there's a 'notes' query set, open directly 110 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { 111 | openNotes(); 112 | } 113 | 114 | // Open the notes when the 's' key is hit 115 | document.addEventListener( 'keydown', function( event ) { 116 | // Disregard the event if the target is editable or a 117 | // modifier is present 118 | if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return; 119 | 120 | // Disregard the event if keyboard is disabled 121 | if ( Reveal.getConfig().keyboard === false ) return; 122 | 123 | if( event.keyCode === 83 ) { 124 | event.preventDefault(); 125 | openNotes(); 126 | } 127 | }, false ); 128 | 129 | // Show our keyboard shortcut in the reveal.js help overlay 130 | if( window.Reveal ) Reveal.registerKeyboardShortcut( 'S', 'Speaker notes view' ); 131 | 132 | } 133 | 134 | return { open: openNotes }; 135 | 136 | })(); 137 | -------------------------------------------------------------------------------- /charla_11/plugin/print-pdf/print-pdf.js: -------------------------------------------------------------------------------- 1 | /** 2 | * phantomjs script for printing presentations to PDF. 3 | * 4 | * Example: 5 | * phantomjs print-pdf.js "http://lab.hakim.se/reveal-js?print-pdf" reveal-demo.pdf 6 | * 7 | * By Manuel Bieh (https://github.com/manuelbieh) 8 | */ 9 | 10 | // html2pdf.js 11 | var page = new WebPage(); 12 | var system = require( 'system' ); 13 | 14 | var slideWidth = system.args[3] ? system.args[3].split( 'x' )[0] : 960; 15 | var slideHeight = system.args[3] ? system.args[3].split( 'x' )[1] : 700; 16 | 17 | page.viewportSize = { 18 | width: slideWidth, 19 | height: slideHeight 20 | }; 21 | 22 | // TODO 23 | // Something is wrong with these config values. An input 24 | // paper width of 1920px actually results in a 756px wide 25 | // PDF. 26 | page.paperSize = { 27 | width: Math.round( slideWidth * 2 ), 28 | height: Math.round( slideHeight * 2 ), 29 | border: 0 30 | }; 31 | 32 | var inputFile = system.args[1] || 'index.html?print-pdf'; 33 | var outputFile = system.args[2] || 'slides.pdf'; 34 | 35 | if( outputFile.match( /\.pdf$/gi ) === null ) { 36 | outputFile += '.pdf'; 37 | } 38 | 39 | console.log( 'Printing PDF (Paper size: '+ page.paperSize.width + 'x' + page.paperSize.height +')' ); 40 | 41 | page.open( inputFile, function( status ) { 42 | window.setTimeout( function() { 43 | console.log( 'Printed successfully' ); 44 | page.render( outputFile ); 45 | phantom.exit(); 46 | }, 1000 ); 47 | } ); 48 | 49 | -------------------------------------------------------------------------------- /charla_2/Presentation.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_2/Presentation.odp -------------------------------------------------------------------------------- /charla_2/Presentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_2/Presentation.pdf -------------------------------------------------------------------------------- /charla_2/README.md: -------------------------------------------------------------------------------- 1 | # Charla 2: Introducción a Raspberry Pi 2 | 3 | ## Objetivo 4 | 5 | Aprender a instalar y manejar una Raspberry Pi. También se aprenderá a utilizar el GPIO para encender LEDs o leer sensores. 6 | 7 | ## Guión 8 | 9 | ### Introducción 10 | - ¿Qué es una Raspberry Pi? 11 | - Comparación respecto a un ordenador «normal» 12 | 13 | ### Instalación del sistema (Primera práctica) 14 | - Aprender a instalar un SO (Raspbian) 15 | - Manejo básico del sistema mediante CLI (Command line interface) 16 | - Nociones básicas de apt-get 17 | - Configuración de la red 18 | 19 | ### Introducción al GPIO 20 | - Descripción general 21 | - Descripción de los distintos protocolos soportados 22 | - Encender y apagar un LED desde la cli utilizando la librería [WiringPi](http://wiringpi.com/) (**Segunda práctica**) 23 | - **Tercera práctica**: hacer parpadear un LED, probando a modificar tiempos e incluso patrones, utilizando Python. (Se hará a mayores un mini repaso de Python) 24 | 25 | ### Lectura de sensores 26 | - Descripción de las entradas del GPIO de la Raspberry Pi 27 | - **Cuarta práctica**: leer el estado de un pulsador (pulsado/sin pulsar) 28 | - **Quinta práctica**: leer sensores como por ejemplo PIRs o sensores de efecto Hall. 29 | 30 | En caso de que el tiempo llegase, se realizará una **sexta práctica**, para combinar entradas y salidas. 31 | 32 | ## Presentación 33 | - La presentación puede encontrarse [aquí](Presentation.odp). 34 | 35 | ## Ejemplos de código 36 | - Todos los ejemplos de código están en [este](code/) directorio. 37 | -------------------------------------------------------------------------------- /charla_2/code/button.py: -------------------------------------------------------------------------------- 1 | import RPi.GPIO as GPIO # libreria para los GPIO 2 | import time 3 | 4 | GPIO.setwarnings(False) 5 | GPIO.setmode(GPIO.BCM) 6 | 7 | GPIO.setup(23, GPIO.IN, pull_up_down = GPIO.PUD_UP) # configurar pin como entrada con pull-up 8 | 9 | while 1: # Bucle infinito 10 | print(GPIO.input(23)) # lee y muestra el estado del pin 11 | time.sleep(5) # aguarda medio segundo 12 | -------------------------------------------------------------------------------- /charla_2/code/hall.py: -------------------------------------------------------------------------------- 1 | import RPi.GPIO as GPIO # libreria para los GPIO 2 | import time 3 | 4 | GPIO.setwarnings(False) 5 | GPIO.setmode(GPIO.BCM) 6 | 7 | GPIO.setup(18, GPIO.IN) # configurar pin como entrada 8 | 9 | while 1: # Bucle infinito 10 | if(GPIO.input(18)): # lee el estado del sensor 11 | print("Sensor hall activado") 12 | else: 13 | print("Sensor hall desactivado") 14 | time.sleep(0.5) # aguarda 1 segundo 15 | -------------------------------------------------------------------------------- /charla_2/code/led.py: -------------------------------------------------------------------------------- 1 | import RPi.GPIO as GPIO # libreria para los GPIO 2 | import time 3 | 4 | GPIO.setwarnings(False) 5 | GPIO.setmode(GPIO.BCM) 6 | 7 | GPIO.setup(18, GPIO.OUT) # configurar pin como salida 8 | 9 | while 1: # Bucle infinito 10 | GPIO.output(18, True) # enciende el LED 11 | time.sleep(1) # aguarda 1 segundo 12 | GPIO.output(18, False) # apaga el LED 13 | time.sleep(1) # aguarda 1 segundo 14 | -------------------------------------------------------------------------------- /charla_2/code/pir.py: -------------------------------------------------------------------------------- 1 | import RPi.GPIO as GPIO # libreria para los GPIO 2 | import time 3 | 4 | GPIO.setwarnings(False) 5 | GPIO.setmode(GPIO.BCM) 6 | 7 | GPIO.setup(18, GPIO.IN) # configurar pin como entrada 8 | 9 | while 1: # Bucle infinito 10 | if(GPIO.input(18)): # lee el estado del sensor 11 | print("El PIR ha detectado movimiento") 12 | time.sleep(0.5) # aguarda 1 segundo 13 | -------------------------------------------------------------------------------- /charla_2/images/Raspberry_Pi_Logo.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_2/images/Raspberry_Pi_Logo.svg.png -------------------------------------------------------------------------------- /charla_2/images/pi2.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_2/images/pi2.jpeg -------------------------------------------------------------------------------- /charla_3/GLabs_3.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/GLabs_3.pdf -------------------------------------------------------------------------------- /charla_3/README.md: -------------------------------------------------------------------------------- 1 | # Charla 3: Git avanzado y code review 2 | 3 | ## Guión 4 | 5 | Crearemos ramas e aprenderemos o fluxo habitual de traballo nun proyecto con Git. 6 | Faremos pull requests e aprenderemos a importancia de facer code review. 7 | 8 | A charla tratará os seguintes puntos: 9 | 10 | ### Code Reviews 11 | - Introdución 12 | - Malos e bos programadores 13 | - En que consiste facer software? 14 | - Por que revisar código? 15 | - Que é unha Code Review 16 | - Roles e fases 17 | - Tips para reviewers 18 | - Tips para submitters 19 | - Como facer unha Code Review 20 | - Problemas comúns 21 | - Tips 22 | - Ideas para mellorar o código 23 | 24 | ### Git Avanzado 25 | - Entendendo git 26 | - Onde está a potencia de git? 27 | - Conceptos esenciais 28 | - Vocabulario básico de comandos 29 | - Construíndo a historia 30 | - Referenciar revisións e paths 31 | - Preparar bo commits 32 | - Rescribir a historia 33 | - Traballar en paralelo 34 | - Pull requests 35 | - Utilidades para review 36 | - Investigar na historia 37 | - Configuración avanzada 38 | - Hooks 39 | - Boas prácticas 40 | -------------------------------------------------------------------------------- /charla_3/img/David_al_microfono.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/David_al_microfono.jpg -------------------------------------------------------------------------------- /charla_3/img/Graham.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/Graham.jpg -------------------------------------------------------------------------------- /charla_3/img/automation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/automation.png -------------------------------------------------------------------------------- /charla_3/img/commit_push_run.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/commit_push_run.jpg -------------------------------------------------------------------------------- /charla_3/img/conway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/conway.png -------------------------------------------------------------------------------- /charla_3/img/dubidas.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/dubidas.jpg -------------------------------------------------------------------------------- /charla_3/img/ego.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/ego.jpg -------------------------------------------------------------------------------- /charla_3/img/ephemeral.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/ephemeral.jpg -------------------------------------------------------------------------------- /charla_3/img/flujo-git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/flujo-git.png -------------------------------------------------------------------------------- /charla_3/img/git_not_hard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/git_not_hard.png -------------------------------------------------------------------------------- /charla_3/img/happy_monkey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/happy_monkey.jpg -------------------------------------------------------------------------------- /charla_3/img/ingrediente_secreto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/ingrediente_secreto.jpg -------------------------------------------------------------------------------- /charla_3/img/little_bugs.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/little_bugs.jpg -------------------------------------------------------------------------------- /charla_3/img/logo-git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/logo-git.png -------------------------------------------------------------------------------- /charla_3/img/logo-labs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/logo-labs.png -------------------------------------------------------------------------------- /charla_3/img/mars_climate_orbiter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/mars_climate_orbiter.jpg -------------------------------------------------------------------------------- /charla_3/img/metrics.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/metrics.jpeg -------------------------------------------------------------------------------- /charla_3/img/not_a_meeting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/not_a_meeting.png -------------------------------------------------------------------------------- /charla_3/img/old_code_review.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/old_code_review.png -------------------------------------------------------------------------------- /charla_3/img/optimism.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/optimism.png -------------------------------------------------------------------------------- /charla_3/img/petrov.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/petrov.jpg -------------------------------------------------------------------------------- /charla_3/img/pull_request.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/pull_request.jpg -------------------------------------------------------------------------------- /charla_3/img/pyramid_vs_lego.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/pyramid_vs_lego.jpg -------------------------------------------------------------------------------- /charla_3/img/review_checklist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/review_checklist.png -------------------------------------------------------------------------------- /charla_3/img/sad_developer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/sad_developer.jpg -------------------------------------------------------------------------------- /charla_3/img/tabs_vs_spaces.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/tabs_vs_spaces.png -------------------------------------------------------------------------------- /charla_3/img/tags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/tags.png -------------------------------------------------------------------------------- /charla_3/img/tired.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/tired.jpg -------------------------------------------------------------------------------- /charla_3/img/triviality.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/triviality.png -------------------------------------------------------------------------------- /charla_3/img/vgaltes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/vgaltes.png -------------------------------------------------------------------------------- /charla_3/img/your_domain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/your_domain.png -------------------------------------------------------------------------------- /charla_3/img/zen_developer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_3/img/zen_developer.jpg -------------------------------------------------------------------------------- /charla_3/presentacion/GLabs_3.tex: -------------------------------------------------------------------------------- 1 | %% Preambulo, paquetes a cargar por compilador latex 2 | \documentclass[12pt]{beamer} 3 | \mode{ 4 | % selección de tema y color 5 | \usetheme{Copenhagen} 6 | \usecolortheme{orchid} 7 | } 8 | 9 | \usepackage[utf8]{inputenc} 10 | \usepackage[spanish]{babel} 11 | \usepackage{float} 12 | \usepackage{graphicx} 13 | \usepackage[font=scriptsize,labelfont=bf]{caption} 14 | \usepackage{verbatim} 15 | \usepackage{url} 16 | \usepackage[export]{adjustbox} 17 | \usepackage{listings} 18 | \usepackage{tcolorbox} 19 | \usepackage{tikz} 20 | \usepackage{cclicenses} 21 | \usepackage{multicol} 22 | \usepackage[autostyle]{csquotes} 23 | \lstdefinestyle{mystyle}{ 24 | basicstyle=\tiny, 25 | language=Python 26 | } 27 | \lstset{style=mystyle} 28 | 29 | %% Automatizar localización de las imágenes 30 | \graphicspath{{../img/}} 31 | 32 | \title{Code Reviews con git avanzado} 33 | \author[Pepe Doval]{Pepe Doval} 34 | \institute[SetPay]{SetPay} 35 | \date{\today} 36 | 37 | \begin{document} 38 | 39 | \begin{frame} 40 | \titlepage 41 | \begin{tcolorbox}[] 42 | \centering 43 | {\small \bysa}\\ 44 | {\tiny Esta obra está suxeita á licencia 45 | Recoñecemento-CompartirIgual 4.0 Internacional de Creative 46 | Commons. Para ver unha copia desta licencia, visite 47 | http://creativecommons.org/licenses/by-sa/4.0/.} 48 | \end{tcolorbox} 49 | \end{frame} 50 | 51 | \begin{frame} 52 | \frametitle{Índice} 53 | \tableofcontents 54 | \end{frame} 55 | 56 | \usebackgroundtemplate{% 57 | \tikz[overlay,remember picture] 58 | \node[opacity=0.3 , at=(current page.south east),anchor=south east] { 59 | \includegraphics[]{logo-labs}}; 60 | } 61 | 62 | \input{code_reviews.tex} % code reviews 63 | \input{advanced_git.tex} % git avanzado 64 | 65 | \end{document} 66 | -------------------------------------------------------------------------------- /charla_4/README.md: -------------------------------------------------------------------------------- 1 | # Charla 4: Agile, Scrum & Kanban 2 | Presentación da charla sobre Agile, principios e valores, Scrum e Kanban. 3 | 4 | Como a charla aporta pouco ás dinámicas do curso, é máis ben unha referencia a modo de recordatorio. Para máis información, a propia web http://www.agilemanifesto.org/ pode servir como referencia base. 5 | 6 | **Bibliografía recomendada:** 7 | 8 | * Extreme Programming Explained: Embrace Change (Kent Beck) 9 | * Scrum and XP from the Trenches - 2nd Edition (Henrik Kniberg) 10 | * The Lean Startup: How Constant Innovation Creates Radically Successful Businesses (Eric Ries) 11 | * Kanban (David J. Anderson) 12 | 13 | A comunidade de Agile está activa en Galicia e disposta e aberta a organizar calquera actividade relacionada con esta filosofía, tanto técnica como filosófica. 14 | -------------------------------------------------------------------------------- /charla_4/presentacion.htm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion.htm -------------------------------------------------------------------------------- /charla_4/presentacion_files/1896_Olympic_marathon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/1896_Olympic_marathon.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/2000px-Laurasia-Gondwana.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/2000px-Laurasia-Gondwana.svg.png -------------------------------------------------------------------------------- /charla_4/presentacion_files/6860096164_42ee93598a_b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/6860096164_42ee93598a_b.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/7623398360_4263b7bbf9_b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/7623398360_4263b7bbf9_b.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/Dialog_face_to_face.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/Dialog_face_to_face.JPG -------------------------------------------------------------------------------- /charla_4/presentacion_files/Galuel_RMS_-_free_as_free_speech,_not_as_free_beer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/Galuel_RMS_-_free_as_free_speech,_not_as_free_beer.png -------------------------------------------------------------------------------- /charla_4/presentacion_files/IMG_1616.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/IMG_1616.JPG -------------------------------------------------------------------------------- /charla_4/presentacion_files/Kanban_board_example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/Kanban_board_example.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/Oriente_Station_Lisboa_roof.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/Oriente_Station_Lisboa_roof.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/PUBhwXP.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/PUBhwXP.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/PostItNotePad.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/PostItNotePad.JPG -------------------------------------------------------------------------------- /charla_4/presentacion_files/RC_Race_Car_SST2000.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/RC_Race_Car_SST2000.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/Scrum_Framework.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/Scrum_Framework.png -------------------------------------------------------------------------------- /charla_4/presentacion_files/The_triad_constraints.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/The_triad_constraints.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/X7BrdNg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/X7BrdNg.png -------------------------------------------------------------------------------- /charla_4/presentacion_files/YyOJJaA.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/YyOJJaA.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/backgroundClasses.css: -------------------------------------------------------------------------------- 1 | /*[class*="bg-solid"] { 2 | border: 1px solid rgba(0, 0, 0, .3); 3 | box-shadow: 0 2px 6px rgba(0, 0, 0, .4); 4 | text-shadow: 0 2px 2px rgba(0, 0, 0, .3); 5 | }*/ 6 | 7 | 8 | .bg-default { 9 | background: -webkit-radial-gradient(#F0F0F0, #BEBEBE); 10 | background: -moz-radial-gradient(#F0F0F0, #BEBEBE); 11 | background: -ms-radial-gradient(#F0F0F0, #BEBEBE); 12 | background: -o-radial-gradient(#F0F0F0, #BEBEBE); 13 | background: radial-gradient(#F0F0F0, #BEBEBE); 14 | } 15 | 16 | /* 17 | included for legacy support of old decks with the defaultbg attribute set. 18 | */ 19 | .defaultbg { 20 | background: -webkit-radial-gradient(#F0F0F0, #BEBEBE); 21 | background: -moz-radial-gradient(#F0F0F0, #BEBEBE); 22 | background: -ms-radial-gradient(#F0F0F0, #BEBEBE); 23 | background: -o-radial-gradient(#F0F0F0, #BEBEBE); 24 | background: radial-gradient(#F0F0F0, #BEBEBE); 25 | } 26 | 27 | .bg-solid-orange { 28 | background-color: #774040; 29 | } 30 | 31 | .bg-solid-black { 32 | background-color: #222; 33 | } 34 | 35 | .bg-solid-light { 36 | background-color: white; 37 | } 38 | 39 | .bg-solid-smoke { 40 | background-color: #DDD; 41 | } 42 | 43 | .bg-solid-yellow { 44 | background-color: #D1B377; 45 | } 46 | 47 | .bg-solid-grass { 48 | background-color: #597847; 49 | } 50 | 51 | .bg-solid-darkgreen { 52 | background-color: #134952; 53 | } 54 | 55 | .bg-solid-sky { 56 | background-color: #515E99; 57 | } 58 | 59 | .bg-solid-lavender { 60 | background-color: #443C4D; 61 | } 62 | 63 | .bg-solid-purple { 64 | background-color: #6C478F; 65 | } 66 | 67 | .bg-solid-salmon { 68 | background-color: #C98D8D; 69 | } 70 | 71 | .nobg { 72 | background: url(img/nobg.png); 73 | background-size: 40px 40px; 74 | } 75 | 76 | .themeProviders .thumbnail { 77 | height: 20px; 78 | width: 20px; 79 | padding: 10px; 80 | } 81 | -------------------------------------------------------------------------------- /charla_4/presentacion_files/bespoke-plugins.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bespoke-hash v0.1.2 3 | * 4 | * Copyright 2013, Mark Dalgleish 5 | * This content is released under the MIT license 6 | * http://mit-license.org/markdalgleish 7 | */ 8 | 9 | (function(bespoke) { 10 | 11 | bespoke.plugins.hash = function(deck) { 12 | var activeIndex, 13 | 14 | parseHash = function() { 15 | var hash = window.location.hash.slice(1), 16 | slideNumberOrName = parseInt(hash, 10); 17 | 18 | if (hash) { 19 | if (slideNumberOrName) { 20 | activateSlide(slideNumberOrName - 1); 21 | } else { 22 | deck.slides.forEach(function(slide, i) { 23 | slide.getAttribute('data-bespoke-hash') === hash && activateSlide(i); 24 | }); 25 | } 26 | } 27 | }, 28 | 29 | activateSlide = function(index) { 30 | if (index !== activeIndex) { 31 | deck.slide(index); 32 | } 33 | }; 34 | 35 | setTimeout(function() { 36 | parseHash(); 37 | 38 | deck.on('activate', function(e) { 39 | var slideName = e.slide.getAttribute('data-bespoke-hash'); 40 | window.location.hash = slideName || e.index + 1; 41 | activeIndex = e.index; 42 | }); 43 | 44 | window.addEventListener('hashchange', parseHash); 45 | }, 0); 46 | }; 47 | 48 | }(bespoke)); 49 | 50 | /*! 51 | * bespoke-state v0.2.2 52 | * 53 | * Copyright 2013, Mark Dalgleish 54 | * This content is released under the MIT license 55 | * http://mit-license.org/markdalgleish 56 | */ 57 | 58 | (function(bespoke) { 59 | 60 | bespoke.plugins.state = function(deck) { 61 | var modifyState = function(method, event) { 62 | var attr = event.slide.getAttribute('data-bespoke-state'); 63 | 64 | if (attr) { 65 | attr.split(' ').forEach(function(state) { 66 | state && deck.parent.classList[method](state); 67 | }); 68 | } 69 | }; 70 | 71 | deck.on('activate', modifyState.bind(null, 'add')); 72 | deck.on('deactivate', modifyState.bind(null, 'remove')); 73 | }; 74 | 75 | }(bespoke)); -------------------------------------------------------------------------------- /charla_4/presentacion_files/bespoke.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bespoke.js v0.3.1 3 | * 4 | * Copyright 2013, Mark Dalgleish 5 | * This content is released under the MIT license 6 | * http://mit-license.org/markdalgleish 7 | */ 8 | 9 | (function(moduleName, window) { 10 | var from = function(selectorOrElement, selectedPlugins) { 11 | var parent = selectorOrElement.blur ? selectorOrElement : document.querySelector(selectorOrElement), 12 | slides = [].slice.call(parent.children, 0), 13 | activeSlide = slides[0], 14 | listeners = {}, 15 | 16 | activate = function(index, customData) { 17 | if (!slides[index]) { 18 | return; 19 | } 20 | 21 | fire('deactivate', createEventData(activeSlide, customData)); 22 | 23 | activeSlide = slides[index]; 24 | 25 | slides.map(deactivate); 26 | 27 | fire('activate', createEventData(activeSlide, customData)); 28 | 29 | addClass(activeSlide, 'active'); 30 | removeClass(activeSlide, 'inactive'); 31 | }, 32 | 33 | deactivate = function(slide, index) { 34 | var offset = index - slides.indexOf(activeSlide), 35 | offsetClass = offset > 0 ? 'after' : 'before'; 36 | 37 | ['before(-\\d+)?', 'after(-\\d+)?', 'active', 'inactive'].map(removeClass.bind(0, slide)); 38 | 39 | slide != activeSlide && 40 | ['inactive', offsetClass, offsetClass + '-' + Math.abs(offset)].map(addClass.bind(0, slide)); 41 | }, 42 | 43 | slide = function(index, customData) { 44 | fire('slide', createEventData(slides[index], customData)) && activate(index, customData); 45 | }, 46 | 47 | step = function(offset, customData) { 48 | var slideIndex = slides.indexOf(activeSlide) + offset; 49 | 50 | fire(offset > 0 ? 'next' : 'prev', createEventData(activeSlide, customData)) && activate(slideIndex, customData); 51 | }, 52 | 53 | on = function(eventName, callback) { 54 | (listeners[eventName] || (listeners[eventName] = [])).push(callback); 55 | 56 | return function() { 57 | listeners[eventName] = listeners[eventName].filter(function(listener) { 58 | return listener != callback; 59 | }); 60 | }; 61 | }, 62 | 63 | fire = function(eventName, eventData) { 64 | return (listeners[eventName] || []) 65 | .reduce(function(notCancelled, callback) { 66 | return notCancelled && callback(eventData) !== false; 67 | }, true); 68 | }, 69 | 70 | createEventData = function(slide, eventData) { 71 | eventData = eventData || {}; 72 | eventData.index = slides.indexOf(slide); 73 | eventData.slide = slide; 74 | return eventData; 75 | }, 76 | 77 | deck = { 78 | on: on, 79 | fire: fire, 80 | slide: slide, 81 | next: step.bind(0, 1), 82 | prev: step.bind(0, -1), 83 | parent: parent, 84 | slides: slides 85 | }; 86 | 87 | addClass(parent, 'parent'); 88 | 89 | slides.map(function(slide) { 90 | addClass(slide, 'slide'); 91 | }); 92 | 93 | for (var pluginName in selectedPlugins) { 94 | plugins[pluginName](deck, selectedPlugins[pluginName]); 95 | } 96 | 97 | activate(0); 98 | 99 | decks.push(deck); 100 | 101 | return deck; 102 | }, 103 | 104 | decks = [], 105 | 106 | addClass = function(el, cls) { 107 | el.classList.add(moduleName + '-' + cls); 108 | }, 109 | 110 | removeClass = function(el, cls) { 111 | el.className = el.className 112 | .replace(RegExp(moduleName + '-' + cls +'(\\s|$)', 'g'), ' ') 113 | .trim(); 114 | }, 115 | 116 | callOnAllDecks = function(method) { 117 | return function(arg) { 118 | decks.map(function(deck) { 119 | deck[method](arg); 120 | }); 121 | }; 122 | }, 123 | 124 | bindPlugin = function(pluginName) { 125 | return { 126 | from: function(selectorOrElement, selectedPlugins) { 127 | (selectedPlugins = selectedPlugins || {})[pluginName] = true; 128 | return from(selectorOrElement, selectedPlugins); 129 | } 130 | }; 131 | }, 132 | 133 | makePluginForAxis = function(axis) { 134 | return function(deck) { 135 | var startPosition, 136 | delta; 137 | 138 | document.addEventListener('keydown', function(e) { 139 | ( 140 | e.which == 34 || // PAGE DOWN 141 | e.which == 32 || // SPACE 142 | axis == 'X' && e.which == 39 || // RIGHT 143 | axis == 'Y' && e.which == 40 // BOTTOM 144 | ) && deck.next(); 145 | ( 146 | e.which == 33 || // PAGE UP 147 | axis == 'X' && e.which == 37 || // LEFT 148 | axis == 'Y' && e.which == 38 // TOP 149 | ) && deck.prev(); 150 | }); 151 | 152 | deck.parent.addEventListener('touchstart', function(e) { 153 | if (e.touches.length == 1) { 154 | startPosition = e.touches[0]['page' + axis]; 155 | delta = 0; 156 | } 157 | }); 158 | 159 | deck.parent.addEventListener('touchmove', function(e) { 160 | if (e.touches.length == 1) { 161 | e.preventDefault(); 162 | delta = e.touches[0]['page' + axis] - startPosition; 163 | } 164 | }); 165 | 166 | deck.parent.addEventListener('touchend', function() { 167 | Math.abs(delta) > 50 && (delta > 0 ? deck.prev() : deck.next()); 168 | }); 169 | }; 170 | }, 171 | 172 | plugins = { 173 | horizontal: makePluginForAxis('X'), 174 | vertical: makePluginForAxis('Y') 175 | }; 176 | 177 | window[moduleName] = { 178 | from: from, 179 | slide: callOnAllDecks('slide'), 180 | next: callOnAllDecks('next'), 181 | prev: callOnAllDecks('prev'), 182 | horizontal: bindPlugin('horizontal'), 183 | vertical: bindPlugin('vertical'), 184 | plugins: plugins 185 | }; 186 | 187 | }('bespoke', window)); -------------------------------------------------------------------------------- /charla_4/presentacion_files/daily-paper-464015_960_720.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/daily-paper-464015_960_720.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/default.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic); 2 | 3 | @font-face { 4 | font-family: 'League Gothic'; 5 | src: url("../../lib/font/league_gothic-webfont.eot"); 6 | src: url("../../lib/font/league_gothic-webfont.eot?#iefix") format("embedded-opentype"), url("../../lib/font/league_gothic-webfont.woff") format("woff"), url("../../lib/font/league_gothic-webfont.ttf") format("truetype"), url("../../lib/font/league_gothic-webfont.svg#LeagueGothicRegular") format("svg"); 7 | font-weight: normal; 8 | font-style: normal; } 9 | 10 | 11 | html, body { 12 | font-family: "Lato", sans-serif; 13 | color: #333; 14 | } 15 | 16 | .themedArea { 17 | font-family: "Lato", sans-serif; 18 | font-size: 36px; 19 | font-weight: 200; 20 | letter-spacing: -0.02em; 21 | color: #333; } 22 | 23 | .themedArea h1, 24 | .themedArea h2, 25 | .themedArea h3, 26 | .themedArea h4, 27 | .themedArea h5, 28 | .themedArea h6 { 29 | margin: 0 0 20px 0; 30 | color: #333; 31 | font-family: "League Gothic", Impact, sans-serif; 32 | line-height: 0.9em; 33 | letter-spacing: 0.02em; 34 | text-transform: uppercase; 35 | text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2); } 36 | 37 | .themedArea h1 { 38 | text-shadow: 0 1px 0 #666666, 0 2px 0 #5A5A5A, 0 3px 0 #494949, 0 4px 0 #4D4D4D, 0 5px 0 #494949, 0 6px 1px rgba(0, 0, 0, 0.1), 0 0 5px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.3), 0 3px 5px rgba(0, 0, 0, 0.2), 0 5px 10px rgba(0, 0, 0, 0.25), 0 20px 20px rgba(0, 0, 0, 0.15); 39 | } 40 | -------------------------------------------------------------------------------- /charla_4/presentacion_files/demo.css: -------------------------------------------------------------------------------- 1 | * { 2 | box-sizing: border-box; 3 | -webkit-font-smoothing: antialiased; 4 | font-smoothing: antialiased; 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | body { 10 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 11 | min-height: 740px; 12 | 13 | background: rgb(215, 215, 215); 14 | background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 500, from(rgb(240, 240, 240)), to(rgb(190, 190, 190))); 15 | background: -webkit-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 16 | background: -moz-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 17 | background: -ms-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 18 | background: -o-radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 19 | background: radial-gradient(rgb(240, 240, 240), rgb(190, 190, 190)); 20 | } 21 | 22 | #main { 23 | position: absolute; 24 | top: 0; 25 | left: 0; 26 | right: 0; 27 | bottom: 0; 28 | } 29 | 30 | article { 31 | -webkit-perspective: 600px; 32 | -moz-perspective: 600px; 33 | -ms-perspective: 600px; 34 | -o-perspective: 600px; 35 | perspective: 600px; 36 | position: absolute; 37 | top: 0; 38 | right: 0; 39 | left: 0; 40 | bottom: 0; 41 | } 42 | 43 | section { 44 | -webkit-transform: none; 45 | -moz-transform: none; 46 | -ms-transform: none; 47 | -o-transform: none; 48 | transform: none; 49 | position: absolute; 50 | top: 50%; 51 | left: 50%; 52 | margin-left: -512px; 53 | margin-top: -384px; 54 | opacity: 0; 55 | } 56 | 57 | body, 58 | section.bespoke-slide { 59 | -webkit-transition: -webkit-transform .7s ease, opacity .7s ease, background-color .7s ease; 60 | -moz-transition: -moz-transform .7s ease, opacity .7s ease, background-color .7s ease; 61 | -ms-transition: -ms-transform .7s ease, opacity .7s ease, background-color .7s ease; 62 | -o-transition: -o-transform .7s ease, opacity .7s ease, background-color .7s ease; 63 | transition: transform .7s ease, opacity .7s ease, background-color .7s ease; 64 | } 65 | section.bespoke-active { 66 | opacity: 1; 67 | z-index: 1; 68 | } 69 | section.bespoke-inactive { 70 | pointer-events: none; 71 | } 72 | -------------------------------------------------------------------------------- /charla_4/presentacion_files/loadPresentation.js: -------------------------------------------------------------------------------- 1 | var loadPresentation = function() { 2 | var presentation = localStorage.getItem('preview-string'); 3 | var config = JSON.parse(localStorage.getItem('preview-config')); 4 | 5 | if (presentation) { 6 | document.body.innerHTML = presentation; 7 | // document.body.className = config.surface + " " + document.body.className; 8 | } 9 | }; 10 | -------------------------------------------------------------------------------- /charla_4/presentacion_files/rWYCRwm.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_4/presentacion_files/rWYCRwm.jpg -------------------------------------------------------------------------------- /charla_4/presentacion_files/surfaceClasses.css: -------------------------------------------------------------------------------- 1 | .bg-surf-grad-black { 2 | background-color: #333; 3 | /*background-image: -webkit-radial-gradient(#333, #111); 4 | background-image: -moz-radial-gradient(#333, #111); 5 | background-image: -ms-radial-gradient(#333, #111); 6 | background-image: -o-radial-gradient(#333, #111); 7 | background-image: radial-gradient(#333, #111);*/ 8 | } 9 | 10 | .bg-surf-grad-light { 11 | background-color: #FFF; 12 | /*background-image: -webkit-radial-gradient(#FFF, #DDD); 13 | background-image: -moz-radial-gradient(#FFF, #DDD); 14 | background-image: -ms-radial-gradient(#FFF, #DDD); 15 | background-image: -o-radial-gradient(#FFF, #DDD); 16 | background-image: radial-gradient(#FFF, #DDD);*/ 17 | } 18 | 19 | .bg-surf-grad-smoke { 20 | background-color: #EEE; 21 | /*background-image: -webkit-radial-gradient(#EEE, #CCC); 22 | background-image: -moz-radial-gradient(#EEE, #CCC); 23 | background-image: -ms-radial-gradient(#EEE, #CCC); 24 | background-image: -o-radial-gradient(#EEE, #CCC); 25 | background-image: radial-gradient(#EEE, #CCC);*/ 26 | } 27 | 28 | .bg-surf-grad-orange { 29 | background-color: #945353; 30 | /*background-image: -webkit-radial-gradient(#945353, #774040); 31 | background-image: -moz-radial-gradient(#945353, #774040); 32 | background-image: -ms-radial-gradient(#945353, #774040); 33 | background-image: -o-radial-gradient(#945353, #774040); 34 | background-image: radial-gradient(#945353, #774040);*/ 35 | } 36 | 37 | .bg-surf-grad-yellow { 38 | background-color: #cfb98c; 39 | /*background-image: -webkit-radial-gradient(#cfb98c, #D1B377); 40 | background-image: -moz-radial-gradient(#cfb98c, #D1B377); 41 | background-image: -ms-radial-gradient(#cfb98c, #D1B377); 42 | background-image: -o-radial-gradient(#cfb98c, #D1B377); 43 | background-image: radial-gradient(#cfb98c, #D1B377);*/ 44 | } 45 | 46 | .bg-surf-grad-darkgreen { 47 | background-color: #4a939e; 48 | /*background-image: -webkit-radial-gradient(#4a939e, #134952); 49 | background-image: -moz-radial-gradient(#4a939e, #134952); 50 | background-image: -ms-radial-gradient(#4a939e, #134952); 51 | background-image: -o-radial-gradient(#4a939e, #134952); 52 | background-image: radial-gradient(#4a939e, #134952);*/ 53 | } 54 | 55 | .bg-surf-grad-sky { 56 | background-color: #5e699c; 57 | /*background-image: -webkit-radial-gradient(#5e699c, #515E99); 58 | background-image: -moz-radial-gradient(#5e699c, #515E99); 59 | background-image: -ms-radial-gradient(#5e699c, #515E99); 60 | background-image: -o-radial-gradient(#5e699c, #515E99); 61 | background-image: radial-gradient(#5e699c, #515E99);*/ 62 | } 63 | 64 | .bg-surf-grad-lavender { 65 | background-color: #554b61; 66 | /*background-image: -webkit-radial-gradient(#554b61, #443C4D); 67 | background-image: -moz-radial-gradient(#554b61, #443C4D); 68 | background-image: -ms-radial-gradient(#554b61, #443C4D); 69 | background-image: -o-radial-gradient(#554b61, #443C4D); 70 | background-image: radial-gradient(#554b61, #443C4D);*/ 71 | } 72 | 73 | .bg-surf-grad-purple { 74 | background-color: #775796; 75 | /*background-image: -webkit-radial-gradient(#775796, #6C478F); 76 | background-image: -moz-radial-gradient(#775796, #6C478F); 77 | background-image: -ms-radial-gradient(#775796, #6C478F); 78 | background-image: -o-radial-gradient(#775796, #6C478F); 79 | background-image: radial-gradient(#775796, #6C478F);*/ 80 | } 81 | 82 | .bg-surf-grad-salmon { 83 | background-color: #cfa2a2; 84 | /*background-image: -webkit-radial-gradient(#cfa2a2, #C98D8D); 85 | background-image: -moz-radial-gradient(#cfa2a2, #C98D8D); 86 | background-image: -ms-radial-gradient(#cfa2a2, #C98D8D); 87 | background-image: -o-radial-gradient(#cfa2a2, #C98D8D); 88 | background-image: radial-gradient(#cfa2a2, #C98D8D);*/ 89 | } 90 | 91 | .bg-surf-grad-grass { 92 | background-color: #6c855d; 93 | /*background-image: -webkit-radial-gradient(#6c855d, #597847); 94 | background-image: -moz-radial-gradient(#6c855d, #597847); 95 | background-image: -ms-radial-gradient(#6c855d, #597847); 96 | background-image: -o-radial-gradient(#6c855d, #597847); 97 | background-image: radial-gradient(#6c855d, #597847);*/ 98 | } -------------------------------------------------------------------------------- /charla_4/presentacion_files/web-fonts.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Lato'; 3 | font-style: normal; 4 | font-weight: 700; 5 | src: local('Lato Bold'), local('Lato-Bold'), url(Lato-Bold.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Hammersmith One'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Hammersmith One'), local('HammersmithOne'), url(HammersmithOne.woff) format('woff'); 12 | } 13 | @font-face { 14 | font-family: 'Gorditas'; 15 | font-style: normal; 16 | font-weight: 400; 17 | src: local('Gorditas'), local('Gorditas-Regular'), url(Gorditas-Regular.woff) format('woff'); 18 | } 19 | @font-face { 20 | font-family: 'Fredoka One'; 21 | font-style: normal; 22 | font-weight: 400; 23 | src: local('Fredoka One'), local('FredokaOne-Regular'), url(FredokaOne-Regular.woff) format('woff'); 24 | } 25 | @font-face { 26 | font-family: 'Ubuntu'; 27 | font-style: normal; 28 | font-weight: 400; 29 | src: local('Ubuntu'), url(Ubuntu.woff) format('woff'); 30 | } 31 | @font-face { 32 | font-family: 'Ubuntu'; 33 | font-style: normal; 34 | font-weight: 700; 35 | src: local('Ubuntu Bold'), local('Ubuntu-Bold'), url(Ubuntu-Bold.woff) format('woff'); 36 | } 37 | @font-face { 38 | font-family: 'PressStart2P'; 39 | font-style: normal; 40 | font-weight: 400; 41 | src: local('Press Start 2P'), local('PressStart2P-Regular'), url(PressStart2P-Regular.woff) format('woff'); 42 | } 43 | @font-face { 44 | font-family: 'Lato'; 45 | font-style: italic; 46 | font-weight: 700; 47 | src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url(Lato-BoldItalic.woff) format('woff'); 48 | } 49 | @font-face { 50 | font-family: 'Abril Fatface'; 51 | font-style: normal; 52 | font-weight: 400; 53 | src: local('Abril Fatface'), local('AbrilFatface-Regular'), url(AbrilFatface-Regular.woff) format('woff'); 54 | } 55 | @font-face { 56 | font-family: 'Lato'; 57 | font-style: normal; 58 | font-weight: 400; 59 | src: local('Lato Regular'), local('Lato-Regular'), url(Lato-Regular.woff) format('woff'); 60 | } 61 | @font-face { 62 | font-family: 'Droid Sans Mono'; 63 | font-style: normal; 64 | font-weight: 700; 65 | src: local('Droid Sans Mono'), local('Droid-Sans-Mono'), url(Droid-Sans-Mono.woff) format('woff'); 66 | } -------------------------------------------------------------------------------- /charla_5/Django con Raspberries.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_5/Django con Raspberries.pdf -------------------------------------------------------------------------------- /charla_5/README.md: -------------------------------------------------------------------------------- 1 | # Django-gpul-raspberry 2 | En este repositorio encontraréis los ejemplos en **Python3** de la charla que se ha impartido en el Gpul el 9/3/2016 https://www.gpul.org/indico/conferenceDisplay.py?confId=32 , 3 | por un lado el proyecto **Django** y por el otro los **scripts de la Raspberry** (sensor de temperatura/humedad DHT11 y led RGB) en la carpeta *raspberry/gpul* 4 | 5 | Todos los ejemplos se han realizado usando el intérprete de **Python v3.5** 6 | 7 | Para los que me habéis preguntado por la configuración del **Vim**, aquí estaría junto con la de otras aplicaciones https://github.com/Uxio0/dotfiles 8 | 9 | Cualquier duda, quedo a vuestra disposición, ya sea de **Django/Python/Raspberry** o **Vim/cualquier otro repo que tenga**. No **dudéis en enviar** también *pull requests* o **abrir** *issues* de cosas que mejoraríais para ir mejorando el proyecto poco a poco! 10 | 11 | Un saludo! 12 | -------------------------------------------------------------------------------- /charla_5/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_5/core/__init__.py -------------------------------------------------------------------------------- /charla_5/core/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /charla_5/core/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoreConfig(AppConfig): 5 | name = 'core' 6 | -------------------------------------------------------------------------------- /charla_5/core/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.4 on 2016-03-05 19:32 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import django.db.models.deletion 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Data', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('name', models.CharField(max_length=20)), 22 | ('value', models.FloatField()), 23 | ('created', models.DateTimeField(auto_now=True)), 24 | ], 25 | ), 26 | migrations.CreateModel( 27 | name='Raspberry', 28 | fields=[ 29 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('mac', models.CharField(max_length=20, unique=True)), 31 | ('ip', models.GenericIPAddressField()), 32 | ('hostname', models.CharField(max_length=20)), 33 | ], 34 | ), 35 | migrations.AddField( 36 | model_name='data', 37 | name='device', 38 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Raspberry'), 39 | ), 40 | ] 41 | -------------------------------------------------------------------------------- /charla_5/core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_5/core/migrations/__init__.py -------------------------------------------------------------------------------- /charla_5/core/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class Raspberry(models.Model): 4 | mac = models.CharField(max_length=20, unique=True) 5 | ip = models.GenericIPAddressField() 6 | hostname = models.CharField(max_length=20) 7 | 8 | class Data(models.Model): 9 | name = models.CharField(max_length=20) 10 | value = models.FloatField() 11 | device = models.ForeignKey(Raspberry, on_delete=models.CASCADE) 12 | created = models.DateTimeField(auto_now=True) 13 | -------------------------------------------------------------------------------- /charla_5/core/static/core/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 50px; 3 | } 4 | .starter-template { 5 | padding: 40px 15px; 6 | text-align: center; 7 | } 8 | -------------------------------------------------------------------------------- /charla_5/core/templates/core/index.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% block title %}Hola{% endblock %} 20 | {% block head %}{% endblock %} 21 | 22 | 23 | 24 | 43 | 44 |
45 | {% block content %} 46 |

Bootstrap starter template

47 |

Use this document as a way to quickly start any new project.
All you get is this text and a mostly barebones HTML document.

48 | {% endblock %} 49 |
50 | 51 | 52 | -------------------------------------------------------------------------------- /charla_5/core/templates/core/raspberry-data-stored.html: -------------------------------------------------------------------------------- 1 | {% extends "core/index.html" %} 2 | {% block title %}Raspberries{% endblock %} 3 | {% block head%} 4 | 5 | 32 | {% endblock %} 33 | {% block content %} 34 | 37 |
38 |
39 | 40 |
41 |
42 | 43 |
44 |
45 |
46 |
47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | {% for data in data_list %} 57 | 58 | 59 | 60 | 61 | 62 | {% endfor %} 63 | 64 |
CreatedNameValue
{{ data.created }}{{ data.name }}{{ data.value}}
65 |
66 |
67 | {% endblock %} 68 | -------------------------------------------------------------------------------- /charla_5/core/templates/core/raspberry-detail.html: -------------------------------------------------------------------------------- 1 | {% extends "core/index.html" %} 2 | {% load staticfiles %} 3 | {% block title %}Raspberries{% endblock %} 4 | {% block head%} 5 | 6 | 40 | {% endblock %} 41 | {% block content %} 42 | 46 |
47 |
48 |
49 |
0C
54 |
55 |
56 |
57 |
58 |
0%
63 |
64 |
65 |
66 |
67 |
68 | 69 |
70 |
71 | 72 |
73 |
74 | {% endblock %} 75 | -------------------------------------------------------------------------------- /charla_5/core/templates/core/raspberry-led-color.html: -------------------------------------------------------------------------------- 1 | {% extends "core/index.html" %} 2 | {% load staticfiles %} 3 | {% block title %}Raspberries{% endblock %} 4 | {% block head%} 5 | 6 | 30 | {% endblock %} 31 | {% block content %} 32 | 35 |
36 |
37 | 38 |
39 |
40 | {% endblock %} 41 | -------------------------------------------------------------------------------- /charla_5/core/templates/core/raspberry-list.html: -------------------------------------------------------------------------------- 1 | {% extends "core/index.html" %} 2 | {% block title %}Raspberries{% endblock %} 3 | {% block content %} 4 | 7 |
8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% for raspberry in object_list %} 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | {% endfor %} 29 | 30 |
IpMacHostnameDataColor
{{ raspberry.ip }}{{ raspberry.mac }}{{ raspberry.hostname }}
  • Data
  • Color
  • 31 |
    32 |
    33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /charla_5/core/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /charla_5/core/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url 2 | 3 | from . import views 4 | urlpatterns = [ 5 | url(r'^$', views.IndexView.as_view(), name='index'), 6 | url(r'^info/$', views.info, name='info'), 7 | url(r'^postData/$', views.postData, name='postData'), 8 | url(r'^raspberry/list/$', views.RaspberryListView.as_view(), name='raspberry-list'), 9 | url(r'^raspberry/(?P[0-9]+)/$', views.RaspberryDetailView.as_view(), name='raspberry-detail'), 10 | url(r'^raspberry/(?P[0-9]+)/data/(?P\w+)$', views.raspberryData, name='raspberry-data'), 11 | url(r'^raspberry/(?P[0-9]+)/dataStored/$', views.RaspberryDataStored.as_view(), name='raspberry-data-stored'), 12 | url(r'^raspberry/(?P[0-9]+)/led/$', views.LedColorView.as_view(), name='raspberry-led-color'), 13 | ] 14 | -------------------------------------------------------------------------------- /charla_5/core/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render, HttpResponse 2 | from django.http import JsonResponse 3 | from django.views import generic 4 | from django.views.decorators.csrf import csrf_exempt 5 | from django.core import serializers 6 | 7 | from .models import Raspberry, Data 8 | 9 | import json 10 | 11 | class IndexView(generic.TemplateView): 12 | template_name = 'core/index.html' 13 | 14 | def info(request): 15 | return JsonResponse({'server': 'Gpul server'}) 16 | 17 | @csrf_exempt 18 | def postData(request): 19 | jsonData = json.loads(request.body.decode()) 20 | device = jsonData['device'] 21 | mac = device['mac'] 22 | hostname = device['hostname'] 23 | ip = request.META.get('REMOTE_ADDR') 24 | try: 25 | raspberry = Raspberry.objects.get(mac=mac) 26 | except: 27 | print('New mac detected, creating raspberry') 28 | raspberry = Raspberry(mac=mac, ip=ip, hostname=hostname) 29 | raspberry.save() 30 | 31 | data = jsonData['data'] 32 | name = data['name'].upper() 33 | value = data['value'] 34 | d = Data(name=name, value=value, device=raspberry) 35 | d.save() 36 | 37 | return JsonResponse({'result': 'Ok'}) 38 | 39 | class RaspberryListView(generic.ListView): 40 | model = Raspberry 41 | template_name = 'core/raspberry-list.html' 42 | 43 | class RaspberryDetailView(generic.DetailView): 44 | model = Raspberry 45 | template_name = 'core/raspberry-detail.html' 46 | 47 | def get_context_data(self, **kwargs): 48 | context = super().get_context_data(**kwargs) 49 | context['data_list'] = Data.objects.filter(device=self.object).order_by('-id')[:20] 50 | return context 51 | 52 | class RaspberryDataStored(generic.DetailView): 53 | model = Raspberry 54 | template_name = 'core/raspberry-data-stored.html' 55 | 56 | def get_context_data(self, **kwargs): 57 | context = super().get_context_data(**kwargs) 58 | context['data_list'] = Data.objects.filter(device=self.object).order_by('-id')[:20] 59 | context['data_list_json'] = serializers.serialize('json', reversed(context['data_list'])) 60 | return context 61 | 62 | def raspberryData(request, pk, name): 63 | d = Data.objects.filter(device=pk, name=name.upper()).last() 64 | return JsonResponse({'value': d.value}) 65 | 66 | class LedColorView(generic.DetailView): 67 | model = Raspberry 68 | template_name = 'core/raspberry-led-color.html' 69 | -------------------------------------------------------------------------------- /charla_5/djangoGpul/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_5/djangoGpul/__init__.py -------------------------------------------------------------------------------- /charla_5/djangoGpul/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for djangoGpul project. 3 | 4 | Generated by 'django-admin startproject' using Django 1.9.4. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.9/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/1.9/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | 19 | # Quick-start development settings - unsuitable for production 20 | # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ 21 | 22 | # SECURITY WARNING: keep the secret key used in production secret! 23 | SECRET_KEY = 'bfyl+_s8-xj4cf0$bw_4n)mc2=#(w*l^8r+qul!tj9a_+@$(%9' 24 | 25 | # SECURITY WARNING: don't run with debug turned on in production! 26 | DEBUG = True 27 | 28 | ALLOWED_HOSTS = [] 29 | 30 | 31 | # Application definition 32 | 33 | INSTALLED_APPS = [ 34 | 'core', 35 | 'django.contrib.admin', 36 | 'django.contrib.auth', 37 | 'django.contrib.contenttypes', 38 | 'django.contrib.sessions', 39 | 'django.contrib.messages', 40 | 'django.contrib.staticfiles', 41 | ] 42 | 43 | MIDDLEWARE_CLASSES = [ 44 | 'django.middleware.security.SecurityMiddleware', 45 | 'django.contrib.sessions.middleware.SessionMiddleware', 46 | 'django.middleware.common.CommonMiddleware', 47 | 'django.middleware.csrf.CsrfViewMiddleware', 48 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 49 | 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 50 | 'django.contrib.messages.middleware.MessageMiddleware', 51 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 52 | ] 53 | 54 | ROOT_URLCONF = 'djangoGpul.urls' 55 | 56 | TEMPLATES = [ 57 | { 58 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 59 | 'DIRS': [], 60 | 'APP_DIRS': True, 61 | 'OPTIONS': { 62 | 'context_processors': [ 63 | 'django.template.context_processors.debug', 64 | 'django.template.context_processors.request', 65 | 'django.contrib.auth.context_processors.auth', 66 | 'django.contrib.messages.context_processors.messages', 67 | ], 68 | }, 69 | }, 70 | ] 71 | 72 | WSGI_APPLICATION = 'djangoGpul.wsgi.application' 73 | 74 | 75 | # Database 76 | # https://docs.djangoproject.com/en/1.9/ref/settings/#databases 77 | 78 | DATABASES = { 79 | 'default': { 80 | 'ENGINE': 'django.db.backends.sqlite3', 81 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 82 | } 83 | } 84 | 85 | 86 | # Password validation 87 | # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators 88 | 89 | AUTH_PASSWORD_VALIDATORS = [ 90 | { 91 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 92 | }, 93 | { 94 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 95 | }, 96 | { 97 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 98 | }, 99 | { 100 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 101 | }, 102 | ] 103 | 104 | 105 | # Internationalization 106 | # https://docs.djangoproject.com/en/1.9/topics/i18n/ 107 | 108 | LANGUAGE_CODE = 'en-us' 109 | 110 | TIME_ZONE = 'UTC' 111 | 112 | USE_I18N = True 113 | 114 | USE_L10N = True 115 | 116 | USE_TZ = True 117 | 118 | 119 | # Static files (CSS, JavaScript, Images) 120 | # https://docs.djangoproject.com/en/1.9/howto/static-files/ 121 | 122 | STATIC_URL = '/static/' 123 | -------------------------------------------------------------------------------- /charla_5/djangoGpul/urls.py: -------------------------------------------------------------------------------- 1 | """djangoGpul URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.9/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.conf.urls import url, include 17 | from django.contrib import admin 18 | 19 | urlpatterns = [ 20 | url(r'^core/', include('core.urls')), 21 | url(r'^admin/', admin.site.urls), 22 | ] 23 | -------------------------------------------------------------------------------- /charla_5/djangoGpul/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for djangoGpul project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoGpul.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /charla_5/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoGpul.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /charla_5/raspberry/gpul/rgb/colorlib.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # 3 | # Fade an LED (or one color of an RGB LED) using GPIO's PWM capabilities. 4 | # 5 | # Usage: 6 | # sudo python colors.py 255 255 255 7 | # 8 | # @author Jeff Geerling, 2015 9 | 10 | import time 11 | import RPi.GPIO as GPIO 12 | 13 | class RgbLed(): 14 | # LED pin mapping and GPIO setup. 15 | def __init__(self, red=7, green=11, blue=13, mode=GPIO.BOARD): 16 | GPIO.setmode(mode) 17 | GPIO.setwarnings(False) 18 | 19 | GPIO.setup(red, GPIO.OUT) 20 | GPIO.setup(green, GPIO.OUT) 21 | GPIO.setup(blue, GPIO.OUT) 22 | 23 | # Set up colors using PWM so we can control individual brightness. 24 | self.red = GPIO.PWM(red, 100) 25 | self.green = GPIO.PWM(green, 100) 26 | self.blue = GPIO.PWM(blue, 100) 27 | self.red.start(0) 28 | self.green.start(0) 29 | self.blue.start(0) 30 | 31 | # Set a color by giving R, G, and B values of 0-255. 32 | def setColor(self, red, green, blue): 33 | rgb = [red, green, blue] 34 | # Convert 0-255 range to 0-100. 35 | rgb = [x / 255.0 * 100 for x in rgb] 36 | self.red.ChangeDutyCycle(rgb[0]) 37 | self.green.ChangeDutyCycle(rgb[1]) 38 | self.blue.ChangeDutyCycle(rgb[2]) 39 | -------------------------------------------------------------------------------- /charla_5/raspberry/gpul/rgb/colors.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | # 3 | # Fade an LED (or one color of an RGB LED) using GPIO's PWM capabilities. 4 | # 5 | # Usage: 6 | # sudo python colors.py 255 255 255 7 | # 8 | # @author Jeff Geerling, 2015 9 | 10 | import argparse 11 | import time 12 | import RPi.GPIO as GPIO 13 | 14 | # Get RGB colors from command line arguments. 15 | parser = argparse.ArgumentParser(description = 'Light up the world!') 16 | parser.add_argument('rgb', metavar='0-255', type=int, nargs=3, 17 | help='Red, Green, and Blue color values (0-255).') 18 | args = parser.parse_args() 19 | 20 | # LED pin mapping. 21 | red = 7 22 | green = 11 23 | blue = 13 24 | 25 | # GPIO setup. 26 | GPIO.setmode(GPIO.BOARD) 27 | GPIO.setwarnings(False) 28 | 29 | GPIO.setup(red, GPIO.OUT) 30 | GPIO.setup(green, GPIO.OUT) 31 | GPIO.setup(blue, GPIO.OUT) 32 | 33 | # Set up colors using PWM so we can control individual brightness. 34 | RED = GPIO.PWM(red, 100) 35 | GREEN = GPIO.PWM(green, 100) 36 | BLUE = GPIO.PWM(blue, 100) 37 | RED.start(0) 38 | GREEN.start(0) 39 | BLUE.start(0) 40 | 41 | # Set a color by giving R, G, and B values of 0-255. 42 | def setColor(rgb = []): 43 | # Convert 0-255 range to 0-100. 44 | rgb = [(x / 255.0) * 100 for x in rgb] 45 | RED.ChangeDutyCycle(rgb[0]) 46 | GREEN.ChangeDutyCycle(rgb[1]) 47 | BLUE.ChangeDutyCycle(rgb[2]) 48 | 49 | setColor(args.rgb) 50 | time.sleep(10) 51 | 52 | GPIO.cleanup() 53 | -------------------------------------------------------------------------------- /charla_5/raspberry/gpul/rgb/fserver.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask.ext.cors import CORS 3 | from colorlib import RgbLed 4 | 5 | app = Flask(__name__) 6 | CORS(app) 7 | 8 | r = RgbLed() 9 | 10 | @app.route('/color///') 11 | def hello_world(red, green, blue): 12 | r.setColor(red, green, blue) 13 | return 'Ok' 14 | 15 | if __name__ == '__main__': 16 | app.run(host='0.0.0.0', port=1337) 17 | -------------------------------------------------------------------------------- /charla_5/raspberry/gpul/temperature/dht11_example.py: -------------------------------------------------------------------------------- 1 | import RPi.GPIO as GPIO 2 | import dht11 3 | import time 4 | import datetime 5 | 6 | # initialize GPIO 7 | GPIO.setwarnings(False) 8 | GPIO.setmode(GPIO.BCM) 9 | GPIO.cleanup() 10 | 11 | instance = dht11.DHT11(pin=23) 12 | 13 | while True: 14 | result = instance.read() 15 | if result.is_valid(): 16 | print("Last valid input: " + str(datetime.datetime.now())) 17 | print("Temperature: %d C" % result.temperature) 18 | print("Humidity: %d %%" % result.humidity) 19 | 20 | time.sleep(1) 21 | -------------------------------------------------------------------------------- /charla_5/raspberry/gpul/temperature/temperature.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python2 2 | import RPi.GPIO as GPIO 3 | import dht11 4 | import time 5 | import datetime 6 | import sys 7 | import requests 8 | import socket 9 | import urllib.parse 10 | from uuid import getnode as get_mac 11 | import atexit 12 | 13 | # initialize GPIO 14 | GPIO.setwarnings(False) 15 | GPIO.setmode(GPIO.BCM) 16 | GPIO.cleanup() 17 | 18 | LED = 24 19 | GPIO.setup(LED, GPIO.OUT) 20 | 21 | def ledOn(): 22 | GPIO.output(LED, True) 23 | 24 | @atexit.register 25 | def ledOff(): 26 | GPIO.output(LED, False) 27 | 28 | hostname = socket.gethostname() 29 | mac = get_mac() 30 | address = sys.argv[1] 31 | address = urllib.parse.urljoin(address, '/core/postData/') 32 | print('Posting data to', address) 33 | 34 | 35 | instance = dht11.DHT11(pin=23) 36 | ledOff() 37 | 38 | while True: 39 | result = instance.read() 40 | if result.is_valid(): 41 | ledOn() 42 | print("Last valid input: " + str(datetime.datetime.now())) 43 | print("Temperature: %d C" % result.temperature) 44 | print("Humidity: %d %%" % result.humidity) 45 | ledOff() 46 | requests.post(address, json={'device': {'mac': mac, 'hostname': hostname}, 'data': {'name': 'Temperature', 'value': result.temperature}}) 47 | ledOn() 48 | ledOff() 49 | requests.post(address, json={'device': {'mac': mac, 'hostname': hostname}, 'data': {'name': 'Humidity', 'value': result.humidity}}) 50 | ledOn() 51 | 52 | time.sleep(1) 53 | -------------------------------------------------------------------------------- /charla_6/README.md: -------------------------------------------------------------------------------- 1 | # restful-apis 2 | Public material about RESTful APIs for the GPUL Labs conference 3 | -------------------------------------------------------------------------------- /charla_6/public/doc/img/hateoas-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/hateoas-1.png -------------------------------------------------------------------------------- /charla_6/public/doc/img/hateoas-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/hateoas-2.png -------------------------------------------------------------------------------- /charla_6/public/doc/img/json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/json.png -------------------------------------------------------------------------------- /charla_6/public/doc/img/patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/patch.png -------------------------------------------------------------------------------- /charla_6/public/doc/img/post-put.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/post-put.png -------------------------------------------------------------------------------- /charla_6/public/doc/img/simplified-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/simplified-api.png -------------------------------------------------------------------------------- /charla_6/public/doc/img/standard-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/img/standard-api.png -------------------------------------------------------------------------------- /charla_6/public/doc/restful-apis-public.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/public/doc/restful-apis-public.pdf -------------------------------------------------------------------------------- /charla_6/public/doc/server.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | python2 -m SimpleHTTPServer 8001 -------------------------------------------------------------------------------- /charla_6/restful-apis.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/charla_6/restful-apis.tar.gz -------------------------------------------------------------------------------- /docs/Dossier-patrocinio.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/docs/Dossier-patrocinio.pdf -------------------------------------------------------------------------------- /docs/codigodeconducta.md: -------------------------------------------------------------------------------- 1 | ## Código de conducta 2 | Requerimos que todos los asistentes, ponentes, patrocinadores y voluntarios de nuestra conferencia estén de acuerdo con el siguiente código de conducta. 3 | La organización se encargará de que se cumpla durante el evento, esperamos la colaboración de todos los participantes para ayudar a construir un entorno seguro para todo el mundo. 4 | 5 | ### La versión rápida 6 | Queremos que esta conferencia sea una experiencia libre de acoso para todo el mundo sin importar su género, su identidad o expresión de género, edad, orientación sexual, discapacidad, aspecto físico, raza o religión. No toleraremos el acoso de ningún tipo a ningún participante. 7 | El lenguaje o las imágenes sexuales no son apropiadas para el evento, incluyendo las charlas, Twitter y cualquier otro medio de comunicación. 8 | 9 | Los participantes que violen estas reglas podrán ser sancionados o expulsados de la conferencia a discreción de los organizadores 10 | 11 | ### La versión no tan rápida 12 | Incluímos como acoso los comentarios verbales ofensivos relacionados con el género, la identidad o expresión de género, edad, orientación sexual, discapacidad, apariencia física, raza, religión, imágenes sexuales en espacios públicos, intimidación deliberada, acecho, persecución, el acoso con fotografías o vídeos, la interrupción sostenida de charlas u otros eventos, el contacto físico inapropiado y la atención sexual indeseada. 13 | 14 | Los patrocinadores también se encuentran sujetos a esta política. En concreto, los patrocindores no deben usar imágenes, actividades u otro material sexualizado. El personal (incluyendo los voluntarios) no debe utilizar ropa/uniformes/disfraces sexualizados, o crear de ninguna otra forma un entorno sexualizado. 15 | 16 | Si un participante tiene un comportamiento de acoso, los organizadores de la conferencia podrán tomar cualquier acción que consideren apropiada, incluyento advertir al infractor o su expulsión de la conferencia. 17 | Si estás siendo acosado, ves a alguien que lo está siendo o tienes alguna otra preocupación, por favor contacta con algún miembro de la organización inmediatamente. 18 | Los miembros de la organización estarán encantados de ayudar a los participantes a contactar con la seguridad del sitio o la policía local, proveer escolta o asistir de otra manera para ayudar a quienes están siendo acosados a sentirse seguros durante la conferencia. 19 | Valoramos tu asistencia. Esperamos que los participantes sigan estas reglas durante la conferencia. 20 | 21 | Source and credit: http://wtm.gdgmadrid.es/code_of_conduct.html 22 | 23 | Original source and credit: http://2012.jsconf.us/#/about & The Ada Initiative 24 | 25 | Please help by translating or improving: http://github.com/leftlogic/confcodeofconduct.com 26 | 27 | This work is licensed under a Creative Commons Attribution 3.0 Unported License 28 | -------------------------------------------------------------------------------- /docs/inventario_cacharrada.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/docs/inventario_cacharrada.ods -------------------------------------------------------------------------------- /hackathon_1/Arduino para programadores (Hackathon IOT 2016).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/hackathon_1/Arduino para programadores (Hackathon IOT 2016).pdf -------------------------------------------------------------------------------- /hackathon_1/Sensores_pi.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/hackathon_1/Sensores_pi.odp -------------------------------------------------------------------------------- /img/logo-labs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/logo-labs.png -------------------------------------------------------------------------------- /img/partners/agilegalicia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/agilegalicia.jpg -------------------------------------------------------------------------------- /img/partners/boundless.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/boundless.png -------------------------------------------------------------------------------- /img/partners/gpul.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/gpul.png -------------------------------------------------------------------------------- /img/partners/icarto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/icarto.jpg -------------------------------------------------------------------------------- /img/partners/prefapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/prefapp.png -------------------------------------------------------------------------------- /img/partners/setpay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/setpay.png -------------------------------------------------------------------------------- /img/partners/trabe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gpul-labs/roadmap/adfe7a8cef948bbc182166231b73cb5a148172d1/img/partners/trabe.png --------------------------------------------------------------------------------