Este documento introduce el lenguaje de programación Go. Go es un lenguaje compilado pero con compilaciones muy rápidas, fuertemente tipado y con comprobaciones estrictas en tiempo de compilación. Go fue lanzado en 2012 y ofrece ventajas como velocidad de ejecución, concurrencia y facilidad de despliegue. El documento discute las características y ventajas de Go para el desarrollo de software.
Este documento presenta una introducción al lenguaje de programación C. Explica conceptos básicos como la estructura de un programa y función en C, el preprocesador de C y sus directivas como #define, #include y #if. También cubre temas como la lectura de datos desde la consola usando argc y argv, el uso de malloc para reservar memoria dinámica, y free para liberarla.
Este documento presenta un resumen de tres oraciones del taller de Python impartido por Carlos Mauro Cárdenas Fernández. Explica que Python es un lenguaje de programación gratuito, de código abierto y multiplataforma. Además, destaca algunas características del lenguaje como su sintaxis sencilla y su amplia biblioteca estándar. Finalmente, resume los diferentes temas que se abordarán en el taller como Python básico, interfaces gráficas y el uso de librerías como NumPy.
Esta es la presentación utilizada en curso de introducción a Python para alumnos de Ingeniería, se asume que el lector tiene ya algo de experiencia en programación.
Los autores compararon el rendimiento de Python frente a C en diversas tareas como multiplicar números, procesar grandes cantidades de datos y manipular matrices. Concluyeron que C es más rápido que Python cuando se aprovechan al máximo las capacidades del procesador y se minimiza el uso de memoria dinámica. Sin embargo, Python puede ser tan rápido como C si se optimizan los algoritmos para tales tareas y no se fuerza aprovechar al máximo el hardware. La optimización prematura no siempre justifica el mayor esfuerzo de programación en C.
Este documento presenta una introducción a Python 3. Explica que Python es un lenguaje de programación interpretado, de alto nivel y orientado a objetos. Resume la historia de Python y sus características principales. Luego, introduce conceptos básicos como variables, tipos de datos, colecciones de datos, operadores y estructuras de control. Finalmente, explica temas más avanzados como funciones, excepciones, programación orientada a objetos y manejo de archivos.
El documento explica los bucles for e while en Python. For se usa para iterar sobre elementos de una secuencia como una lista, mientras que while repite instrucciones mientras una condición sea verdadera. Incluye ejemplos como imprimir elementos y longitud de una lista usando for, e iterar números del 1 al 3 y pedir un número positivo usando while.
El documento resume una presentación sobre la introducción a Python en 45 minutos. Explica que Python fue creado por Guido van Rossum en 1990 y destaca que es un lenguaje de programación amigable, flexible, poderoso y embebible. También define conceptos básicos como tipos de datos, operadores, estructuras de control, funciones y programación orientada a objetos.
Este documento presenta una serie de ejercicios de programación en Python para evaluar la comprensión de los fundamentos del lenguaje. Los ejercicios incluyen cálculos, manipulación de cadenas, listas, diccionarios, funciones y más. Se pide al estudiante que complete cada tarea usando los métodos especificados como imprimir resultados, dividir cadenas, acceder a elementos anidados, crear funciones y más.
Este documento presenta una introducción al lenguaje de programación C. Explica conceptos básicos como la estructura de un programa y función en C, el preprocesador de C y sus directivas como #define, #include y #if. También cubre temas como la lectura de datos desde la consola usando argc y argv, el uso de malloc para reservar memoria dinámica, y free para liberarla.
Este documento presenta un resumen de tres oraciones del taller de Python impartido por Carlos Mauro Cárdenas Fernández. Explica que Python es un lenguaje de programación gratuito, de código abierto y multiplataforma. Además, destaca algunas características del lenguaje como su sintaxis sencilla y su amplia biblioteca estándar. Finalmente, resume los diferentes temas que se abordarán en el taller como Python básico, interfaces gráficas y el uso de librerías como NumPy.
Esta es la presentación utilizada en curso de introducción a Python para alumnos de Ingeniería, se asume que el lector tiene ya algo de experiencia en programación.
Los autores compararon el rendimiento de Python frente a C en diversas tareas como multiplicar números, procesar grandes cantidades de datos y manipular matrices. Concluyeron que C es más rápido que Python cuando se aprovechan al máximo las capacidades del procesador y se minimiza el uso de memoria dinámica. Sin embargo, Python puede ser tan rápido como C si se optimizan los algoritmos para tales tareas y no se fuerza aprovechar al máximo el hardware. La optimización prematura no siempre justifica el mayor esfuerzo de programación en C.
Este documento presenta una introducción a Python 3. Explica que Python es un lenguaje de programación interpretado, de alto nivel y orientado a objetos. Resume la historia de Python y sus características principales. Luego, introduce conceptos básicos como variables, tipos de datos, colecciones de datos, operadores y estructuras de control. Finalmente, explica temas más avanzados como funciones, excepciones, programación orientada a objetos y manejo de archivos.
El documento explica los bucles for e while en Python. For se usa para iterar sobre elementos de una secuencia como una lista, mientras que while repite instrucciones mientras una condición sea verdadera. Incluye ejemplos como imprimir elementos y longitud de una lista usando for, e iterar números del 1 al 3 y pedir un número positivo usando while.
El documento resume una presentación sobre la introducción a Python en 45 minutos. Explica que Python fue creado por Guido van Rossum en 1990 y destaca que es un lenguaje de programación amigable, flexible, poderoso y embebible. También define conceptos básicos como tipos de datos, operadores, estructuras de control, funciones y programación orientada a objetos.
Este documento presenta una serie de ejercicios de programación en Python para evaluar la comprensión de los fundamentos del lenguaje. Los ejercicios incluyen cálculos, manipulación de cadenas, listas, diccionarios, funciones y más. Se pide al estudiante que complete cada tarea usando los métodos especificados como imprimir resultados, dividir cadenas, acceder a elementos anidados, crear funciones y más.
Ocho cosas que debes saber de JavaScriptDavid Ballén
Este documento resume 8 cosas importantes sobre JavaScript: 1) la coerción y sus usos, 2) los operadores bit a bit y alternativas más seguras, 3) el hoisting de variables y funciones, 4) los scopes y buenas prácticas, 5) las funciones bind, call y apply, 6) el prototype y la herencia, 7) que JavaScript usa UCS-2 para caracteres, y 8) que los puntos y comas son opcionales pero su uso evita errores.
El documento explica el uso de hilos en programación concurrente, mencionando que los hilos permiten explotar la concurrencia al permitir que varias tareas se ejecuten simultáneamente, ya sea de forma secuencial o en paralelo. También describe problemas comunes al usar hilos como condiciones de carrera y bloqueos mortales, los cuales ocurren cuando los hilos comparten recursos de forma no atómica y el resultado depende del orden de ejecución.
Python es un lenguaje de programación dinámico e interpretado que ofrece tipado dinámico, fuerte tipado, flexibilidad y portabilidad. Sus principales características incluyen una sintaxis limpia y legible similar al pseudocódigo, una amplia biblioteca estándar y ser multiplataforma. Python se puede utilizar para el desarrollo web, bases de datos, software, juegos, bioinformática, física y educación.
El documento habla sobre los conceptos básicos del lenguaje de programación Python. Explica que las variables deben empezar con letras no numéricas y pueden contener letras, números y guiones bajos. También menciona los tipos de datos como números, cadenas, listas y diccionarios, y cómo se pueden manipular y operar con ellos. Finalmente, introduce conceptos como condicionales if/else y bucles para controlar el flujo del programa.
Este documento resume los conceptos fundamentales de la minería de secuencias de datos. Explica que una secuencia de datos está compuesta por una serie de instancias que llegan de forma continua y que pueden presentar cambios en su distribución a lo largo del tiempo. Describe los requisitos para el aprendizaje sobre este tipo de datos, como limitar el uso de memoria y procesar los datos en tiempo real. Finalmente, introduce los conceptos de cambio de concepto y datos evolutivos frente a los estáticos.
El documento describe las funciones de C para manipular cadenas, memoria y archivos. Incluye funciones para copiar, comparar y buscar en cadenas de memoria, así como funciones matemáticas, de E/S y para manipular archivos.
Historia de los buffer overflows por Juan SaccoJuan Sacco
Este documento resume la historia de los buffer overflows desde sus comienzos en la década de 1990 hasta las defensas actuales como ASLR y canarios de pila. A pesar de décadas de intentos por mitigarlos, los buffer overflows siguen siendo una amenaza debido a factores culturales como la priorización de la velocidad sobre la seguridad en el desarrollo de software. El documento concluye sugiriendo que una mayor capacitación y cambios en los procesos de desarrollo podrían ayudar a prevenir este tipo de vulnerabilidades
Este documento trata sobre programación orientada a objetos y programación en Python. Explica conceptos clave de POO como abstracción, modularidad, encapsulación y herencia. También cubre temas de programación en Python como literales, funciones, palabras reservadas, operadores, identificadores y estructuras de control de flujo como if/else, for y while.
Este documento describe las funciones y constantes utilizadas para manipular cadenas de caracteres, realizar operaciones matemáticas, trabajar con archivos y flujos de entrada/salida en C. Define funciones para copiar, comparar y buscar cadenas, convertir números, calcular funciones trigonométricas, logarítmicas y exponenciales, dividir números y manipular archivos y flujos.
Este documento describe funciones de archivo en PHP como fopen(), fclose(), fread(), y fwrite() para abrir, cerrar, leer y escribir archivos. También describe funciones como chdir() para cambiar el directorio de trabajo, mkdir() y rmdir() para crear y eliminar directorios, respectivamente. Explica cómo indicar la ubicación y nombre de un archivo al abrirlo y el nombre de un directorio al crearlo.
El documento describe diferentes variantes de bucles for en PHP. Explica que el bucle for repite una serie de instrucciones mientras una variable numérica se mantenga dentro de un intervalo especificado. Luego detalla la sintaxis básica del bucle for y algunas variaciones como omitir el parámetro hasta, ejecutar instrucciones a través del tercer parámetro, y usar una sintaxis alternativa con dos puntos y endfor en lugar de llaves. Finalmente, propone dos ejercicios para practicar el uso de bucles for y anidados.
El documento describe un programa que automatiza el juego de las Torres de Hanoi utilizando Bash y C. Explica las reglas del juego y que el objetivo es transferir discos de un poste a otro en la menor cantidad de movimientos posible siguiendo las reglas. Luego detalla cómo se programó el juego recursivamente en C y cómo Bash automatiza ejecutar repeticiones del juego variando el número de discos y guardando los resultados.
Este documento describe la simulación de una memoria mediante el uso de cursores. Explica que un cursor es un entero que apunta a una casilla de un arreglo para simular un puntero. Detalla cómo crear y eliminar nodos en una lista enlazada simulada usando cursores para apuntar a la siguiente ubicación de memoria. Finalmente, discute las ventajas de tener control sobre la asignación de memoria, pero también las desventajas de limitar el uso de memoria a lo asignado en tiempo de compilación.
El documento introduce el lenguaje de programación Go. Explica que Go ofrece una compilación rápida, ejecución eficiente y soporte para concurrencia. Describe cómo instalar Go y ejecutar programas simples en Go, incluyendo un ejemplo de programa Hola Mundo. Resalta características clave de Go como tipos, funciones, canales y rutinas.
La habilidad más importante que debería tener un programador es la capacidad de resolver problemas de manera lógica y sistemática. Un buen programador puede analizar un problema de forma clara y desarrollar una solución de manera ordenada y metódica. Otras habilidades importantes incluyen la capacidad de comunicarse efectivamente, trabajar en equipo, aprender constantemente y tener una actitud de mejora continua.
Erlang/OTP - Altenwald - CodeMotion Madrid 2013Manuel Rubio
Erlang/OTP: Un Mundo Concurrente, charla dada el 19 de octubre de 2013 a las 15:15h en el Track Programming de CodeMotion 2013 de Madrid. La charla hace un repaso de la base del Lenguaje Erlang, el framework OTP y las ventajas que ofrece su plataforma.
http://altenwald.org/2013/10/21/codemotion-2013/
Los REPLs (entornos interactivos de programación) permiten escribir código y obtener resultados de forma inmediata, lo que los hace ideales para probar ideas y depurar programas de manera rápida. Existen REPLs para muchos lenguajes como Python, Ruby, Java y más. Los REPLs han existido desde los años 60 y se usan comúnmente hoy en día para aprender programación de manera exploratoria.
Typescript está de moda. Un lenguaje fuertemente tipado, con objetos basados en clases, que viene a corregir los problemas históricos de javascript con el apoyo de Microsoft y Angular.
Por otro lado, Dart es un lenguaje desarrollado por Google como alternativa a javascript, que viene a cubrir también los problemas históricos de javascript.
¿Es Dart una alternativa real a Typescript?
En esta charla vamos a ver una comparativa "face to face" entre los 2 lenguajes, basada en ejemplos. Características, sintaxis, performance, ecosistema,...
¿Llegaremos a alguna conclusión?
El documento describe los conceptos básicos de programación en shell, incluyendo la creación de scripts, variables, líneas de comandos, salida de programas, operaciones aritméticas, condicionales, y bucles. Se proporcionan ejemplos de código shell simple y seis ejercicios para practicar estos conceptos.
El documento presenta Madagascar, un software de código abierto para el análisis multidimensional de datos geofísicos. Describe las características del entorno Madagascar, incluyendo módulos en C y flujos de procesamiento en Python, lo que permite ejecutar experimentos de manera reproducible. También explica cómo instalar Madagascar y realizar operaciones básicas como generar señales, agregar ruido, filtrar y visualizar espectros.
El documento compara la iteración y recursión para verificar palíndromos, explicando que la iteración permite verificar múltiples textos mientras que la recursión llama a sí misma la función. También discute la complejidad algorítmica de verificar palíndromos y presenta código en C++ para implementar verificación palíndromo iterativa y recursiva.
Este documento presenta una referencia rápida de conceptos básicos de JavaScript como declaración de funciones, operadores matemáticos y lógicos, condicionales, variables, repetición, y una biblioteca simplificada. También incluye enlaces a documentación adicional sobre el lenguaje.
Ocho cosas que debes saber de JavaScriptDavid Ballén
Este documento resume 8 cosas importantes sobre JavaScript: 1) la coerción y sus usos, 2) los operadores bit a bit y alternativas más seguras, 3) el hoisting de variables y funciones, 4) los scopes y buenas prácticas, 5) las funciones bind, call y apply, 6) el prototype y la herencia, 7) que JavaScript usa UCS-2 para caracteres, y 8) que los puntos y comas son opcionales pero su uso evita errores.
El documento explica el uso de hilos en programación concurrente, mencionando que los hilos permiten explotar la concurrencia al permitir que varias tareas se ejecuten simultáneamente, ya sea de forma secuencial o en paralelo. También describe problemas comunes al usar hilos como condiciones de carrera y bloqueos mortales, los cuales ocurren cuando los hilos comparten recursos de forma no atómica y el resultado depende del orden de ejecución.
Python es un lenguaje de programación dinámico e interpretado que ofrece tipado dinámico, fuerte tipado, flexibilidad y portabilidad. Sus principales características incluyen una sintaxis limpia y legible similar al pseudocódigo, una amplia biblioteca estándar y ser multiplataforma. Python se puede utilizar para el desarrollo web, bases de datos, software, juegos, bioinformática, física y educación.
El documento habla sobre los conceptos básicos del lenguaje de programación Python. Explica que las variables deben empezar con letras no numéricas y pueden contener letras, números y guiones bajos. También menciona los tipos de datos como números, cadenas, listas y diccionarios, y cómo se pueden manipular y operar con ellos. Finalmente, introduce conceptos como condicionales if/else y bucles para controlar el flujo del programa.
Este documento resume los conceptos fundamentales de la minería de secuencias de datos. Explica que una secuencia de datos está compuesta por una serie de instancias que llegan de forma continua y que pueden presentar cambios en su distribución a lo largo del tiempo. Describe los requisitos para el aprendizaje sobre este tipo de datos, como limitar el uso de memoria y procesar los datos en tiempo real. Finalmente, introduce los conceptos de cambio de concepto y datos evolutivos frente a los estáticos.
El documento describe las funciones de C para manipular cadenas, memoria y archivos. Incluye funciones para copiar, comparar y buscar en cadenas de memoria, así como funciones matemáticas, de E/S y para manipular archivos.
Historia de los buffer overflows por Juan SaccoJuan Sacco
Este documento resume la historia de los buffer overflows desde sus comienzos en la década de 1990 hasta las defensas actuales como ASLR y canarios de pila. A pesar de décadas de intentos por mitigarlos, los buffer overflows siguen siendo una amenaza debido a factores culturales como la priorización de la velocidad sobre la seguridad en el desarrollo de software. El documento concluye sugiriendo que una mayor capacitación y cambios en los procesos de desarrollo podrían ayudar a prevenir este tipo de vulnerabilidades
Este documento trata sobre programación orientada a objetos y programación en Python. Explica conceptos clave de POO como abstracción, modularidad, encapsulación y herencia. También cubre temas de programación en Python como literales, funciones, palabras reservadas, operadores, identificadores y estructuras de control de flujo como if/else, for y while.
Este documento describe las funciones y constantes utilizadas para manipular cadenas de caracteres, realizar operaciones matemáticas, trabajar con archivos y flujos de entrada/salida en C. Define funciones para copiar, comparar y buscar cadenas, convertir números, calcular funciones trigonométricas, logarítmicas y exponenciales, dividir números y manipular archivos y flujos.
Este documento describe funciones de archivo en PHP como fopen(), fclose(), fread(), y fwrite() para abrir, cerrar, leer y escribir archivos. También describe funciones como chdir() para cambiar el directorio de trabajo, mkdir() y rmdir() para crear y eliminar directorios, respectivamente. Explica cómo indicar la ubicación y nombre de un archivo al abrirlo y el nombre de un directorio al crearlo.
El documento describe diferentes variantes de bucles for en PHP. Explica que el bucle for repite una serie de instrucciones mientras una variable numérica se mantenga dentro de un intervalo especificado. Luego detalla la sintaxis básica del bucle for y algunas variaciones como omitir el parámetro hasta, ejecutar instrucciones a través del tercer parámetro, y usar una sintaxis alternativa con dos puntos y endfor en lugar de llaves. Finalmente, propone dos ejercicios para practicar el uso de bucles for y anidados.
El documento describe un programa que automatiza el juego de las Torres de Hanoi utilizando Bash y C. Explica las reglas del juego y que el objetivo es transferir discos de un poste a otro en la menor cantidad de movimientos posible siguiendo las reglas. Luego detalla cómo se programó el juego recursivamente en C y cómo Bash automatiza ejecutar repeticiones del juego variando el número de discos y guardando los resultados.
Este documento describe la simulación de una memoria mediante el uso de cursores. Explica que un cursor es un entero que apunta a una casilla de un arreglo para simular un puntero. Detalla cómo crear y eliminar nodos en una lista enlazada simulada usando cursores para apuntar a la siguiente ubicación de memoria. Finalmente, discute las ventajas de tener control sobre la asignación de memoria, pero también las desventajas de limitar el uso de memoria a lo asignado en tiempo de compilación.
El documento introduce el lenguaje de programación Go. Explica que Go ofrece una compilación rápida, ejecución eficiente y soporte para concurrencia. Describe cómo instalar Go y ejecutar programas simples en Go, incluyendo un ejemplo de programa Hola Mundo. Resalta características clave de Go como tipos, funciones, canales y rutinas.
La habilidad más importante que debería tener un programador es la capacidad de resolver problemas de manera lógica y sistemática. Un buen programador puede analizar un problema de forma clara y desarrollar una solución de manera ordenada y metódica. Otras habilidades importantes incluyen la capacidad de comunicarse efectivamente, trabajar en equipo, aprender constantemente y tener una actitud de mejora continua.
Erlang/OTP - Altenwald - CodeMotion Madrid 2013Manuel Rubio
Erlang/OTP: Un Mundo Concurrente, charla dada el 19 de octubre de 2013 a las 15:15h en el Track Programming de CodeMotion 2013 de Madrid. La charla hace un repaso de la base del Lenguaje Erlang, el framework OTP y las ventajas que ofrece su plataforma.
http://altenwald.org/2013/10/21/codemotion-2013/
Los REPLs (entornos interactivos de programación) permiten escribir código y obtener resultados de forma inmediata, lo que los hace ideales para probar ideas y depurar programas de manera rápida. Existen REPLs para muchos lenguajes como Python, Ruby, Java y más. Los REPLs han existido desde los años 60 y se usan comúnmente hoy en día para aprender programación de manera exploratoria.
Typescript está de moda. Un lenguaje fuertemente tipado, con objetos basados en clases, que viene a corregir los problemas históricos de javascript con el apoyo de Microsoft y Angular.
Por otro lado, Dart es un lenguaje desarrollado por Google como alternativa a javascript, que viene a cubrir también los problemas históricos de javascript.
¿Es Dart una alternativa real a Typescript?
En esta charla vamos a ver una comparativa "face to face" entre los 2 lenguajes, basada en ejemplos. Características, sintaxis, performance, ecosistema,...
¿Llegaremos a alguna conclusión?
El documento describe los conceptos básicos de programación en shell, incluyendo la creación de scripts, variables, líneas de comandos, salida de programas, operaciones aritméticas, condicionales, y bucles. Se proporcionan ejemplos de código shell simple y seis ejercicios para practicar estos conceptos.
El documento presenta Madagascar, un software de código abierto para el análisis multidimensional de datos geofísicos. Describe las características del entorno Madagascar, incluyendo módulos en C y flujos de procesamiento en Python, lo que permite ejecutar experimentos de manera reproducible. También explica cómo instalar Madagascar y realizar operaciones básicas como generar señales, agregar ruido, filtrar y visualizar espectros.
El documento compara la iteración y recursión para verificar palíndromos, explicando que la iteración permite verificar múltiples textos mientras que la recursión llama a sí misma la función. También discute la complejidad algorítmica de verificar palíndromos y presenta código en C++ para implementar verificación palíndromo iterativa y recursiva.
Este documento presenta una referencia rápida de conceptos básicos de JavaScript como declaración de funciones, operadores matemáticos y lógicos, condicionales, variables, repetición, y una biblioteca simplificada. También incluye enlaces a documentación adicional sobre el lenguaje.
Este documento presenta una introducción al lenguaje de programación Python, cubriendo temas como ejecutar Python en la consola, imprimir mensajes, realizar operaciones matemáticas, declarar variables, usar bloques con condicionales y bucles, definir funciones y clases, y utilizar diferentes tipos de datos como cadenas, tuplas, listas y diccionarios. También introduce los módulos os y os.path para realizar operaciones del sistema operativo, y menciona brevemente la programación gráfica y de red con Python.
El documento presenta una introducción a gráficos especiales en R. Explica cómo crear scripts, instalar paquetes y generar diferentes tipos de gráficos como polares, de eventos y dibujos. Incluye código para crear un gráfico polar que grafica datos simulados con tres grupos diferentes.
Chuleta de lenguaje C para principiantesAbrirllave
Este documento presenta una guía básica de lenguaje C, incluyendo la sintaxis de un programa simple de "Hola Mundo", tipos de datos, operadores, estructuras de control, funciones y bibliotecas estándar. Explica conceptos como variables, constantes, tipos enumerados, comentarios, directivas del preprocesador e identificadores. También cubre temas como instrucciones condicionales y repetitivas, especificadores de formato para entrada/salida, y las reglas sintácticas básicas de C.
Este documento describe las principales librerías de la biblioteca estándar de C++, incluyendo stdio.h, stdlib.h, string.h y time.h, y sus funciones clave para entrada/salida, conversión de tipos, manipulación de cadenas y manejo de fecha y hora. También cubre librerías como assert.h, ctype.h, errno.h, limits.h y math.h y sus macros y funciones para diagnóstico, comprobación de tipos, manejo de errores y operaciones matemáticas.
Este documento introduce la estructura de árbol en Flexsim, la cual almacena toda la información del modelo. Los nodos son los bloques de construcción del árbol y pueden contener objetos, datos u otros nodos. El documento también explica conceptos como variables, operadores lógicos y matemáticos, y cómo actualizar atributos de objetos usando comandos de Flexsim.
Este documento presenta una comparación entre Go y Python, destacando las similitudes y diferencias en sus características como asignación de variables, condicionales, slices, maps, loops, interfaces, contextos, generadores, canales y concurrencia, y pruebas unitarias. Explica cómo Go maneja conceptos como GOPATH, imports, acceso, y sincronización de una manera diferente a Python. El objetivo es brindar una introducción a Go para desarrolladores con experiencia en Python.
El documento habla sobre la verificación de palíndromos usando iteración y recursión. Con iteración se puede verificar más de un palíndromo a la vez, mientras que con recursión la función se llama a sí misma para leer el texto de adelante hacia atrás y determinar si es palíndromo. También discute la complejidad algorítmica de verificar palíndromos y incluye código de ejemplo para hacerlo de forma iterativa y recursiva.
Clase8 3 ejemplo analisis lexico-sintactico miniugbInfomania pro
Este documento describe un prototipo de analizador léxico y sintáctico desarrollado en C++. Explica los objetivos del análisis léxico y sintáctico y presenta el código fuente de las clases Lexico y Sintactico que implementan un analizador léxico y sintáctico respectivamente. El analizador léxico lee tokens de un archivo de entrada y el analizador sintáctico verifica que la secuencia de tokens cumple con la gramática del lenguaje mediante la construcción de un árbol de anális
El documento explica las funciones var, let y const en JavaScript y sus diferencias. También describe métodos para crear funciones como función, expresión y constructor de objeto. Finalmente, presenta ejemplos de funciones para calcular el área y perímetro de cuadrados, triángulos y círculos.
Catalogo Refrigeracion Miele Distribuidor Oficial Amado Salvador ValenciaAMADO SALVADOR
Descubre el catálogo general de la gama de productos de refrigeración del fabricante de electrodomésticos Miele, presentado por Amado Salvador distribuidor oficial Miele en Valencia. Como distribuidor oficial de electrodomésticos Miele, Amado Salvador ofrece una amplia selección de refrigeradores, congeladores y soluciones de refrigeración de alta calidad, resistencia y diseño superior de esta marca.
La gama de productos de Miele se caracteriza por su innovación tecnológica y eficiencia energética, garantizando que cada electrodoméstico no solo cumpla con las expectativas, sino que las supere. Los refrigeradores Miele están diseñados para ofrecer un rendimiento óptimo y una conservación perfecta de los alimentos, con características avanzadas como la tecnología de enfriamiento Dynamic Cooling, sistemas de almacenamiento flexible y acabados premium.
En este catálogo, encontrarás detalles sobre los distintos modelos de refrigeradores y congeladores Miele, incluyendo sus especificaciones técnicas, características destacadas y beneficios para el usuario. Amado Salvador, como distribuidor oficial de electrodomésticos Miele, garantiza que todos los productos cumplen con los más altos estándares de calidad y durabilidad.
Explora el catálogo completo y encuentra el refrigerador Miele perfecto para tu hogar con Amado Salvador, el distribuidor oficial de electrodomésticos Miele.
Catalogo Cajas Fuertes BTV Amado Salvador Distribuidor OficialAMADO SALVADOR
Explora el catálogo completo de cajas fuertes BTV, disponible a través de Amado Salvador, distribuidor oficial de BTV. Este catálogo presenta una amplia variedad de cajas fuertes, cada una diseñada con la más alta calidad para ofrecer la máxima seguridad y satisfacer las diversas necesidades de protección de nuestros clientes.
En Amado Salvador, como distribuidor oficial de BTV, ofrecemos productos que destacan por su innovación, durabilidad y robustez. Las cajas fuertes BTV son reconocidas por su eficiencia en la protección contra robos, incendios y otros riesgos, lo que las convierte en una opción ideal tanto para uso doméstico como comercial.
Amado Salvador, distribuidor oficial BTV, asegura que cada producto cumpla con los más estrictos estándares de calidad y seguridad. Al adquirir una caja fuerte a través de Amado Salvador, distribuidor oficial BTV, los clientes pueden tener la tranquilidad de que están obteniendo una solución confiable y duradera para la protección de sus pertenencias.
Este catálogo incluye detalles técnicos, características y opciones de personalización de cada modelo de caja fuerte BTV. Desde cajas fuertes empotrables hasta modelos de alta seguridad, Amado Salvador, como distribuidor oficial de BTV, tiene la solución perfecta para cualquier necesidad de seguridad. No pierdas la oportunidad de conocer todos los beneficios y características de las cajas fuertes BTV y protege lo que más valoras con la calidad y seguridad que solo BTV y Amado Salvador, distribuidor oficial BTV, pueden ofrecerte.
KAWARU CONSULTING presenta el projecte amb l'objectiu de permetre als ciutadans realitzar tràmits administratius de manera telemàtica, des de qualsevol lloc i dispositiu, amb seguretat jurídica. Aquesta plataforma redueix els desplaçaments físics i el temps invertit en tràmits, ja que es pot fer tot en línia. A més, proporciona evidències de la correcta realització dels tràmits, garantint-ne la validesa davant d'un jutge si cal. Inicialment concebuda per al Ministeri de Justícia, la plataforma s'ha expandit per adaptar-se a diverses organitzacions i països, oferint una solució flexible i fàcil de desplegar.
3. Razones para usar un lenguaje de scripting
Velocidad de desarrollo.
Expresividad.
No hay necesidad de compilación.
Recolección de basura.
Abstracciones de alto nivel.
¿Despliegue?
4. Razones para usar un lenguaje compilado
Velocidad de ejecución.
Tipado estático.
Comprobaciones en tiempo de compilación.
¿Despliegue?
5. Y si...
Legible y claro.
Lenguaje compilado, pero de muy rápida compilación.
Comprobaciones estrictas en tiempo de compilación.
Fuertemente tipado.
Recolección de basura.
Facilidad de despliegue.
Y muchas otras particularidades inusuales en los lenguajes más populares, útiles
para el desarrollador.
7. Golang, un nuevo lenguaje
No ha habido grandes avances en lenguajes de programación... ¡en casi una
década!
PHP nació en el año 1995
Ruby también fue creado en 1995
Node.js...
8. Go te ayuda a desarrollar correctamente
Sintaxis concisa.
Diseñado para ser eficiente en tiempo de desarrollo.
Rápido en tiempo de ejecución.
Es un lenguaje concurrente, y con un buen soporte para paralelización.
Soporta tests y benchmarks de forma nativa.
9. Go te ayuda a desarrollar cómodamente
Soporta nativamente Unicode.
Recolector de basura.
Devolución de múltiples valores.
Las funciones son tipos de primer orden.
Elimina lo que muchos consideran necesario: objetos e interfaces. En su lugar,
presenta alternativas diferentes.
10. Go te obliga a programar bien
Comprobaciones muy estrictas en tiempo de compilación.
Comprobación estricta de tipos, no existen "tipos compatibles".
No existe el tipo "float".
Desde Go 1.0, no se garantiza el orden de iteración sobre mapas.
11. Go te insta a que tu código sea legible.
No existen excepciones, sólo errores excepcionales.
No se permiten imports o variables no usadas.
Uso de punteros sin aritmética de punteros.
Se prohiben expresiones que puedan resultar en código ilegible. Por ejemplo:
vr =vr+
a2
a+
13. Un ejemplo de C
it(((f)it)dul)(la)
n ***3(n)(obe)fot;
f
3
*3
f
(f)
*3( )
(f)it
*3(n)
**3(n)
(f)it
((f)it)
**3(n)(
)
((f)it)dul)
**3(n)(obe
***3(n)(obe
((f)it)dul)
(((f)it)dul)(
***3(n)(obe)
)
(((f)it)dul)(la)
***3(n)(obe)fot
it(((f)it)dul)(la)
n ***3(n)(obe)fot
- f
- 3
- i apitr
- s
one
- t afnto
- o
ucin
- tkn a itprmtr
aig n n aaee
- rtrigapitr
eunn
one
- t afnto
o
ucin
tkn adul prmtr
aig
obe aaee
rtrigapitr
eunn
one
t afnto
o
ucin
tkn afotprmtr
aig
la aaee
rtrigit
eunn n
StackOverflow(http://stackoverflow.com/questions/10758811/c-syntax-for-functions-returning-function-pointers)
14.
15. El mismo ejemplo en Go
fn (n)fn(la6)fn(la3)it
uc it ucfot4 ucfot2 n
vs
it(((f)it)dul)(la)
n ***3(n)(obe)fot
16. Un ejemplo de Java
pbi sai fnlSrn raFl(tigflnm){
ulc ttc ia tig edieSrn ieae
SrnBidrs =nwSrnBidr)
tigule b
e tigule(;
ty{
r
BfeeRae b =nwBfeeRae(e FlRae(ieae)
ufrdedr r
e ufrdedrnw ieedrflnm);
itra =0
n ed
;
ca[ bfe =nwca[04;
hr] ufr
e hr12]
wie - ! (ed=b.edbfe,0 bfe.egh)){
hl( 1 = ra
rra(ufr , ufrlnt)
s.pedbfe,0 ra)
bapn(ufr , ed;
}
b.ls(;
rcoe)
}cth(Oxeto e {
ac IEcpin )
Lge"TP,"edtem,e;
o.(HT" raSra" )
CitrimlgadeEcpine;
rtecs.oHnldxeto()
rtr nl;
eun ul
}
rtr s.otig)
eun btSrn(;
}
17. El mismo ejemplo en Go
dt,er: iui.edie"ie)
aa r = otlRaFl(fl"
Sin usar ioutil:
fn raFl(ieaesrn)(tig err {
uc edieflnm tig srn, ro)
bf: btsNwufrnl
u = ye.eBfe(i)
f er: o.pnflnm)
, r = sOe(ieae
i nl! er{
f i = r
rtr `,er
eun ` r
}
dfrfCoe)
ee .ls(
_ er=i.oybf f
, r
oCp(u, )
i nl! er{
f i = r
rtr `,er
eun ` r
}
rtr srn(u.ye()
eun tigbfBts)
}
18. Golang soporta Unicode totalmente
pcaemi
akg an
ipr "m"
mot ft
fn mi( {
uc an)
ಠ益ಠ, ಠ_ 東京事変 : ` р в т , f t P i t n ` и `
ಠ,
= Пие` m.rnl, мр
}
ಠ_ ಠ益ಠ, 東京事変)
ಠ(
Run
22. int y bool
it un,it,un8 it6 un1,it2 un3,it4 un6.
n, it n8 it, n1, it6 n3, it2 n6, it4
Desde Go 1.1, int es de 64 bits cuando se ejecuta en CPU de 64 bits.
Personalmente, me gusta más especificar siempre el tamaño.
vrxun3 =3
a
it2
O también:
x: un3()
= it23
Para booleanos: true, false y operadores a la C.
23. Ejemplos
Ejemplo incorrecto
fn mi( {
uc an)
vrxun3 =4
a
it2
2
vryun8=x
a
it
ftPit(yvl %.n,y
m.rnf" ae d" )
}
Run
¿Y ahora?
fn mi( {
uc an)
vrxun3 =4
a
it2
2
vryun =x
a
it
ftPit(yvl %.n,y
m.rnf" ae d" )
}
Run
24. Más ejemplos
fn mi( {
uc an)
x: tu
= re
i x= tu {
f
= re
ftPitn`eddr`
m.rnl(Vraeo)
}es {
le
ftPitn`as`
m.rnl(Flo)
}
}
Run
De otra forma:
fn mi( {
uc an)
sic {
wth
cs tu:
ae re
ftPitn`stu`
m.rnl(e re)
cs fle
ae as:
ftPitn`sfle)
m.rnl(e as`
dfut
eal:
ftPitn``
m.rnl(?)
}
}
Run
25. Otros tipos numéricos
No se define un tipo float. En su lugar, existen float32 y float64
vr(
a
xfot2=2
la3
mfot4=6032
la6
.2e3
)
Números complejos. Si, Go soporta números complejos: complex64 y complex128.
fn mi( {
uc an)
vrzcmlx2 =cpxPwmt.,-imt.i
a
ope18
ml.o(ahE 1*ahP)
ftPit(z=%.n,z
m.rnf"
f" )
}
Run
27. Array
Se puede declarar un array de cualquier tipo, nativo o no.
vr(
a
x[]n3
5it2
y[0[]nefc{
1]2itrae}
)
No son referencias, por lo que se copia la memoria al pasarlos a una función.
Recuerda: Go siempre pasa los parámetros por valor.
Recuerda: Go siempre inicializa todo a su zero-value.
28. Array
Nos podemos ahorrar escribir el tamaño usando "..." cuando se especifica un literal.
fn mi( {
uc an)
vrx[]n
a
3it
y: [.]la3{,2 4
= ..fot23 , }
ftPitnx y
m.rnl(, )
}
Run
¡Re-slicing!
fn mi( {
uc an)
x: [.]n{,2 3 4 5
= ..it1 , , , }
ftPitnx:] x2] x24)
m.rnl([3, [:, [:]
}
Dado que el tamaño se especifica en la declaración, son inmutables.
Run
29.
30. Array o slice, esa es la cuestión
Go proporciona un wrapper sobre los arrays inmutables, lo que llama slice.
vrx[it=mk(]n,3
a
]n
ae[it )
y: [it1 2 3
= ]n{, , }
vs
vrx[]n
a
3it
y: [.]n{,2 3
= ..it1 , }
Un slice es una referencia al array subyacente, por lo que siguen siendo inmutables.
Dado que son una referencia, su zero-value es nil.
Para crear un slice, se puede utilizar un literal, o bien utilizar la función make().
31. Slice
Utilizando make(), podemos especificar un tamaño y una capacidad inicial.
Tamaño: Número de elementos que el slice contiene actualmente.
Capacidad: tamaño del array subyacente.
x: mk(]la3,3 1)
= ae[fot2 , 0
Por defecto, la capacidad se supone igual al tamaño, por lo que no es necesario
indicarla.
Para añadir uno o varios elementos, se utiliza la función append:
x=apn(,2
pedx )
x=apn(,3 4 5
pedx , , )
32. Diferencia entre array y slice
Un slice también puede ser "re-sliced". Esto no cambia mas que el puntero hacia el
array, no copia memoria.
Ambos se comportan como se espera con las funciones len, cap y copy.
Pero además, un slice nos ofrece la posibilidad de añadir elementos, ampliando la
capacidad del array. Pista: realloc.
34. Mapas
Como un HashMap de Java, o un Hash de Ruby.
Mapea cualquier valor comparable a cualquier cosa.
vrmmpsrn]nefc{
a
a[tigitrae}
Aquí, es clásico utilizar interface{} del mismo modo que Object en Java.
Al igual que los array y slices, son iterables. ¡Pero ojo! NO se garantiza el orden.
Del mismo modo que los slices, su zero-value es nil.
fn mi( {
uc an)
m: mk(a[tig[it2
= aempsrn]]n3)
m`oa]=[it21 2
[hl`
]n3{, }
m`to]=[it23 4
[or`
]n3{, }
frky vle: rnem{
o e, au = ag
ftPitnky vle
m.rnl(e, au)
}
}
Run
35. Mapas
cnt(
os
CUI
HL
=1
KLCUI=13*CUI
IOHL
e
HL
MGCUI=16*CUI
EAHL
e
HL
)
fn mi( {
uc an)
mlnmtr: mk(a[tigit2
oooee = aempsrn]n3)
mlnmtr`uet]=4 *MGCUI
oooee[Cbr`
0
EAHL
ftPitnmlnmtr`uet] mlnmtr`odeg]
m.rnl(oooee[Cbr`, oooee[Zibr`)
}
Run
O podemos comprobar si existe un mapping.
fn mi( {
uc an)
mlnmtr: mpsrn]n3{Cbr` 4 *MGCUI
oooee = a[tigit2`uet: 0
EAHL}
i v o : mlnmtr`odeg] o {
f , k = oooee[Zibr`; k
ftPitnv
m.rnl()
}es {
le
ftPitn` UN CO`
m.rnl(Y
O OL)
}
}
Run
37. string
Los strings son inmutables.
vrvral srn ="aea
a aibe tig
cdn"
En el fondo, no es más que un []byte, por lo que puede contener cualquier
contenido arbitrario.
Como todos los tipos compuestos en Go, es iterable.
En Go no hay char, hay rune, que representan codepoints unicode.
Rune no es más que un alias de int32.
38. Operadores
Los _string_'s no son referencias. Recuerda: sólo slices y maps lo son.
Operaciones habituales a través de los paquetes string y unicode.
Literales con "cadena" o c d n .
aea
fn mi( {
uc an)
ftPitn`soeu srn`
m.rnl(Et snn tig)
ftPitn"soeor srn"
m.rnl(Et snto tig)
}
Run
Se puede iterar sobre ellos, rune a rune.
fn mi( {
uc an)
sr: `oa пие!
t = Hl, рвт`
fri r: rnesr{
o ,
= ag t
ftPit(sr%)'c" i r
m.rnf"t(d=%'n, , )
}
}
Run
43. Duck typing
"Si camina como un pato, nada como un pato y suena como un pato, es un pato."
tp Srne itrae{
ye tigr nefc
Srn( srn
tig) tig
}
Cualquier tipo que implemente ese método "de facto", puede ser utilizado como
un Stringer.
tp Vco []n3
ye etr 3it2
fn ( Vco)Srn( srn {
uc v etr tig) tig
rtr ftSrnf`=%,%,%),v0,v1,v2)
eun m.pit(v(d d d` [] [] []
}
fn mi( {
uc an)
x: Vco{,2 3
= etr1 , }
ftPitnx
m.rnl()
}
Run
44. Structs
Combinado con los zero-values, los literales de structs son muy prácticos.
tp rslTp src {
ye eutye tut
Ipesos un6 `sn"mrsin"
mrsin
it4 jo:ipesos`
Ves
iw
un6 `sn"iw"
it4 jo:ves`
Itrcin fot2`sn"neatosoiepy`
neatos la3 jo:itrcin,mtmt"
}
rt: rslTp{mrsin:m}
e = eutyeIpesosip
Cuidado: Los campos de structs que comienzan por mayúscula, se consideran
"public", y el resto, "private".
Además, como en el ejemplo, se pueden "anotar", para definir otras propiedades
como, por ejemplo, el nombre del campo cuando se convierta a JSON.
46. ¡Structs!
Aunque Golang no es un lenguaje orientado a objetos, pero aún así permite
"herencia múltiple", el llamado "embedding".
tp Aia src {
ye nml tut
Nmr srn
obe tig
}
tp Msoasrc {
ye act tut
Ahcal bo
cuhbe ol
}
tp Prosrc {
ye er tut
Aia
nml
Msoa
act
Rz TpRz
aa ioaa
}
Podemos invocar cualquier método definido sobre "Animal" sobre un objeto de
tipo Perro, así como acceder directamente a sus campos.
p: ProNmr:"ay,Ahcal =tu}
= er{obe Yk" cuhbe
re
47. Funciones
Como hemos visto, es posible escribir funciones que devuelvan varios parámetros.
No sólo es posible, sino que es ampliamente utilizado y se considera parte del "Gostyle".
Además, estos valores de retorno pueden tener opcionalmente un nombre.
fn pwxfot4 (2fot4 x fot4 {
uc o( la6) x la6, 3 la6)
x =x*x
2
x =x *x
3
2
rtr
eun
}
fn mi( {
uc an)
ftPitnpw2)
m.rnl(o()
}
Run
48. Funciones
Del mismo modo, se pueden declarar y asignar varias variables a la vez.
fn pwxfot4 (2 x fot4 eerr {
uc o( la6) x, 3 la6,
ro)
i x>1 {
f
0
rtr 0 0 ftErr(E vlrx% e dmsaogad" x
eun , , m.rof"l ao =f s eaid rne, )
}
rtr xx xxx nl
eun *, **, i
}
fn mi( {
uc an)
x y er: pw4
, , r = o()
i er! nl{
f r = i
ftPit(ERR %.n,er
m.rnf"RO: v" r)
}es {
le
ftPitnx y
m.rnl(, )
x y=y x
,
,
ftPitnx y
m.rnl(, )
}
}
Run
49. Closures
Una de las mejores características del lenguaje, es su definición de las funciones
como un tipo de dato más.
Además, las funciones "literales" son closures, de modo que capturan cualquier
variable que haya en su scope y pueden acceder a ella como si fuera propia.
fn Gnrtrxit fn( it{
uc eeao( n) uc) n
rtr fn( it{rtr x}
eun uc) n
eun
}
fn mi( {
uc an)
f: Gnrtr3
= eeao()
ftPitnf)
m.rnl(()
}
Run
50. Closures
Se pueden utilizar también para agrupar código, aunque no sea estrictamente
necesario, a veces queda más limpio.
adfxss: fn(ae prmsrn){
dIEit = ucnm, aa tig
vle o : ps[aa]
au, k = otprm
i o {
f k
mthnm]=bo.{$n:vle
ac[ae
snM`i` au}
}
}
adfxss`e` `e`
dIEit(sx, sx)
adfxss`sau` `sau`
dIEit(mtts, mtts)
adfxss`nlec_oe` `nlec`
dIEit(ifunezns, ifune)
adfxss`ye,`rpsltps)
dIEit(tp` pooa_ye`
adfxss`ai` `aeois)
dIEit(ctd, ctgre`
adfxss`oi` `omre`
dIEit(cmd, cmecs)
52. Defer
sau
tts
: htCin.tts)
= tpletSau(
rslJo : htCin.eut)
eutsn = tpletRsl(
i nl! htCin.ro( | 20! sau {
f i = tpletErr) | 0 = tts
htCin.ls(
tpletCoe)
rtr
eun
}
vrrsl [itrae}
a eut ]nefc{
i er: jo.nasa(eutsn &eut;nl! er{
f r = snUmrhlrslJo, rsl) i = r
htCin.ls(
tpletCoe)
rtr
eun
}
i !rsl[sces]{
f
eut`ucs`
htCin.ls(
tpletCoe)
rtr
eun
}
53. Defer
sau,rslJo,er: htCin.eut)
tts eutsn r = tpletRsl(
dfrhtCin.ls(
ee tpletCoe)
i nl! er| 20! sau {
f i = r | 0 = tts
rtr
eun
}
vrrsl [itrae}
a eut ]nefc{
i er: jo.nasa(eutsn &eut;nl! er{
f r = snUmrhlrslJo, rsl) i = r
rtr
eun
}
i !rsl[sces]{
f
eut`ucs`
rtr
eun
}
54. Concurrencia
Go provee de diversos mecanismos para manejar la concurrencia de forma
adecuada.
Sobre todo, haremos uso de go-routinas y canales.
La filosofía es "Share memory by communicating".
Es importante no confundir concurrencia con paralelismo.
Linux hasta la versión 2.0 no era paralelo, aunque si era concurrente.
El siguiente programa NO es paralelo, aunque sí concurrente.
fn mi( {
uc an)
c: mk(hnit
= aeca n)
g fn( {c< 1})
o uc)
(
g fn( {c< 2})
o uc)
(
x y: <c <c
,
= -, ftPitnx y
m.rnl(, )
}
Run
55. Un ejemplo real
fn (xc*aallxctr Ee( PrleFn){
uc ee PrleEeuo) xcf aalluc
c: mk(hnPrleRsos)
= aeca aallepne
cn,d : GtBon)
on b = eDCn(
g fn( {
o uc)
dfrfn( {
ee uc)
i r: rcvr) nl! r{
f
= eoe(; i =
er o : r(ro)
r, k = .err
i !k{
f o
er=ftErr(pg %" r
r
m.rof"k: v, )
}
c< PrleRsos{i,er
- aallepnenl r}
}
})
(
dfrcn.ls(
ee onCoe)
rsl,er: fd)
eut r = (b
c< PrleRsos{eut er
- aallepnersl, r}
})
(
ee.hnes=apn(xccanl,c
xccanl
pedee.hnes )
}
57. Entorno Go
run: Ejecutar un programa "sin compilarlo".
vet: Buscar "problemas", algo parecido a findbugs.
fix: Reescribir sentencias para utilizar APIs más "modernas", se utiliza al actualizar
Go a una nueva versión.
fmt: ¿Espacios o tabs? ¡Nunca más! Formatea con "go fmt".
pprof: ¿Donde pierde más tiempo mi programa? ¿Dónde consume más RAM?
doc: Generación automática de documentación.
test: Ejecutar los tests. También ejecuta benchmarks al pasarle el flag "-bench".
get: Descargar dependencias de un proyecto.
Flag "-race": Detector de condiciones de carrera, desde Go 1.1.
58. Deploy
En Go se recomienda colocar la URL en el import. De esta forma, "go get" puede
descargar automáticamente las dependencias y colocarlas en el $GOPATH.
ipr (
mot
lg`ihbcmchbseo`
o gtu.o/iu/elg
`ai.r/2mo
lbxogv/g`
)
Golang compila estáticamente las dependencias.
El resultado es un ELF (o .exe, o...) listo para ejecutar en cualquier máquina, sin
instalar nada más.
59. ¿Y esto se usa?
dl.google.com es un servidor Go.
Docker. Administrador de "containers" LXC.
Packer. Herramienta para crear imágenes de máquinas virtuales automáticamente.
Youtube. Liberó y utiliza Vitess, una herramienta Go para escalar MySQL.
10gen. El servicio de backups de MongoDB está escrito en GO.
Bitly. Han liberado NSQ, una plataforma de mensajería en tiempo real.
pool.ntp.org. Ya dispone de servidores hechos en Go.
Y muchos, muchos otros.
code.google.com/p/go-wiki/wiki/GoUsers(https://code.google.com/p/go-wiki/wiki/GoUsers)
60. Thank you
Antonio Nicolás Pina
Scalia
antonio@scalia.es (mailto:antonio@scalia.es)
http://scalia.es/ (http://scalia.es/)
@ANPez (http://twitter.com/ANPez)
@scalia_es (http://twitter.com/scalia_es)